ed info header">
Przeglądaj źródła
简报页
chengzhenyu 10 lat temu
rodzic
commit
5848dbb77a
11 zmienionych plików z 132 dodań i 25 usunięć
  1. 1 1
      app/build.gradle
  2. 3 6
      app/src/main/java/ai/pai/lensman/bean/MessageBean.java
  3. 14 6
      app/src/main/java/ai/pai/lensman/briefs/BriefsActivity.java
  4. 1 0
      app/src/main/java/ai/pai/lensman/briefs/BriefsContract.java
  5. 3 6
      app/src/main/java/ai/pai/lensman/briefs/BriefsInteractor.java
  6. 29 3
      app/src/main/java/ai/pai/lensman/briefs/BriefsPresenter.java
  7. 63 1
      app/src/main/java/ai/pai/lensman/main/QueryBoxStatusInteractor.java
  8. 3 0
      app/src/main/java/ai/pai/lensman/utils/BoxUrlContainer.java
  9. 12 1
      app/src/main/java/ai/pai/lensman/utils/UrlContainer.java
  10. 2 0
      app/src/main/res/values/strings.xml
  11. 1 1
      build.gradle

+ 1 - 1
app/build.gradle

@@ -49,7 +49,7 @@ android {
49 49
             zipAlignEnabled false
50 50
             minifyEnabled false
51 51
             shrinkResources false
52
-            buildConfigField "boolean", "isTestMode", "false"
52
+            buildConfigField "boolean", "isTestMode", "true"
53 53
             signingConfig signingConfigs.releaseConfig
54 54
         }
55 55
     }

+ 3 - 6
app/src/main/java/ai/pai/lensman/bean/MessageBean.java

@@ -5,12 +5,9 @@ package ai.pai.lensman.bean;
5 5
  */
6 6
 public class MessageBean {
7 7
 
8
-    public String createTime;
9
-    public String senderAvatarUrl;
10
-    public String senderName;
11
-    public boolean isRead;
12
-    public String msgId;
8
+    public String paidTime;
9
+    public int totalFee;
10
+    public String photoId;
13 11
     public String content;
14
-
15 12
     public GroupPhotoItem photoItem;
16 13
 }

+ 14 - 6
app/src/main/java/ai/pai/lensman/briefs/BriefsActivity.java

@@ -21,12 +21,14 @@ import butterknife.OnClick;
21 21
 
22 22
 public class BriefsActivity extends BaseActivity implements BriefsContract.View{
23 23
 
24
-    @BindView(R.id.tv_today_upload_num)       TextView todayUploadNumText;
25
-    @BindView(R.id.tv_today_point_amount)    TextView todayPointAmountText;
26
-    @BindView(R.id.tv_week_origin_sold_num)  TextView weekOriginSoldNumText;
27
-    @BindView(R.id.tv_week_point_amount)  TextView weekPotinAmountText;
28
-    @BindView(R.id.switcher_order_msg)         TextSwitcher orderMsgSwitch;
29
-    @BindView(R.id.switcher_system_msg)         TextSwitcher systemMsgSwitch;
24
+    @BindView(R.id.tv_today_upload_num)     TextView todayUploadNumText;
25
+    @BindView(R.id.tv_today_point_amount)   TextView todayPointAmountText;
26
+    @BindView(R.id.tv_week_origin_sold_num) TextView weekOriginSoldNumText;
27
+    @BindView(R.id.tv_week_point_amount)    TextView weekPotinAmountText;
28
+    @BindView(R.id.switcher_order_msg)      TextSwitcher orderMsgSwitch;
29
+    @BindView(R.id.switcher_system_msg)     TextSwitcher systemMsgSwitch;
30
+    @BindView(R.id.tv_box_num)              TextView boxNumText;
31
+    @BindView(R.id.tv_box_status)           TextView boxStatusText;
30 32
 
31 33
     private BriefsPresenter presenter;
32 34
 
@@ -89,4 +91,10 @@ public class BriefsActivity extends BaseActivity implements BriefsContract.View{
89 91
 
90 92
     }
91 93
 
94
+    @Override
95
+    public void updateBoxInfo(String boxNo, String boxStatus) {
96
+        boxNumText.setText(boxNo);
97
+        boxStatusText.setText(boxStatus);
98
+    }
99
+
92 100
 }

+ 1 - 0
app/src/main/java/ai/pai/lensman/briefs/BriefsContract.java

@@ -12,6 +12,7 @@ public class BriefsContract {
12 12
     public interface View extends BaseView{
13 13
         void updateUserInfo(BriefsBean bean);
14 14
         void updateMessageBar(String sysMsg,String orderMsg);
15
+        void updateBoxInfo(String boxNo,String boxStatus);
15 16
     }
16 17
 
17 18
     public interface Presenter extends BasePresenter{

+ 3 - 6
app/src/main/java/ai/pai/lensman/briefs/BriefsInteractor.java

@@ -77,12 +77,9 @@ public class BriefsInteractor implements BaseInteractor {
77 77
                             for(int count = 0; count<msgArray.length();count++){
78 78
                                 JSONObject childMsg = msgArray.getJSONObject(count);
79 79
                                 MessageBean childBean = new MessageBean();
80
-                                childBean.createTime = JSONParseUtils.getJSONString(childMsg.getString("created_at"));
81
-                                childBean.isRead = childMsg.getBoolean("read");
82
-                                childBean.msgId = childMsg.getString("pk");
83
-                                childBean.senderName = JSONParseUtils.getJSONString(childMsg.getString("from_nickname"));
84
-                                childBean.senderAvatarUrl = JSONParseUtils.getJSONString(childMsg.getString("from_avatar"));
85
-                                childBean.content = JSONParseUtils.getJSONString(childMsg.getString("msg_content"));
80
+                                childBean.paidTime = JSONParseUtils.getJSONString(childMsg.getString("paid_at"));
81
+                                childBean.photoId = JSONParseUtils.getJSONString(childMsg.getString("photo_id"));
82
+                                childBean.totalFee = childMsg.getInt("total_fee");
86 83
                                 JSONObject photoObj = childMsg.getJSONObject("group_photo_info");
87 84
                                 childBean.photoItem = GroupPhotoItem.parseFromJSON(photoObj);
88 85
                                 msgList.add(childBean);

+ 29 - 3
app/src/main/java/ai/pai/lensman/briefs/BriefsPresenter.java

@@ -7,30 +7,42 @@ import java.util.Timer;
7 7
 import java.util.TimerTask;
8 8
 
9 9
 import ai.pai.lensman.App;
10
+import ai.pai.lensman.R;
10 11
 import ai.pai.lensman.base.BaseInteractor;
11 12
 import ai.pai.lensman.bean.BriefsBean;
13
+import ai.pai.lensman.bean.MessageBean;
14
+import ai.pai.lensman.bean.SystemMessageBean;
15
+import ai.pai.lensman.main.QueryBoxStatusInteractor;
12 16
 
13
-public class BriefsPresenter implements BriefsContract.Presenter,BaseInteractor.InteractorListener<BriefsBean> {
17
+public class BriefsPresenter implements BriefsContract.Presenter,BaseInteractor.InteractorListener<BriefsBean>,QueryBoxStatusInteractor.BoxStatusListener {
14 18
 
15 19
     private BriefsContract.View briefsView;
16 20
     private BriefsInteractor interactor;
21
+    private QueryBoxStatusInteractor boxStatusInteractor;
22
+
17 23
     private BriefsBean briefsBean;
18 24
     private String NULL_STR = "";
19 25
     private Timer timer;
26
+    private MessageBean currentMsg;
27
+    private SystemMessageBean currentSystemMsg;
28
+
20 29
 
21 30
     public BriefsPresenter(BriefsContract.View briefsView){
22 31
         this.briefsView = briefsView;
23 32
         interactor = new BriefsInteractor(this);
33
+        boxStatusInteractor = new QueryBoxStatusInteractor(this);
24 34
     }
25 35
 
26 36
     @Override
27 37
     public void start() {
28 38
         interactor.startJob();
39
+        boxStatusInteractor.startJob();
29 40
     }
30 41
 
31 42
     @Override
32 43
     public void stop() {
33 44
         interactor.cancelJob();
45
+        boxStatusInteractor.cancelJob();
34 46
         if(timer!=null){
35 47
             timer.cancel();
36 48
         }
@@ -61,17 +73,31 @@ public class BriefsPresenter implements BriefsContract.Presenter,BaseInteractor.
61 73
     }
62 74
 
63 75
     private String getNextOrderMessage(){
76
+        currentMsg = null;
64 77
         if(briefsBean == null || briefsBean.msgList==null || briefsBean.msgList.size()==0){
65 78
             return NULL_STR;
66 79
         }
67
-        return briefsBean.msgList.get(new Random().nextInt(briefsBean.msgList.size())).content;
80
+        currentMsg =  briefsBean.msgList.get(new Random().nextInt(briefsBean.msgList.size()));
81
+        currentMsg.content = formatOrderContent(currentMsg);
82
+        return currentMsg.content;
83
+    }
84
+
85
+    private String formatOrderContent(MessageBean messageBean){
86
+        return App.getAppContext().getString(R.string.customer_bought_photo_money,
87
+                new java.text.DecimalFormat("#.00").format(messageBean.totalFee*1.0f/100));
68 88
     }
69 89
 
70 90
     private String getNextSystemMessage(){
91
+        currentSystemMsg = null;
71 92
         if(briefsBean == null || briefsBean.systemMsgList==null || briefsBean.systemMsgList.size()==0){
72 93
             return NULL_STR;
73 94
         }
74
-        return briefsBean.systemMsgList.get(new Random().nextInt(briefsBean.systemMsgList.size())).content;
95
+        currentSystemMsg = briefsBean.systemMsgList.get(new Random().nextInt(briefsBean.systemMsgList.size()));
96
+        return currentSystemMsg.content;
75 97
     }
76 98
 
99
+    @Override
100
+    public void onBoxStatusFetched(String boxNo, String boxStatus, String boxStatusCode) {
101
+        briefsView.updateBoxInfo(boxNo,boxStatus+"("+boxStatusCode+")");
102
+    }
77 103
 }

+ 63 - 1
app/src/main/java/ai/pai/lensman/main/QueryBoxStatusInteractor.java

@@ -1,18 +1,80 @@
1 1
 package ai.pai.lensman.main;
2 2
 
3 3
 
4
+import android.os.AsyncTask;
5
+
6
+import com.android.common.executors.ThreadExecutor;
7
+
8
+import org.json.JSONObject;
9
+
4 10
 import ai.pai.lensman.base.BaseInteractor;
11
+import ai.pai.lensman.utils.BoxUrlContainer;
12
+import ai.pai.lensman.utils.HttpPostTask;
5 13
 
6 14
 public class QueryBoxStatusInteractor  implements BaseInteractor{
15
+    
16
+    private HttpPostTask queryBoxTask;
17
+    private BoxStatusListener listener;
18
+
19
+    public QueryBoxStatusInteractor(BoxStatusListener listener){
20
+        this.listener = listener;
21
+    }
7 22
 
8 23
     @Override
9 24
     public void startJob() {
25
+        cancelJob();
26
+        queryBoxTask = new HttpPostTask(null){
10 27
 
28
+            String boxStatusNum;
29
+            String boxStatusMsg;
30
+            String boxNo;
31
+            @Override
32
+            protected boolean parseResponse(String response) {
33
+                try{
34
+                    JSONObject json = new JSONObject(response);
35
+                    int status = json.getInt("status");
36
+                    if(status == 200){
37
+                        boxNo = json.getString("no.");
38
+                        JSONObject boxStatus = json.getJSONObject("status");
39
+                        boxStatusMsg = boxStatus.getString("msg");
40
+                        boxStatusNum = boxStatus.getString("code");
41
+                        return true;
42
+                    }
43
+                }catch (Exception e){
44
+                    e.printStackTrace();
45
+                }
46
+                return false;
47
+            }
48
+
49
+            @Override
50
+            protected void onPostFail() {
51
+                super.onPostFail();
52
+            }
53
+
54
+            @Override
55
+            protected void onPostSuccess() {
56
+                super.onPostSuccess();
57
+                if(listener!=null){
58
+                    listener.onBoxStatusFetched(boxNo,boxStatusMsg,boxStatusNum);
59
+                }
60
+            }
61
+        };
62
+        queryBoxTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), BoxUrlContainer.BOX_INFO_URL);
11 63
     }
12 64
 
13 65
     @Override
14 66
     public void cancelJob() {
15
-
67
+        if(queryBoxTask==null){
68
+            return;
69
+        }
70
+        if(queryBoxTask.getStatus()== AsyncTask.Status.RUNNING){
71
+            queryBoxTask.cancel(true);
72
+        }
73
+        queryBoxTask = null;
16 74
     }
17 75
 
76
+    public interface BoxStatusListener{
77
+
78
+        void onBoxStatusFetched(String boxNo, String boxStatus, String boxStatusCode);
79
+    }
18 80
 }

+ 3 - 0
app/src/main/java/ai/pai/lensman/utils/BoxUrlContainer.java

@@ -23,6 +23,7 @@ public class BoxUrlContainer {
23 23
      */
24 24
     public static String FETCH_ORIGIN_URL = BASE_URL +"fetch_origin";
25 25
 
26
+    public static String BOX_INFO_URL = BASE_URL+"box_info";
26 27
 
27 28
 
28 29
     public static void resetIPHost(String ip) {
@@ -41,6 +42,8 @@ public class BoxUrlContainer {
41 42
         PHOTO_PATH_PREFIX_URL = BASE_URL + "static/";
42 43
 
43 44
         FETCH_ORIGIN_URL = BASE_URL +"fetch_origin";
45
+
46
+        BOX_INFO_URL = BASE_URL+"box_info";
44 47
     }
45 48
 
46 49
 

+ 12 - 1
app/src/main/java/ai/pai/lensman/utils/UrlContainer.java

@@ -51,8 +51,19 @@ public class UrlContainer {
51 51
      */
52 52
     public static final String ORIGIN_PHOTO_UPLOAD_URL = HOST_URL+"l/origin_upload";
53 53
 
54
-
54
+    /**
55
+     * user_id  # 用户唯一标识
56
+     feedback  # 反馈内容,数据库 text 类型存储
57
+     src  # 用户反馈来源,0 拍爱用户端,1 拍爱摄影师端,不传默认 0
58
+     */
55 59
     public static final String FEEDBACK_URL = HOST_URL +"op/feedback";
56 60
 
61
+    /**
62
+     * user_id  # 用户唯一标识
63
+     nomark  # 无水印价格(单位:分)
64
+     origin  # 高清图价格(单位:分)
65
+     */
66
+    public static final String PRICE_FIX_URL = HOST_URL+"l/price_fix";
67
+
57 68
 
58 69
 }

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -142,4 +142,6 @@
142 142
 
143 143
     <string name="check_update_processing">正在检查更新</string>
144 144
 
145
+    <string name="customer_bought_photo_money">用户 ¥%s 购买了高清图</string>
146
+
145 147
 </resources>

+ 1 - 1
build.gradle

@@ -5,7 +5,7 @@ buildscript {
5 5
         jcenter()
6 6
     }
7 7
     dependencies {
8
-        classpath 'com.android.tools.build:gradle:2.1.3'
8
+        classpath 'com.android.tools.build:gradle:2.2.0-rc2'
9 9
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
10 10
         // NOTE: Do not place your application dependencies here; they belong
11 11
         // in the individual module build.gradle files

会员活动新增字段 · 621aed80ce - Gogs: Go Git Service

会员活动新增字段

FFIB преди 3 години
родител
ревизия
621aed80ce
променени са 9 файла, в които са добавени 315 реда и са изтрити 191 реда
  1. 0 186
      api/admin_views.py
  2. 0 4
      api/urls.py
  3. 216 0
      member/activity_admin_views.py
  4. 13 0
      member/admin_urls.py
  5. 36 0
      member/migrations/0057_auto_20230506_1643.py
  6. 26 0
      member/migrations/0058_auto_20230506_1650.py
  7. 22 0
      member/models.py
  8. 1 1
      member/mp_urls.py
  9. 1 0
      member/urls.py

+ 0 - 186
api/admin_views.py

@@ -768,192 +768,6 @@ def record_warehouse(request, administrator):
768 768
 
769 769
 
770 770
 @check_admin
771
-def member_activity_list(request, administrator):
772
-    activity_type = request.POST.get('activity_type', '')
773
-    title = request.POST.get('title', '')
774
-    start_time = request.POST.get('start_time', '')
775
-    end_time = request.POST.get('end_time', '')
776
-    page = request.POST.get('page', 1)
777
-    num = request.POST.get('num', 20)
778
-    activity_state = request.POST.get('activity_state', '')
779
-    activity_section = request.POST.get('activity_section', '')
780
-
781
-    logs = MemberActivityInfo.objects.filter(status=True)
782
-
783
-    if activity_type:
784
-        logs = logs.filter(activity_type=activity_type)
785
-
786
-    if activity_section:
787
-        logs = logs.filter(activity_section=activity_section)
788
-
789
-    if activity_state:
790
-        logs = logs.filter(activity_state=activity_state)
791
-
792
-    if title:
793
-        logs = logs.filter(title__icontains=title)
794
-
795
-    if start_time and end_time:
796
-        start_time = datetime.strptime(start_time, '%Y%m%d')
797
-        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
798
-        logs = logs.filter(created_at__range=(start_time, end_time))
799
-
800
-    logs = logs.order_by('-pk')
801
-
802
-    count = logs.count()
803
-    logs, left = pagination(logs, page, num)
804
-    logs = [log.admindata for log in logs]
805
-
806
-    return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
807
-        'logs': logs,
808
-        'left': left,
809
-        'count': count
810
-    })
811
-
812
-
813
-@check_admin
814
-def member_activity_detail(request, administrator):
815
-    activity_id = request.POST.get('activity_id', '')
816
-
817
-    try:
818
-        log = MemberActivityInfo.objects.get(activity_id=activity_id)
819
-    except MemberActivityInfo.DoesNotExist:
820
-        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
821
-
822
-    return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
823
-        'log': log.admindetails,
824
-    })
825
-
826
-
827
-@check_admin
828
-def member_activity_update(request, administrator):
829
-    activity_id = request.POST.get('activity_id', '')
830
-    activity_type = int(request.POST.get('activity_type', 0))
831
-    activity_section = int(request.POST.get('activity_section', 3))
832
-    title = request.POST.get('title', '')
833
-    subtitle = request.POST.get('subtitle', '')
834
-    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
835
-    end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
836
-    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
837
-    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
838
-    city = request.POST.get('city', '')
839
-    location = request.POST.get('location', '')
840
-    integral = int(request.POST.get('integral', 0))
841
-    is_slider = request.POST.get('is_slider', 0)
842
-    slider_image_path = request.POST.get('slider_image_path', '')
843
-    cover_path = request.POST.get('cover_path', '')
844
-    detail_image_path = request.POST.get('detail_image_path', '')
845
-    limit_image_num = int(request.POST.get('limit_image_num', 3))
846
-    is_signup = request.POST.get('is_signup', 0)
847
-    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
848
-    group_share_integral = int(request.POST.get('share_integral', 0))
849
-    content_rich_text = request.POST.get('content_rich_text', '')
850
-    share_h5_link = request.POST.get('share_h5_link', '')
851
-    activity_state = int(request.POST.get('activity_state', 0))
852
-    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
853
-    poster_content = request.POST.get('poster_content', '')
854
-    contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
855
-
856
-    try:
857
-        log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
858
-    except MemberActivityInfo.DoesNotExist:
859
-        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
860
-
861
-    log.activity_type = activity_type
862
-    log.activity_section = activity_section
863
-    log.title = title
864
-    log.subtitle = subtitle
865
-    log.date = date
866
-    log.start_date = start_date
867
-    log.end_date = end_date
868
-    log.start_display_date = start_display_date
869
-    log.end_display_date = end_display_date
870
-    log.city = city
871
-    log.location = location
872
-    log.integral = integral
873
-    log.is_slider = is_slider
874
-    log.slider_image = slider_image_path
875
-    log.cover = cover_path
876
-    log.image = detail_image_path
877
-    log.limit_image_num = limit_image_num
878
-    log.is_signup = is_signup
879
-    log.group_share_integral = group_share_integral
880
-    log.group_share_max_integral = group_share_max_integral
881
-    log.content_rich_text = content_rich_text
882
-    log.share_h5_link = share_h5_link
883
-    log.activity_state = activity_state
884
-    log.poster_kv_img_url = poster_kv_img_url
885
-    log.poster_content = poster_content
886
-    log.contribution_content_placeholder = contribution_content_placeholder
887
-    log.save()
888
-
889
-    return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功')
890
-
891
-
892
-@check_admin
893
-def member_activity_create(request, administrator):
894
-    activity_type = int(request.POST.get('activity_type', 0))
895
-    activity_section = int(request.POST.get('activity_section', 3))
896
-    title = request.POST.get('title', '')
897
-    subtitle = request.POST.get('subtitle', '')
898
-    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
899
-    end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
900
-    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
901
-    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
902
-    city = request.POST.get('city', '')
903
-    location = request.POST.get('location', '')
904
-    integral = int(request.POST.get('integral', 0))
905
-    is_slider = request.POST.get('is_slider', 0)
906
-    slider_image_path = request.POST.get('slider_image_path', '')
907
-    cover_path = request.POST.get('cover_path', '')
908
-    detail_image_path = request.POST.get('detail_image_path', '')
909
-    limit_image_num = int(request.POST.get('limit_image_num', 3))
910
-    is_signup = request.POST.get('is_signup', 0)
911
-    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
912
-    group_share_integral = int(request.POST.get('share_integral', 0))
913
-    content_rich_text = request.POST.get('content_rich_text', '')
914
-    share_h5_link = request.POST.get('share_h5_link', '')
915
-    activity_state = int(request.POST.get('activity_state', 0))
916
-    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
917
-    poster_content = request.POST.get('poster_content', '')
918
-    contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
919
-
920
-    act = MemberActivityInfo.objects.create(
921
-        brand_id=administrator.brand_id,
922
-        activity_type=activity_type,
923
-        activity_section=activity_section,
924
-        title=title,
925
-        subtitle=subtitle,
926
-        date=date,
927
-        start_date=start_date,
928
-        end_date=end_date,
929
-        start_display_date=start_display_date,
930
-        end_display_date=end_display_date,
931
-        city=city,
932
-        location=location,
933
-        integral=integral,
934
-        is_slider=is_slider,
935
-        slider_image=slider_image_path,
936
-        cover=cover_path,
937
-        image=detail_image_path,
938
-        limit_image_num=limit_image_num,
939
-        is_signup=is_signup,
940
-        group_share_max_integral=group_share_max_integral,
941
-        group_share_integral=group_share_integral,
942
-        content_rich_text=content_rich_text,
943
-        share_h5_link=share_h5_link,
944
-        activity_state=activity_state,
945
-        poster_kv_img_url=poster_kv_img_url,
946
-        poster_content=poster_content,
947
-        contribution_content_placeholder=contribution_content_placeholder,
948
-        is_upload_qiniu=True,
949
-    )
950
-
951
-    return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
952
-        'activity': act.admindetails
953
-    })
954
-
955
-
956
-@check_admin
957 771
 def member_activity_share_list(request, administrator):
958 772
     activity_id = request.POST.get('activity_id', '')
959 773
     page = int(request.POST.get('page', 1))

+ 0 - 4
api/urls.py

@@ -169,10 +169,6 @@ urlpatterns += [
169 169
     url(r'^admin/member/goods/order/update$', admin_views.member_goods_order_update, name='member_goods_order_update'),
170 170
     url(r'^admin/member/goods/order/batch/update$', admin_views.member_goods_order_batch_update, name='member_goods_order_batch_update'),
171 171
 
172
-    url(r'^admin/member/activity/list$', admin_views.member_activity_list, name='member_activity_list'),
173
-    url(r'^admin/member/activity/details$', admin_views.member_activity_detail, name='member_activity_detail'),
174
-    url(r'^admin/member/activity/update$', admin_views.member_activity_update, name='member_activity_update'),
175
-    url(r'^admin/member/activity/create$', admin_views.member_activity_create, name='member_activity_create'),
176 172
     url(r'^admin/member/activity/share/list$', admin_views.member_activity_share_list, name='member_activity_share_list'),
177 173
     url(r'^admin/member/activity/register/list$', admin_views.member_activity_register_list, name='member_activity_register_list'),
178 174
 

+ 216 - 0
member/activity_admin_views.py

@@ -0,0 +1,216 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+from django_logit import logit
5
+from django_response import response
6
+from paginator import pagination
7
+
8
+from member.models import MemberActivityInfo
9
+from kodo.decorators import check_admin
10
+from utils.error.errno_utils import MemberActivityStatusCode
11
+
12
+
13
+@check_admin
14
+def activity_list(request, administrator):
15
+    activity_type = request.POST.get('activity_type', '')
16
+    title = request.POST.get('title', '')
17
+    start_time = request.POST.get('start_time', '')
18
+    end_time = request.POST.get('end_time', '')
19
+    page = request.POST.get('page', 1)
20
+    num = request.POST.get('num', 20)
21
+    activity_state = request.POST.get('activity_state', '')
22
+    activity_section = request.POST.get('activity_section', '')
23
+    is_series = request.POST.get('is_series', '')
24
+
25
+    logs = MemberActivityInfo.objects.filter(status=True)
26
+
27
+    if is_series:
28
+        logs = logs.filter(is_series=True)
29
+
30
+    if activity_type:
31
+        logs = logs.filter(activity_type=activity_type)
32
+
33
+    if activity_section:
34
+        logs = logs.filter(activity_section=activity_section)
35
+
36
+    if activity_state:
37
+        logs = logs.filter(activity_state=activity_state)
38
+
39
+    if title:
40
+        logs = logs.filter(title__icontains=title)
41
+
42
+    if start_time and end_time:
43
+        start_time = datetime.strptime(start_time, '%Y%m%d')
44
+        end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
45
+        logs = logs.filter(created_at__range=(start_time, end_time))
46
+
47
+    logs = logs.order_by('-pk')
48
+
49
+    count = logs.count()
50
+    logs, left = pagination(logs, page, num)
51
+    logs = [log.admindata for log in logs]
52
+
53
+    return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
54
+        'logs': logs,
55
+        'left': left,
56
+        'count': count
57
+    })
58
+
59
+
60
+@check_admin
61
+def activity_detail(request, administrator):
62
+    activity_id = request.POST.get('activity_id', '')
63
+
64
+    try:
65
+        log = MemberActivityInfo.objects.get(activity_id=activity_id)
66
+    except MemberActivityInfo.DoesNotExist:
67
+        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
68
+
69
+    return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
70
+        'log': log.admindetails,
71
+    })
72
+
73
+
74
+@check_admin
75
+def activity_update(request, administrator):
76
+    activity_id = request.POST.get('activity_id', '')
77
+    activity_type = int(request.POST.get('activity_type', 0))
78
+    activity_section = int(request.POST.get('activity_section', 3))
79
+    title = request.POST.get('title', '')
80
+    subtitle = request.POST.get('subtitle', '')
81
+    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
82
+    end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
83
+    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
84
+    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
85
+    city = request.POST.get('city', '')
86
+    location = request.POST.get('location', '')
87
+    integral = int(request.POST.get('integral', 0))
88
+    is_slider = request.POST.get('is_slider', 0)
89
+    slider_image_path = request.POST.get('slider_image_path', '')
90
+    cover_path = request.POST.get('cover_path', '')
91
+    detail_image_path = request.POST.get('detail_image_path', '')
92
+    limit_image_num = int(request.POST.get('limit_image_num', 3))
93
+    is_signup = request.POST.get('is_signup', 0)
94
+    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
95
+    group_share_integral = int(request.POST.get('share_integral', 0))
96
+    content_rich_text = request.POST.get('content_rich_text', '')
97
+    share_h5_link = request.POST.get('share_h5_link', '')
98
+    activity_state = int(request.POST.get('activity_state', 0))
99
+    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
100
+    poster_content = request.POST.get('poster_content', '')
101
+    contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
102
+    fields = request.POST.get('fields', '')
103
+    is_series = request.POST.get('is_series', False)
104
+    main_activity_id = request.POST.get('main_activity_id', '')
105
+    limit_contribute_num = request.POST.get('limit_contribute_num', 1)
106
+
107
+    try:
108
+        log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
109
+    except MemberActivityInfo.DoesNotExist:
110
+        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
111
+
112
+    log.activity_type = activity_type
113
+    log.activity_section = activity_section
114
+    log.title = title
115
+    log.subtitle = subtitle
116
+    log.date = date
117
+    log.start_date = start_date
118
+    log.end_date = end_date
119
+    log.start_display_date = start_display_date
120
+    log.end_display_date = end_display_date
121
+    log.city = city
122
+    log.location = location
123
+    log.integral = integral
124
+    log.is_slider = is_slider
125
+    log.slider_image = slider_image_path
126
+    log.cover = cover_path
127
+    log.image = detail_image_path
128
+    log.limit_image_num = limit_image_num
129
+    log.is_signup = is_signup
130
+    log.group_share_integral = group_share_integral
131
+    log.group_share_max_integral = group_share_max_integral
132
+    log.content_rich_text = content_rich_text
133
+    log.share_h5_link = share_h5_link
134
+    log.activity_state = activity_state
135
+    log.poster_kv_img_url = poster_kv_img_url
136
+    log.poster_content = poster_content
137
+    log.contribution_content_placeholder = contribution_content_placeholder
138
+    log.fields = fields
139
+    log.is_series = is_series
140
+    log.main_activity_id = main_activity_id
141
+    log.limit_contribute_num = limit_contribute_num
142
+    log.save()
143
+
144
+    return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功')
145
+
146
+
147
+@check_admin
148
+def activity_create(request, administrator):
149
+    activity_type = int(request.POST.get('activity_type', 0))
150
+    activity_section = int(request.POST.get('activity_section', 3))
151
+    title = request.POST.get('title', '')
152
+    subtitle = request.POST.get('subtitle', '')
153
+    start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
154
+    end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
155
+    start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
156
+    end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
157
+    city = request.POST.get('city', '')
158
+    location = request.POST.get('location', '')
159
+    integral = int(request.POST.get('integral', 0))
160
+    is_slider = request.POST.get('is_slider', 0)
161
+    slider_image_path = request.POST.get('slider_image_path', '')
162
+    cover_path = request.POST.get('cover_path', '')
163
+    detail_image_path = request.POST.get('detail_image_path', '')
164
+    limit_image_num = int(request.POST.get('limit_image_num', 3))
165
+    is_signup = request.POST.get('is_signup', 0)
166
+    group_share_max_integral = int(request.POST.get('share_max_integral', 0))
167
+    group_share_integral = int(request.POST.get('share_integral', 0))
168
+    content_rich_text = request.POST.get('content_rich_text', '')
169
+    share_h5_link = request.POST.get('share_h5_link', '')
170
+    activity_state = int(request.POST.get('activity_state', 0))
171
+    poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
172
+    poster_content = request.POST.get('poster_content', '')
173
+    contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
174
+    fields = request.POST.get('fields', '')
175
+    is_series = request.POST.get('is_series', False)
176
+    main_activity_id = request.POST.get('main_activity_id', '')
177
+    limit_contribute_num = request.POST.get('limit_contribute_num', 1)
178
+
179
+    act = MemberActivityInfo.objects.create(
180
+        brand_id=administrator.brand_id,
181
+        activity_type=activity_type,
182
+        activity_section=activity_section,
183
+        title=title,
184
+        subtitle=subtitle,
185
+        date=date,
186
+        start_date=start_date,
187
+        end_date=end_date,
188
+        start_display_date=start_display_date,
189
+        end_display_date=end_display_date,
190
+        city=city,
191
+        location=location,
192
+        integral=integral,
193
+        is_slider=is_slider,
194
+        slider_image=slider_image_path,
195
+        cover=cover_path,
196
+        image=detail_image_path,
197
+        limit_image_num=limit_image_num,
198
+        is_signup=is_signup,
199
+        group_share_max_integral=group_share_max_integral,
200
+        group_share_integral=group_share_integral,
201
+        content_rich_text=content_rich_text,
202
+        share_h5_link=share_h5_link,
203
+        activity_state=activity_state,
204
+        poster_kv_img_url=poster_kv_img_url,
205
+        poster_content=poster_content,
206
+        contribution_content_placeholder=contribution_content_placeholder,
207
+        is_upload_qiniu=True,
208
+        fields=fields,
209
+        is_series=is_series,
210
+        main_activity_id=main_activity_id,
211
+        limit_contribute_num=limit_contribute_num,
212
+    )
213
+
214
+    return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
215
+        'activity': act.admindetails
216
+    })

+ 13 - 0
member/admin_urls.py

@@ -0,0 +1,13 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf.urls import url
4
+
5
+from member import activity_admin_views
6
+
7
+# activity
8
+urlpatterns = [
9
+    url(r'^member/activity/list$', activity_admin_views.activity_list, name='admin_member_activity_list'),  # 获取会员活动列表
10
+    url(r'^member/activity/details$', activity_admin_views.activity_detail, name='admin_member_activity_detail'),  # 获取会员活动详情
11
+    url(r'^member/activity/create$', activity_admin_views.activity_create, name='admin_member_activity_create'),  # 获取会员活动详情
12
+    url(r'^member/activity/update$', activity_admin_views.activity_update, name='admin_member_activity_update'),  # 获取会员活动详情
13
+]

+ 36 - 0
member/migrations/0057_auto_20230506_1643.py

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.6 on 2023-05-06 08:43
4
+
5
+from django.db import migrations, models
6
+import jsonfield.fields
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    dependencies = [
12
+        ('member', '0056_memberactivityinfo_activity_section'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.AddField(
17
+            model_name='memberactivityinfo',
18
+            name='fields',
19
+            field=jsonfield.fields.JSONField(blank=True, help_text='报名字段', null=True, verbose_name='fields'),
20
+        ),
21
+        migrations.AddField(
22
+            model_name='memberactivityinfo',
23
+            name='is_series',
24
+            field=models.BooleanField(default=False, help_text='是否为系列活动', verbose_name='is_series'),
25
+        ),
26
+        migrations.AddField(
27
+            model_name='memberactivityinfo',
28
+            name='limit_contribute_num',
29
+            field=models.IntegerField(default=0, help_text='限制投稿次数', verbose_name='limit_contribute_num'),
30
+        ),
31
+        migrations.AddField(
32
+            model_name='memberactivityinfo',
33
+            name='main_activity_id',
34
+            field=models.CharField(blank=True, default='', help_text='系列活动主活动唯一标识', max_length=32, verbose_name='main_activity_id'),
35
+        ),
36
+    ]

+ 26 - 0
member/migrations/0058_auto_20230506_1650.py

@@ -0,0 +1,26 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.6 on 2023-05-06 08:50
4
+
5
+from django.db import migrations, models
6
+import jsonfield.fields
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    dependencies = [
12
+        ('member', '0057_auto_20230506_1643'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.AlterField(
17
+            model_name='memberactivityinfo',
18
+            name='fields',
19
+            field=jsonfield.fields.JSONField(blank=True, default='[]', help_text='报名字段', null=True, verbose_name='fields'),
20
+        ),
21
+        migrations.AlterField(
22
+            model_name='memberactivityinfo',
23
+            name='limit_contribute_num',
24
+            field=models.IntegerField(default=1, help_text='限制投稿次数', verbose_name='limit_contribute_num'),
25
+        ),
26
+    ]

+ 22 - 0
member/models.py

@@ -430,6 +430,12 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin):
430 430
 
431 431
     is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛')
432 432
 
433
+    fields = JSONField(_(u'fields'), blank=True, null=True, default='[]', help_text=u'报名字段')
434
+    is_series = models.BooleanField(_(u'is_series'), default=False, help_text=u'是否为系列活动')
435
+    main_activity_id = models.CharField(_(u'main_activity_id'), max_length=32, blank=True, default='', help_text=u'系列活动主活动唯一标识')
436
+
437
+    limit_contribute_num = models.IntegerField(_(u'limit_contribute_num'), default=1, help_text=u'限制投稿次数')
438
+
433 439
     class Meta:
434 440
         verbose_name = _(u'会员活动信息')
435 441
         verbose_name_plural = _(u'会员活动信息')
@@ -548,6 +554,10 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin):
548 554
             'poster_kv_img_url': self.post_kv_image_url,
549 555
             'poster_content': self.poster_content,
550 556
             'contribution_content_placeholder': self.contribution_content_placeholder,
557
+            'fields': json.loads(self.fields) if self.fields else '',
558
+            'main_activity_id': self.main_activity_id,
559
+            'limit_contribute_num': self.limit_contribute_num,
560
+            'is_series': self.is_series,
551 561
         }
552 562
 
553 563
     def details(self, user_id):
@@ -587,6 +597,10 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin):
587 597
             'poster_kv_img_url': self.final_poster_kv_img_url,
588 598
             'poster_content': self.poster_content,
589 599
             'contribution_content_placeholder': self.contribution_content_placeholder,
600
+            'fields': json.loads(self.fields) if self.fields else '',
601
+            'main_activity_id': self.main_activity_id,
602
+            'limit_contribute_num': self.limit_contribute_num,
603
+            'is_series': self.is_series,
590 604
         }
591 605
 
592 606
     @property
@@ -628,6 +642,10 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin):
628 642
             'poster_content': self.poster_content,
629 643
             'contribution_content_placeholder': self.contribution_content_placeholder,
630 644
             'welfares': self.welfares,
645
+            'fields': json.loads(self.fields) if self.fields else '',
646
+            'main_activity_id': self.main_activity_id,
647
+            'limit_contribute_num': self.limit_contribute_num,
648
+            'is_series': self.is_series,
631 649
         }
632 650
 
633 651
     @property
@@ -674,6 +692,10 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin):
674 692
             'poster_content': self.poster_content,
675 693
             'contribution_content_placeholder': self.contribution_content_placeholder,
676 694
             'welfares': self.welfares,
695
+            'fields': json.loads(self.fields) if self.fields else '',
696
+            'main_activity_id': self.main_activity_id,
697
+            'limit_contribute_num': self.limit_contribute_num,
698
+            'is_series': self.is_series,
677 699
         }
678 700
 
679 701
 

+ 1 - 1
member/mp_urls.py

@@ -8,5 +8,5 @@ from member import activity_mp_views
8 8
 urlpatterns = [
9 9
     url(r'^member/activity/home$', activity_mp_views.activity_home, name='mp_member_activity_home'),  # 获取会员活动首页
10 10
     url(r'^member/activity/list$', activity_mp_views.activity_list, name='mp_member_activity_list'),  # 获取会员分区活动列表
11
-    url(r'^member/activity/detail$', activity_mp_views.activity_detail, name='mp_member_activity_detail'),  # 获取会员分区活动列表
11
+    url(r'^member/activity/detail$', activity_mp_views.activity_detail, name='mp_member_activity_detail'),  # 获取会员分区活动详情
12 12
 ]

+ 1 - 0
member/urls.py

@@ -5,4 +5,5 @@ from django.conf.urls import include, url
5 5
 
6 6
 urlpatterns = [
7 7
     url(r'^mp/', include(('member.mp_urls', 'member'), namespace='mp_member')),
8
+    url(r'^admin/', include(('member.admin_urls', 'member'), namespace='admin_member')),
8 9
 ]