+ })
+ }
+
+ // xx 微信原生企业红包接口
+ // xx.1 发起一个发送原生企业红包请求
+ function openEnterpriseRedPacket(wxredpack_params) {
+ wx.openEnterpriseRedPacket({
+ timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
+ nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位
+ package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***)
+ signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
+ paySign: wxredpack_params.paySign, // 红包签名
+ success: function (res) {
+ // 发送原生企业红包成功后的回调函数
+ if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
+ }
+ })
+ }
+
+ var v = {
+ version: '1.0.5',
+
+ // Basic Vars
+ config: config,
+ wxData: wxData,
+ jsApiList: jsApiList,
+
+ // Weixin Function
+ isOpenInWeixin: isOpenInWeixin,
+ getWeixinVersion: getWeixinVersion,
+ isWeixinVersion: isWeixinVersion,
+
+ // Menu Function
+ hideOptionMenu: hideOptionMenu,
+ showOptionMenu: showOptionMenu,
+ closeWindow: closeWindow,
+
+ // Share Function
+ initWxData: initWxData,
+ changeWxData: changeWxData,
+ fixedWxData: fixedWxData,
+
+ // Image Function
+ images: images,
+ chooseImage: chooseImage,
+ uploadImage: uploadImage,
+ uploadImages: uploadImages,
+
+ // Pay Function
+ chooseWXPay: chooseWXPay,
+
+ // EnterpriseRedPacket Function
+ openEnterpriseRedPacket: openEnterpriseRedPacket
+ }
+ e.JSWE = e.V = v
+})(window)
@@ -0,0 +1,33 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+"""tamron URL Configuration |
|
| 4 |
+ |
|
| 5 |
+The `urlpatterns` list routes URLs to views. For more information please see: |
|
| 6 |
+ https://docs.djangoproject.com/en/1.8/topics/http/urls/ |
|
| 7 |
+Examples: |
|
| 8 |
+Function views |
|
| 9 |
+ 1. Add an import: from my_app import views |
|
| 10 |
+ 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') |
|
| 11 |
+Class-based views |
|
| 12 |
+ 1. Add an import: from other_app.views import Home |
|
| 13 |
+ 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') |
|
| 14 |
+Including another URLconf |
|
| 15 |
+ 1. Add an import: from blog import urls as blog_urls |
|
| 16 |
+ 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) |
|
| 17 |
+""" |
|
| 18 |
+from django.conf.urls import include, url |
|
| 19 |
+from django.contrib import admin |
|
| 20 |
+ |
|
| 21 |
+from page import info_views, oauth_views, sale_views |
|
| 22 |
+ |
|
| 23 |
+ |
|
| 24 |
+urlpatterns = [ |
|
| 25 |
+ url(r'^admin/', include(admin.site.urls)), |
|
| 26 |
+ url(r'^api/', include('api.urls', namespace='api')),
|
|
| 27 |
+] |
|
| 28 |
+ |
|
| 29 |
+urlpatterns += [ |
|
| 30 |
+ url(r'^page/clerk$', oauth_views.clerk_oauth, name='clerk_oauth'), # 店员授权页面 |
|
| 31 |
+ url(r'^page/clerk/sale$', sale_views.clerk_sale_oauth, name='clerk_sale_oauth'), # 店员销售授权页面 |
|
| 32 |
+ url(r'^page/clerk/info$', info_views.clerk_info_oauth, name='clerk_info_oauth'), # 店员信息授权页面 |
|
| 33 |
+] |
@@ -0,0 +1,2 @@ |
||
| 1 |
+killall -9 uwsgi |
|
| 2 |
+echo "2敏加油~~~!!!↖(^ω^)↗" |
@@ -0,0 +1,2 @@ |
||
| 1 |
+nohup uwsgi --ini pai2.ini &>pai2.log & |
|
| 2 |
+echo "Start Success !!!" |
@@ -0,0 +1,27 @@ |
||
| 1 |
+# tamron_uwsgi.ini file |
|
| 2 |
+[uwsgi] |
|
| 3 |
+ |
|
| 4 |
+# Django-related settings |
|
| 5 |
+# the base directory (full path) |
|
| 6 |
+chdir = /home/paiai/work/tamron |
|
| 7 |
+# Django's wsgi file |
|
| 8 |
+module = tamron.wsgi |
|
| 9 |
+# the virtualenv (full path) |
|
| 10 |
+# home = /path/to/virtualenv |
|
| 11 |
+ |
|
| 12 |
+# process-related settings |
|
| 13 |
+# master |
|
| 14 |
+master = true |
|
| 15 |
+# maximum number of worker processes |
|
| 16 |
+processes = 10 |
|
| 17 |
+# the socket (use the full path to be safe |
|
| 18 |
+socket = /home/paiai/work/tamron/tamron/uwsgi/tamron.sock |
|
| 19 |
+# ... with appropriate permissions - may be needed |
|
| 20 |
+chmod-socket = 777 |
|
| 21 |
+# clear environment on exit |
|
| 22 |
+vacuum = true |
|
| 23 |
+ |
|
| 24 |
+# 11: Resource temporarily unavailable |
|
| 25 |
+reload-mercy = 64 |
|
| 26 |
+max-requests = 8192 |
|
| 27 |
+listen = 4096 |
@@ -0,0 +1,35 @@ |
||
| 1 |
+# tamron_nginx.conf |
|
| 2 |
+ |
|
| 3 |
+# the upstream component nginx needs to connect to |
|
| 4 |
+upstream pai2 {
|
|
| 5 |
+ # server unix:///home/paiai/work/tamron/tamron/uwsgi/tamron.sock; # for a file socket |
|
| 6 |
+ server 127.0.0.1:8888; # for a web port socket (we'll use this first) |
|
| 7 |
+} |
|
| 8 |
+ |
|
| 9 |
+# configuration of the server |
|
| 10 |
+server {
|
|
| 11 |
+ # the port your site will be served on |
|
| 12 |
+ listen 80; |
|
| 13 |
+ # the domain name it will serve for |
|
| 14 |
+ server_name .tamron.xfoto.com.cn; # substitute your machine's IP address or FQDN |
|
| 15 |
+ charset utf-8; |
|
| 16 |
+ |
|
| 17 |
+ # max upload size |
|
| 18 |
+ client_max_body_size 75M; # adjust to taste |
|
| 19 |
+ |
|
| 20 |
+ # Django media |
|
| 21 |
+ location /media {
|
|
| 22 |
+ alias /home/paiai/work/tamron/media; # your Django project's media files - amend as required |
|
| 23 |
+ } |
|
| 24 |
+ |
|
| 25 |
+ location /static {
|
|
| 26 |
+ alias /home/paiai/work/tamron/collect_static; # your Django project's static files - amend as required |
|
| 27 |
+ } |
|
| 28 |
+ |
|
| 29 |
+ # Finally, send all non-media requests to the Django server. |
|
| 30 |
+ location / {
|
|
| 31 |
+ # uwsgi_pass tamron; |
|
| 32 |
+ proxy_pass http://tamron; |
|
| 33 |
+ include /home/paiai/work/tamron/tamron/uwsgi/uwsgi_params; # the uwsgi_params file you installed |
|
| 34 |
+ } |
|
| 35 |
+} |
@@ -0,0 +1,15 @@ |
||
| 1 |
+uwsgi_param QUERY_STRING $query_string; |
|
| 2 |
+uwsgi_param REQUEST_METHOD $request_method; |
|
| 3 |
+uwsgi_param CONTENT_TYPE $content_type; |
|
| 4 |
+uwsgi_param CONTENT_LENGTH $content_length; |
|
| 5 |
+ |
|
| 6 |
+uwsgi_param REQUEST_URI $request_uri; |
|
| 7 |
+uwsgi_param PATH_INFO $document_uri; |
|
| 8 |
+uwsgi_param DOCUMENT_ROOT $document_root; |
|
| 9 |
+uwsgi_param SERVER_PROTOCOL $server_protocol; |
|
| 10 |
+uwsgi_param UWSGI_SCHEME $scheme; |
|
| 11 |
+ |
|
| 12 |
+uwsgi_param REMOTE_ADDR $remote_addr; |
|
| 13 |
+uwsgi_param REMOTE_PORT $remote_port; |
|
| 14 |
+uwsgi_param SERVER_PORT $server_port; |
|
| 15 |
+uwsgi_param SERVER_NAME $server_name; |
@@ -0,0 +1,17 @@ |
||
| 1 |
+""" |
|
| 2 |
+WSGI config for tamron project. |
|
| 3 |
+ |
|
| 4 |
+It exposes the WSGI callable as a module-level variable named ``application``. |
|
| 5 |
+ |
|
| 6 |
+For more information on this file, see |
|
| 7 |
+https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ |
|
| 8 |
+""" |
|
| 9 |
+ |
|
| 10 |
+import os |
|
| 11 |
+ |
|
| 12 |
+from django.core.wsgi import get_wsgi_application |
|
| 13 |
+ |
|
| 14 |
+ |
|
| 15 |
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tamron.settings")
|
|
| 16 |
+ |
|
| 17 |
+application = get_wsgi_application() |
@@ -0,0 +1,62 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+from StatusCode import BaseStatusCode, StatusCodeField |
|
| 4 |
+ |
|
| 5 |
+ |
|
| 6 |
+class FranchiserStatusCode(BaseStatusCode): |
|
| 7 |
+ """ 店员相关错误码 4001xx """ |
|
| 8 |
+ CHISER_NOT_FOUND = StatusCodeField(400001, 'Chiser Not Found', description=u'经销商不存在') |
|
| 9 |
+ |
|
| 10 |
+ |
|
| 11 |
+class SaleclerkStatusCode(BaseStatusCode): |
|
| 12 |
+ """ 店员相关错误码 4001xx """ |
|
| 13 |
+ CLERK_NOT_FOUND = StatusCodeField(400101, 'Clerk Not Found', description=u'店员不存在') |
|
| 14 |
+ # 手机号 |
|
| 15 |
+ CLERK_PHONE_ALREADY_EXISTS = StatusCodeField(400105, 'Clerk Phone Already Exists', description=u'手机号已经存在') |
|
| 16 |
+ # 状态 |
|
| 17 |
+ CLERK_ALREADY_NOT_UNVERIFIED = StatusCodeField(400110, 'Clerk Already Not Unverified', description=u'店员帐号已激活') |
|
| 18 |
+ CLERK_NOT_ACTIVATED = StatusCodeField(400115, 'Clerk Not Activated', description=u'店员帐号未激活') |
|
| 19 |
+ |
|
| 20 |
+ |
|
| 21 |
+class ProductModelStatusCode(BaseStatusCode): |
|
| 22 |
+ """ 型号相关错误码 4010xx """ |
|
| 23 |
+ MODEL_NOT_FOUND = StatusCodeField(401001, 'Model Not Found', description=u'型号不存在') |
|
| 24 |
+ |
|
| 25 |
+ |
|
| 26 |
+class ProductStatusCode(BaseStatusCode): |
|
| 27 |
+ """ 产品相关错误码 4020xx """ |
|
| 28 |
+ PRODUCT_NOT_FOUND = StatusCodeField(402001, 'Product Not Found', description=u'产品不存在') |
|
| 29 |
+ # 状态 |
|
| 30 |
+ PRODUCT_HAS_USED = StatusCodeField(402011, 'Product Has Used', description=u'产品已使用') |
|
| 31 |
+ |
|
| 32 |
+ |
|
| 33 |
+class OrderStatusCode(BaseStatusCode): |
|
| 34 |
+ """ 订单/支付相关错误码 4040xx """ |
|
| 35 |
+ WX_UNIFIED_ORDER_FAIL = StatusCodeField(404000, 'WX Unified Order Fail', description=u'微信统一下单失败') |
|
| 36 |
+ WX_ORDER_NOT_FOUND = StatusCodeField(404001, 'WX Order Not Found', description=u'订单不存在') |
|
| 37 |
+ WX_ORDER_NOT_PAY = StatusCodeField(404002, 'WX Order Not Pay', description=u'订单未支付') |
|
| 38 |
+ WX_ORDER_PAYING = StatusCodeField(404003, 'WX Order Paying', description=u'订单支付中') |
|
| 39 |
+ WX_ORDER_PAY_FAIL = StatusCodeField(404009, 'WX Order Pay Fail', description=u'微信支付失败') |
|
| 40 |
+ SIGN_CHECK_FAIL = StatusCodeField(404010, 'Sign Check Fail', description=u'签名校验失败') |
|
| 41 |
+ FEE_CHECK_FAIL = StatusCodeField(404011, 'FEE Check Fail', description=u'金额校验失败') |
|
| 42 |
+ NO_DETAIL_PERMISSION = StatusCodeField(404015, 'No Detail Permission', description=u'无详情权限') |
|
| 43 |
+ WX_ORDER_PAID_ALREADY_EXISTS = StatusCodeField(404020, 'WX Order Paid Already Exists', description=u'照片已购买') |
|
| 44 |
+ |
|
| 45 |
+ |
|
| 46 |
+class PayStatusCode(BaseStatusCode): |
|
| 47 |
+ """ 支付相关错误码 4041xx """ |
|
| 48 |
+ |
|
| 49 |
+ |
|
| 50 |
+class WithdrawStatusCode(BaseStatusCode): |
|
| 51 |
+ """ 提现相关错误码 4042xx """ |
|
| 52 |
+ BALANCE_NOT_ENOUGH = StatusCodeField(404200, 'Balance Not Enough', description=u'提现金额不足') |
|
| 53 |
+ |
|
| 54 |
+ |
|
| 55 |
+class MessageStatusCode(BaseStatusCode): |
|
| 56 |
+ """ 消息相关错误码 4090xx """ |
|
| 57 |
+ MESSAGE_NOT_FOUND = StatusCodeField(409001, 'Message Not Found', description=u'消息不存在') |
|
| 58 |
+ |
|
| 59 |
+ |
|
| 60 |
+class TokenStatusCode(BaseStatusCode): |
|
| 61 |
+ """ 票据相关错误码 4090xx """ |
|
| 62 |
+ TOKEN_NOT_FOUND = StatusCodeField(409901, 'Token Not Found', description=u'票据不存在') |
@@ -0,0 +1,18 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+from django.http import JsonResponse |
|
| 4 |
+from StatusCode import StatusCodeField |
|
| 5 |
+ |
|
| 6 |
+ |
|
| 7 |
+def response_data(status_code=200, message=None, description=None, data={}, **kwargs):
|
|
| 8 |
+ return dict({
|
|
| 9 |
+ 'status': status_code, |
|
| 10 |
+ 'message': message, |
|
| 11 |
+ 'description': description, |
|
| 12 |
+ 'data': data, |
|
| 13 |
+ }, **kwargs) |
|
| 14 |
+ |
|
| 15 |
+ |
|
| 16 |
+def response(status_code=200, message=None, description=None, data={}, **kwargs):
|
|
| 17 |
+ message, description = (message or status_code.message, description or status_code.description) if isinstance(status_code, StatusCodeField) else (message, description) |
|
| 18 |
+ return JsonResponse(response_data(status_code, message, description, data, **kwargs), safe=False) |
@@ -0,0 +1,6 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+from django.conf import settings |
|
| 4 |
+ |
|
| 5 |
+ |
|
| 6 |
+r = settings.REDIS_CACHE |
@@ -0,0 +1,68 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+# 唯一标识相关 |
|
| 4 |
+UUID_LIST = 'uuid:list' # List,唯一标识列表 |
|
| 5 |
+ |
|
| 6 |
+# 用户相关 |
|
| 7 |
+PROFILE_INFO = 'profile:info:%s' # STRING,用户信息,user_id |
|
| 8 |
+ |
|
| 9 |
+# 导游相关 |
|
| 10 |
+TOUR_GUIDE_GROUP_GEO_INFO = 'tour:guide:group:geo:info:%s' # ZSET,旅游团地理位置信息,group_id |
|
| 11 |
+TOUR_GUIDE_GROUP_GEO_SUBMIT_DT = 'tour:guide:group:geo:submit:dt:%s' # ZSET,旅游团地理位置最后上传时间,group_id |
|
| 12 |
+TOUR_GUIDE_GROUP_CUR_SESSION = 'tour:guide:group:cur:session:%s' # STRING,旅游团当前Session,group_id,导游设置集合时间的时候更新 |
|
| 13 |
+TOUR_GUIDE_GROUP_CUR_GATHER_INFO = 'tour:guide:group:cur:gather:info:%s' # STRING,旅游团当前Session,group_id,导游设置集合时间的时候更新 |
|
| 14 |
+TOUR_GUIDE_GROUP_USER_GEO_LIST = 'tour:guide:group:user:geo:list:%s:%s:%s' # LIST,旅游团当前用户地理位置列表,group_id、session_id、user_id |
|
| 15 |
+ |
|
| 16 |
+TOUR_GUIDE_GROUP_USER_OWN = 'tour:guide:group:user:own:%s' # STRING,导游当前拥有的旅行团,user_id,导游创建旅行团的时候更新 |
|
| 17 |
+TOUR_GUIDE_GROUP_USER_BELONG = 'tour:guide:group:user:belong:%s' # STRING,用户当前所属旅行团,user_id,用户加入旅行团的时候更新 |
|
| 18 |
+ |
|
| 19 |
+# 群组相关 |
|
| 20 |
+GROUP_INFO = 'group:info:%s' # STRING,群组信息,group_id |
|
| 21 |
+ |
|
| 22 |
+# 群组用户相关 |
|
| 23 |
+GROUP_USERS_INFO = 'group:users:info:%s' # STRING,群组用户信息,group_id |
|
| 24 |
+GROUP_USERS_KV_INFO = 'group:users:kv:info:%s' # STRING,群组用户信息,group_id |
|
| 25 |
+GROUP_USERS_APPLYING_SET = 'group:users:applying:set:%s' # SET,群组用户申请集合,group_id |
|
| 26 |
+GROUP_USERS_PASSED_SET = 'group:users:passed:set:%s' # SET,群组用户通过集合,group_id |
|
| 27 |
+GROUP_USERS_REFUSED_SET = 'group:users:refused:set:%s' # SET,群组用户拒绝集合,group_id |
|
| 28 |
+GROUP_USERS_DELETED_SET = 'group:users:deleted:set:%s' # SET,群组用户移除集合,group_id |
|
| 29 |
+GROUP_USERS_QUIT_SET = 'group:users:quit:set:%s' # SET,群组用户退出集合,group_id |
|
| 30 |
+ |
|
| 31 |
+# 群组照片相关 |
|
| 32 |
+GROUP_PHOTO_DATA = 'group:photo:data:%s' # STRING,群组数据记录,group_id |
|
| 33 |
+GROUP_PHOTO_THUMB_UP = 'group:photo:thumb:up:%s:%s' # STRING,群组照片用户点赞记录,photo_id、user_id |
|
| 34 |
+GROUP_PHOTO_COMMENT_LIST = 'group:photo:comment:list:%s' # STRING,群组照片用户评论列表,photo_id |
|
| 35 |
+GROUP_PHOTO_THUMB_UP_LIST = 'group:photo:thumb:up:list:%s' # STRING,群组照片用户点赞列表,photo_id |
|
| 36 |
+GROUP_PHOTO_WATCHER_SET = 'group:photo:watcher:set:%s' # SET,群组照片用户关注集合,photo_id,关注即评论点赞 |
|
| 37 |
+GROUP_LAST_PHOTO_PK = 'group:last:photo:pk:%s' # STRING,群组最后一张照片PK,group_id |
|
| 38 |
+ |
|
| 39 |
+# 摄影师照片相关 |
|
| 40 |
+LENSMAN_PHOTO_ORDER_RECORD = 'lensman:photo:order:record:%s:%s' # STRING,摄影师照片购买记录,photo_id、user_id |
|
| 41 |
+ |
|
| 42 |
+# 摄影师简报相关 |
|
| 43 |
+# 收入 |
|
| 44 |
+TOTAL_INCOME = 'total:income:%s:%s' # STRING,总收入,user_id、photo_type |
|
| 45 |
+WEEK_INCOME = 'week:income:%s:%s:%s' # STRING,周收入,user_id、photo_type、Week.thisweek().isoformat() |
|
| 46 |
+TODAY_INCOME = 'today:income:%s:%s:%s' # STRING,日收入,user_id、photo_type、tc.local_string(format='%Y%m%d') |
|
| 47 |
+# 上传 |
|
| 48 |
+TODAY_UPLOAD_PHOTO_AMOUNT = 'today:upload:photo:amount:%s:%s' # STRING,日上传照片数量,user_id、tc.local_string(format='%Y%m%d') |
|
| 49 |
+# 售出 |
|
| 50 |
+WEEK_SOLD = 'week:sold:%s:%s:%s' # STRING,周售出,user_id、photo_type、Week.thisweek().isoformat() |
|
| 51 |
+ |
|
| 52 |
+# 摄影师定价相关 |
|
| 53 |
+LENSMAN_PHOTO_PRICE_FIXED = 'lensman:photo:price:fixed:%s' # STRING,摄影师照片定价(单位:分),user_id |
|
| 54 |
+ |
|
| 55 |
+# 系统消息相关 |
|
| 56 |
+SYSTEM_MESSAGE_READ_INFO = 'system:message:read:info:%s' # STRING,系统消息读取信息,user_id |
|
| 57 |
+SYSTEM_MESSAGE_DELETED_INFO = 'system:message:deleted:info:%s' # STRING,系统消息删除信息,user_id |
|
| 58 |
+ |
|
| 59 |
+# 游客入口相关 |
|
| 60 |
+GUEST_ENTRANCE_CONTROL_INFO = 'guest:entrance:control:info:%s' # STRING,游客入口控制信息,src |
|
| 61 |
+ |
|
| 62 |
+# APP 相关 |
|
| 63 |
+LATEST_APP_INFO = 'latest:app:info:%s' # STRING,最新 APP 信息,src |
|
| 64 |
+APP_SETTINGS_INFO = 'app:settings:info:%s:%s:%s' # STRING,APP 设置信息,platform、channel、version |
|
| 65 |
+APP_PATCH_INFO = 'app:patch:info:%s:%s:%s' # STRING,APP 补丁信息,platform、version、src |
|
| 66 |
+ |
|
| 67 |
+# BOX 相关 |
|
| 68 |
+BOX_PROGRAM_VERSION_INFO = 'box:program:version:info' # STRING,BOX 程序版本信息 |