81109edd04d1d6b290R37">37
+
38
+
39
+@logit
40
+def lensman_integral_list(request):
41
+  user_id = request.POST.get('user_id', '')
42
+
43
+  try:
44
+    lensman = LensmanInfo.objects.get(user_id=user_id, status=True)
45
+  except LensmanInfo.DoesNotExist:
46
+    return response(200, 'Lensman Not Found', u'摄影师不存在')
47
+  
48
+  integrals = UserIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, status=True)
49
+
50
+  integrals = [integral.lensman_userdata for integral in integrals]
51
+  
52
+
53
+  return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals)

+ 2 - 0
api/urls.py

@@ -375,9 +375,11 @@ urlpatterns += [
375 375
     #小程序
376 376
     url(r'^mp/lensman/detail$', lensman_mp_views.lensman_detail, name='mp_lensman_detail'),
377 377
     url(r'^mp/lensman/register$', lensman_mp_views.lensman_register, name='mp_lensman_register'),
378
+    url(r'^mp/lensman/integral/list$', lensman_mp_views.lensman_integral_list, name='mp_lensman_integral_list'),
378 379
 
379 380
     #管理后台
380 381
     url(r'^admin/lensman/list$', lensman_admin_views.lensman_list, name='admin_lensman_list'),
381 382
     url(r'^admin/lensman/audit$', lensman_admin_views.lensman_audit, name='admin_lensman_audit'),
382 383
     url(r'^admin/lensman/update$', lensman_admin_views.lensman_update, name='admin_lensman_update'),
384
+    url(r'^admin/lensman/integral/list$', lensman_admin_views.lensman_integral_list, name='admin_lensman_integral_list'),
383 385
 ]

+ 61 - 3
member/activity_admin_views.py

@@ -9,9 +9,10 @@ from django_response import response
9 9
 from paginator import pagination
10 10
 from TimeConvert import TimeConvert as tc
11 11
 
12
-from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo
12
+from account.models import UserIntegralIncomeExpensesInfo, UserInfo, LensmanInfo
13
+from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo, MemberActivityDataInfo
13 14
 from kodo.decorators import check_admin
14
-from utils.error.errno_utils import MemberActivityStatusCode
15
+from utils.error.errno_utils import MemberActivityStatusCode, UserStatusCode
15 16
 
16 17
 
17 18
 @check_admin
@@ -266,4 +267,61 @@ def activity_signup_pass(request, administrator):
266 267
 
267 268
     MemberActivitySignupInfo.objects.filter(activity_id=activity_id, signup_id=signup_id, status=True).update(passed=True)
268 269
 
269
-    return response(200, 'Member Activity Signup Passed Success', u'活动报名通过成功')
270
+    return response(200, 'Member Activity Signup Passed Success', u'活动报名通过成功')
271
+
272
+
273
+@check_admin
274
+def activity_data_list(request, administrator):
275
+    activity_id = request.POST.get('activity_id', '')
276
+    page = int(request.POST.get('page', 1))
277
+    num = int(request.POST.get('num', 20))
278
+    query = request.POST.get('query', '')
279
+
280
+    logs = MemberActivityDataInfo.objects.filter(activity_id=activity_id, status=True)
281
+    if query:
282
+        logs = logs.filter(Q(lensman_name__icontains=query) | Q(lensman_phone__icontains=query))
283
+
284
+    count = logs.count()
285
+    logs, left = pagination(logs, page, num)
286
+    logs = [log.admindata for log in logs]
287
+    
288
+    return response(200, 'Get Member Activity Data List Success', u'获取会员活动数据列表成功', data={
289
+        'logs': logs,
290
+        'count': count,
291
+        'left': left,
292
+    })
293
+
294
+@check_admin
295
+def activity_integral_add(request, administrator):
296
+    activity_id = request.POST.get('activity_id', '')
297
+    user_id = request.POST.get('user_id', '')
298
+    lensman_id = request.POST.get('lensman_id', '')
299
+    integral = int(request.POST.get('integral', 0))
300
+    remark = request.POST.get('remark', '')
301
+    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
302
+
303
+    try:
304
+        user = UserInfo.objects.get(user_id=user_id, status=True)
305
+    except UserInfo.DoesNotExist:
306
+        return response(UserStatusCode.USER_NOT_FOUND)
307
+
308
+    try:
309
+        lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
310
+    except LensmanInfo.DoesNotExist:
311
+        return response('400001', 'LensmanInfo Not Found', '摄影师不存在')
312
+
313
+    user.integral += integral
314
+    user.save()
315
+
316
+    UserIntegralIncomeExpensesInfo.objects.create(
317
+        brand_id=brand_id,
318
+        user_id=user_id,
319
+        integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY,
320
+        integral=integral,
321
+        final_integral=user.integral,
322
+        activity_id=activity_id,
323
+        remark=remark,
324
+        expired_at=lensman.end_date,
325
+    )
326
+
327
+    return response(200, 'Add Member Activity Integral Success', u'添加积分成功')

+ 12 - 2
member/activity_mp_views.py

@@ -7,7 +7,7 @@ from django_query import get_query_value
7 7
 from django_response import response
8 8
 from paginator import pagination
9 9
 
10
-from account.models import UserInfo
10
+from account.models import UserInfo, LensmanInfo
11 11
 from member.models import MemberActivityContributionInfo, MemberActivityInfo, MemberActivitySignupInfo, MemberActivityDataInfo
12 12
 from utils.error.errno_utils import MemberActivityContributionStatusCode, MemberActivityStatusCode, UserStatusCode
13 13
 
@@ -95,7 +95,7 @@ def activity_signup(request):
95 95
         act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
96 96
     except MemberActivityInfo.DoesNotExist:
97 97
         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
98
-
98
+    
99 99
     MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
100 100
         'title': act.title,
101 101
         'lensman_id': lensman_id,
@@ -139,10 +139,20 @@ def activity_data_submit(request):
139 139
         act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
140 140
     except MemberActivityInfo.DoesNotExist:
141 141
         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
142
+    
143
+    try:
144
+        lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
145
+    except LensmanInfo.DoesNotExist:
146
+        return response('400001', 'LensmanInfo Not Found', '摄影师不存在')
147
+
148
+    if act.is_expired:
149
+        return response(40001, 'Lensman Has Expired', '摄影师合作已到期')
142 150
 
143 151
     MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
144 152
         'title': act.title,
145 153
         'lensman_id': lensman_id,
154
+        'lensman_name': lensman.name,
155
+        'lensman_phone': lensman.phone,
146 156
         'data_fields': data_fields,
147 157
     })
148 158
 

+ 6 - 0
member/admin_urls.py

@@ -17,3 +17,9 @@ urlpatterns += [
17 17
     url(r'^member/activity/signup/list$', activity_admin_views.activity_signup_list, name='admin_member_activity_signup_list'),
18 18
     url(r'^member/activity/signup/pass$', activity_admin_views.activity_signup_pass, name='admin_member_activity_signup_pass'),
19 19
 ]
20
+
21
+#activity data
22
+urlpatterns += [
23
+    url(r'^member/activity/data/list$', activity_admin_views.activity_data_list, name='admin_member_activity_data_list'),
24
+    url(r'^member/activity/integral/add$', activity_admin_views.activity_integral_add, name='admin_member_activity_integral_add'),
25
+]

+ 30 - 0
member/migrations/0069_auto_20240312_1350.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.16 on 2024-03-12 05:50
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0068_auto_20240306_1410'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='memberactivitydatainfo',
17
+            name='lensman_name',
18
+            field=models.CharField(blank=True, help_text='摄影师姓名', max_length=255, null=True, verbose_name='lensman_name'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='memberactivitydatainfo',
22
+            name='lensman_phone',
23
+            field=models.CharField(blank=True, help_text='摄影师手机号', max_length=255, null=True, verbose_name='lensman_phone'),
24
+        ),
25
+        migrations.AlterField(
26
+            model_name='memberactivitydatainfo',
27
+            name='lensman_id',
28
+            field=models.CharField(blank=True, db_index=True, help_text='摄影师唯一标识', max_length=32, null=True, verbose_name='lensman_id'),
29
+        ),
30
+    ]

+ 6 - 1
member/models.py

@@ -794,7 +794,9 @@ class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin):
794 794
     activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
795 795
 
796 796
     title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
797
-    lensman_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)
797
+    lensman_id = models.CharField(_(u'lensman_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)
798
+    lensman_name = models.CharField(_(u'lensman_name'), max_length=255, blank=True, null=True, help_text=u'摄影师姓名')
799
+    lensman_phone = models.CharField(_(u'lensman_phone'), max_length=255, blank=True, null=True, help_text=u'摄影师手机号')
798 800
 
799 801
     data_fields = JSONField(_(u'data_fields'), blank=True, null=True, default='[]', help_text=u'自定义数据表单字段')
800 802
 
@@ -826,7 +828,10 @@ class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin):
826 828
             'lensman_id': self.lensman_id,
827 829
             'activity_id': self.activity_id,
828 830
             'title': self.title,
831
+            'lensman_name': self.lensman_name,
832
+            'lensman_phone': self.lensman_phone,
829 833
             'data_fields': json.loads(self.data_fields) if self.data_fields else [],
834
+            'created_at': tc.local_string(utc_dt=self.created_at),
830 835
         }
831 836
 
832 837
 

kodo - Gogs: Go Git Service

暫無描述

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>