> - 17 group/views.py
View File
@@ -5,10 +5,8 @@ from __future__ import division
5 5
 import os
6 6
 import random
7 7
 
8
-import shortuuid
9 8
 from curtail_uuid import CurtailUUID
10 9
 from django.conf import settings
11
-from django.core.files.storage import default_storage
12 10
 from django.db import connection, transaction
13 11
 from logit import logit
14 12
 from rest_framework import viewsets
@@ -32,6 +30,7 @@ from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_PHOTO_WATCHER_SET, GRO
32 30
 from utils.redis.rorder import get_lensman_order_record
33 31
 from utils.redis.rprice import get_lensman_price_fixed
34 32
 from utils.sql.raw import PAI2_HOME_API
33
+from utils.storage_utils import file_save
35 34
 from utils.thumbnail_utils import make_thumbnail
36 35
 from utils.time_utils import origin_expired_stamps
37 36
 from utils.url_utils import img_url, share_url
@@ -135,12 +134,7 @@ def group_update_api(request):
135 134
         group.group_desc = group_desc
136 135
     # 群组头像更新
137 136
     if group_avatar:
138
-        _, extension = os.path.splitext(group_avatar.name)
139
-        group_avatar_path = 'group/{uuid}_{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
140
-        if default_storage.exists(group_avatar_path):
141
-            default_storage.delete(group_avatar_path)
142
-        default_storage.save(group_avatar_path, group_avatar)
143
-        group.group_avatar = group_avatar_path
137
+        group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg')[0]
144 138
     group.save()
145 139
 
146 140
     # Redis 群组数据缓存更新
@@ -260,18 +254,10 @@ def flyimg_upload_api(request):
260 254
         return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
261 255
 
262 256
     if photo:
263
-        photo_path = 'fly/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=os.path.splitext(photo.name)[1] or 'jpeg')
257
+        photo_path, ext = file_save(photo, prefix='fly', ext='jpeg')
264 258
         photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
265 259
         photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
266 260
 
267
-        if default_storage.exists(photo_path):
268
-            default_storage.delete(photo_path)
269
-        default_storage.save(photo_path, photo)
270
-
271
-        # if default_storage.exists(photo_thumbnail_path):
272
-        #     default_storage.delete(photo_thumbnail_path)
273
-        # default_storage.save(photo_thumbnail_path, photo)
274
-
275 261
         # 群组照片缩略图生成
276 262
         # 双列: 540, 40-50K
277 263
         photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(

+ 3 - 12
photo/views.py

@@ -5,7 +5,6 @@ import os
5 5
 import shortuuid
6 6
 from curtail_uuid import CurtailUUID
7 7
 from django.conf import settings
8
-from django.core.files.storage import default_storage
9 8
 from django.db import transaction
10 9
 from django.shortcuts import render
11 10
 from django_q.tasks import async
@@ -24,6 +23,7 @@ from utils.redis.rgroup import get_group_info, set_group_info, set_group_users_i
24 23
 from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_USERS_DELETED_SET, GROUP_USERS_PASSED_SET,
25 24
                                GROUP_USERS_QUIT_SET, GROUP_USERS_REFUSED_SET, UUID_LIST)
26 25
 from utils.redis.ruuid import generate_uuids, update_uuids
26
+from utils.storage_utils import file_save
27 27
 from utils.thumbnail_utils import make_thumbnail
28 28
 from utils.watermark_utils import watermark_wrap
29 29
 
@@ -93,18 +93,9 @@ def upload_photo(request):
93 93
     except LensmanInfo.DoesNotExist:
94 94
         return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
95 95
 
96
-    # photo_id = curtailUUID(PhotosInfo, 'photo_id')
96
+    m_photo_path, ext = file_save(photo, prefix='photo', ext='jpeg')
97 97
 
98
-    _, extension = os.path.splitext(photo.name)
99
-    extension = extension or 'jpeg'
100
-
101
-    m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
102
-
103
-    if default_storage.exists(m_photo_path):
104
-        default_storage.delete(m_photo_path)
105
-    default_storage.save(m_photo_path, photo)
106
-
107
-    p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
98
+    p_photo_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
108 99
     watermark_wrap(
109 100
         os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
110 101
         settings.WATERMARK_LOGO,

+ 15 - 0
utils/storage_utils.py

@@ -0,0 +1,15 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import os
4
+
5
+import shortuuid
6
+from django.core.files.storage import default_storage
7
+
8
+
9
+def file_save(file_, prefix='img', ext='jpeg'):
10
+    ext = os.path.splitext(file_.name)[-1] or ext
11
+    path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
12
+    if default_storage.exists(path):
13
+        default_storage.delete(path)
14
+    default_storage.save(path, file_)
15
+    return path, ext

kodo - Gogs: Go Git Service

No Description

basic.html 8.8KB

    {% load staticfiles %} <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="format-detection" content="telephone=no,email=no,address=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <title>{% block title %}{% endblock %}</title> <link href="//cdnjs.cloudflare.com/ajax/libs/pure/0.6.2/pure-min.css" rel="stylesheet"> <link href="//cdnjs.cloudflare.com/ajax/libs/flexslider/2.6.3/flexslider.min.css" rel="stylesheet"> <link href="//res.wx.qq.com/open/libs/weui/0.4.3/weui.min.css" rel="stylesheet" type="text/css" /> <link href="{% static 'page/css/flexslider.ext.css' %}" rel="stylesheet" type="text/css" /> <link href="{% static 'page/css/weui.ext.css' %}" rel="stylesheet" type="text/css" /> {% block link %}{% endblock %} <style> body { font-family: Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif !important; background: #fff; } img { pointer-events: none; } .clickable { pointer-events: auto; } /* Input 自动填充后,移除 Chrome 默认黄色 */ input:-webkit-autofill { box-shadow: 0 0 0 1000px white inset !important; } .container { padding-bottom: 45px; } .text-center { text-align: center; } .empty { color: #999; padding: .9375rem 0; font-size: .625rem; } .text_ellipsis { overflow:hidden; white-space:nowrap; text-overflow: ellipsis; } .fl { float: left; } .fr { float: right; } .clearfix { zoom: 1; } .clearfix:after { content: "\200B"; display: block; height: 0; clear: both; } </style> {% block tohomecss %} <style> .tohome { width: 40px; height: 40px; background-color: rgba(139, 139, 139, 0.7); position: fixed; right: 10px; bottom: 20px; border-radius: 9999px; border-top-left-radius: 9999px; border-top-right-radius: 9999px; border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px; z-index: 99999999; } .tohome img { display: block; width: 18px; height: 13px; margin: 6px auto 2px; } .tohome p { color: #ffffff; } </style> {% endblock %} {% block css %}{% endblock %} <script> {% block rem %} //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750) !function(e,t){function n(){var n=l.getBoundingClientRect().width;t=t||540,n>t&&(n=t);var i=100*n/e;r.innerHTML="html{font-size:"+i+"px;}"}var i,d=document,o=window,l=d.documentElement,r=document.createElement("style");if(l.firstElementChild)l.firstElementChild.appendChild(r);else{var a=d.createElement("div");a.appendChild(r),d.write(a.innerHTML),a=null}n(),o.addEventListener("resize",function(){clearTimeout(i),i=setTimeout(n,300)},!1),o.addEventListener("pageshow",function(e){e.persisted&&(clearTimeout(i),i=setTimeout(n,300))},!1),"complete"===d.readyState?d.body.style.fontSize="16px":d.addEventListener("DOMContentLoaded",function(e){d.body.style.fontSize="16px"},!1)}(750,750); {% endblock %} </script> </head> <body> {% block somehtml %}{% endblock %} <div class="container"> {% block container %}{% endblock %} {% block tohomehtml %} <div class="tohome"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAMAAABzP0xhAAAAS1BMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////+DmQsHAAAAGHRSTlMAoHDw+q0VCufg187DuI+OgGJUSDwyKCBlxSbJAAAAi0lEQVQ4y+3SuRKEIBBFUaQbcd+X9/9fOpRDjaXQGJnNiW/SiwpkmXpiW6C16Sav4dR5qtlKHMpNbhaCR4vUTIwfnuKNxoWONR1uunB0g4Cxt9EbRDSXVewVoqr9bNYCgmJV3kwQ0fxtRkYCj8oZ8GBQqieHIWByev9DEPjfeisy+mDk6Dy9/kevRR9/MjHbEpIcQAAAAABJRU5ErkJggg=="> <p style="text-align:center;font-size:8px">回首页</p> </div> {% endblock %} </div> {% block somehtml2 %}{% endblock %} <script> window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) { // 构建错误对象 var errorObj = { lineNo: lineNo || null, columnNo: columnNo || null, scriptURI: scriptURI || null, errorMessage: errorMessage || null, stack: error && error.stack ? error.stack : null }; // 构建Http请求 if (XMLHttpRequest) { var xhr = new XMLHttpRequest(); xhr.open('post', '/e/report', true); xhr.setRequestHeader('Content-Type', 'application/json'); // 设置请求头 xhr.send(JSON.stringify(errorObj)); // 发送参数 } } </script> {# <script src="//cdnjs.cloudflare.com/ajax/libs/zepto/1.1.6/zepto.min.js"></script>#} <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/flexslider/2.6.3/jquery.flexslider-min.js"></script> {% block script %}{% endblock %} <script> // History 压入本地连接 function pushHistory() { var state = { title: "title", url: "#" }; window.history.pushState(state, "title", "#"); } pushHistory(); // 延时监听 setTimeout(function () { // 监听``返回``、``后退``、``上一页`` window.addEventListener("popstate", function (e) { if (confirm("确认退出") == true) { window.history.back(-1); } else { pushHistory(); } }, false); }, 300); </script> <script> {% block glbjs %}{% endblock %} $(function() { /** 格式化输入字符串**/ //用法: "hello{0}".format('world');返回'hello world' String.prototype.format= function(){ var args = arguments; return this.replace(/\{(\d+)\}/g,function(s,i){ return args[i]; }); } {% block flexsliderjs %} // 轮播图 $('.flexslider').flexslider({ slideshowSpeed: 2000, pauseOnHover: true, controlNav: false, directionNav: false, }); {% endblock %} {% block tohomejs %} // 返回首页 $('.tohome').click(function () { window.location.href = '{{ domain }}/page/nav?{{ params|safe }}' }) {% endblock %} {% block js %}{% endblock %} }); </script> <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript" src="{% static 'machine/js/jswe-1.0.0.js' %}"></script> <script> {# V.initWxData({#} {# imgUrl: '{{ domain }}{% static 'page/img/logo.jpg' %}',#} {# link: 'http://hpsgift.hphcclub.com/we/ws',#} {# desc: '惠普销售红包系统',#} {# title: '惠普销售红包系统',#} {# timeLine: ''#} {# }, true);#} V.hideOptionMenu(); {% block jswe %}{% endblock %} </script> {% block scriptag %}{% endblock %} </body> </html>