xjc пре 2 година
родитељ
комит
4aca1680d9

+ 14 - 0
src/common/models.py

@@ -658,3 +658,17 @@ class UserArticleRelation(models.Model):
         db_table = "user_aritcle_relation"
         verbose_name = u"用户文章关联表"
         app_label = "common"
+
+
+class UserBlacks(models.Model):
+    """用户黑名单
+    """
+    user = models.ForeignKey(UserInfo,related_name="user")
+    black_user = models.ForeignKey(UserInfo,related_name="black_user")
+
+    ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
+
+    class Meta:
+        db_table = "user_blacks"
+        verbose_name = u"用户黑名单"
+        app_label = "common"

+ 61 - 0
src/utils/9906644_test.hunanwanzhu.com.pem

@@ -0,0 +1,61 @@
+-----BEGIN CERTIFICATE-----
+MIIF/DCCBOSgAwIBAgIQBVxNHUCnv+xHUUC2uNyIBzANBgkqhkiG9w0BAQsFADBu
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
+RFYgVExTIENBIC0gRzEwHhcNMjMwNTA0MDAwMDAwWhcNMjQwNTAzMjM1OTU5WjAf
+MR0wGwYDVQQDExR0ZXN0Lmh1bmFud2Fuemh1LmNvbTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKLhH496KvB47KS8qosgqcg7L/NVw4DWJH+BB+S7eL7s
+Z4HAW2LDGdez4L8+ZYg1DnQUrcBa+mdaqM9XdiI+X16hS0NNJmGFfVGLqoY7u2dz
+JGZoMMQHrAaKQS8KvVsC1zaKQP7RgH2F9uBgaL/Q7/XqAaN5WKrgZ7/SgOin7Yxu
+iTx9OJMyzkzxCvs80Mrf+M/KxPQmzu1rEGQD99XYp10mKm5JHPsJZITiOn2/BAHU
+pTr73WtEe6CqtB23FkE3sPLTipkcAZ8paE2Q/6VfEvvhZmpaVWQZaRpDm55c0XLi
++Yy5yEis/OcbomPomfcbQlIF8Gbmv7Utx055sJElBWUCAwEAAaOCAuMwggLfMB8G
+A1UdIwQYMBaAFFV0T7JyT/VgulDR1+ZRXJoBhxrXMB0GA1UdDgQWBBT74AzpkSLJ
+Ptwt1kPoyvKJh2MqmzAfBgNVHREEGDAWghR0ZXN0Lmh1bmFud2Fuemh1LmNvbTAO
+BgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4G
+A1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGln
+aWNlcnQuY29tL0NQUzCBgAYIKwYBBQUHAQEEdDByMCQGCCsGAQUFBzABhhhodHRw
+Oi8vb2NzcC5kaWdpY2VydC5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRz
+LmRpZ2ljZXJ0LmNvbS9FbmNyeXB0aW9uRXZlcnl3aGVyZURWVExTQ0EtRzEuY3J0
+MAkGA1UdEwQCMAAwggF9BgorBgEEAdZ5AgQCBIIBbQSCAWkBZwB2AO7N0GTV2xrO
+xVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAABh+dp0IwAAAQDAEcwRQIgEe6yMauR
+yQbzV1v8FUvLRmqCezmboAbpXK/nIyRsWugCIQCNPSMeORZRyrZ24fCMD9TcsCKm
+K4Lt69kAl1qviw2buwB1AHPZnokbTJZ4oCB9R53mssYc0FFecRkqjGuAEHrBd3K1
+AAABh+dp0H4AAAQDAEYwRAIgBkaHAv+GQRsuIrMjIjRo7J9VRUBoMTMOhJzRj6wY
+fakCIARMaUDi/kdaXRJBkMlXyrzfFLAD5ifcy07KMQwRXRhnAHYASLDja9qmRzQP
+5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGH52nQRwAABAMARzBFAiBlE+Qg18Hb
+CeA73izuVEwK+O+8f15VYIjbG+RB63nYKwIhAPRCC/fKnY5cdOsqT8zoKJEpT9fg
+/4lCdbnNvw5RQPC6MA0GCSqGSIb3DQEBCwUAA4IBAQCbB6cy2ObwGlXC9HMtvgBs
+FjtLNOElLXcjXXMHXQqGVj3vW0cOJ8jFIE+ijvLXpT9KYagtC508MTvH5mlU6g9B
+bGp0+g4yiDrF6/nra4TtO3B9kIZdlGfj01xzJOi6XUAy8NZmIJwDzTurG98WyaYX
+RA6Xwh/UgdpLeS0x3pID/OQOh0l8pewqGVWkSobq9Tj7ERcuvEEYkUrtDVFwvbT5
+RJ4+VmYMkQYNM5QmY6aSVrWtVG7YRHkDz7GMinUTSwQEU3S52JkDKboBBVlZ9EtO
+bykN9IOEZ+r0Iby3HVYIi7sUN45b4LkpEG0e6eaRczEd8hzbfUsTZ7CBD3OiDy4a
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
+oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
+lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
+pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
+yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
+wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
+pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
+BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
+Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
+Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
+/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
+MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
+SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
+M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
+4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
+sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
+rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
+-----END CERTIFICATE-----

+ 15 - 0
src/utils/application_key.pem

@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQCz9Y8mGaCImPvdxN5RTKgADIFqxb54Nf+eWFI6IgNMno4Nce4R
+/3L9djJi9Tjzzquo5WKT7Au/OK7kBypgDdgsAQXU083ryRVPYlgINGKn+/YAGHbx
+UEtsTXSB8b7x8XrsNjbWUArwbz4CFlYDOyn+yg5Guq2RwGV3j4rmkBhusQIDAQAB
+AoGACp2ftiWo3KX5pZlpa+5Tsr0KHVxQ4hJ9Y7/eCePbwfdQdeaUnqctB1qjmkbQ
+90Dny2zMpeE0yDD10CnEDCqE5+oqvAahTlmK5fPqoHISYjt8yKHPgNGVNob+0QI9
+tG2OQztpcX4gV2+vGQETryRPSM42KGAH0FqLG6RcXn6s9WECQQDty0OLm2FlbOv+
+fEMvGHP4VRZJmg6YlEoKdzVxP6RKGhLgWHSWRU4F0+kn/2712idCrB8+qa+QhxIP
+Z3ce2sNtAkEAwby9bO02GnhY36X58vVscNJN5AsyX2DHIair6zGms0B7dZvWshoG
+iDygRQniRr2O2sE0c2TvJGHkzqwviekJ1QJAF3nHs1KlrOOx8K/H2jBp0oxj5ORG
+qJ2LKblXF1UXHRGx52AUMnmpGD4xeHdpNvBQi+5+LyuFX5lWGRs30V37iQJBAKwd
+sLAH4cwMZPB0NSWa0fc9bwOMyvifMun9PpbZan7PZ59pjoh1xJ3eNoh/Km6sUzCW
++rEV17sb2TmfETDVPu0CQFcU0IPpGMxXHj94nRYyHe+Iw9bttG8rV1Soxa1C3yUZ
+P4iSjEynAcKtFoVyH+8lsJFkyKoRzcIwVCID/2EYa34=
+-----END RSA PRIVATE KEY-----

BIN
src/utils/cert/apiclient_cert.p12


+ 24 - 0
src/utils/cert/apiclient_cert.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID8DCCAtigAwIBAgIUNGP8lS9A00j7aHfCELACn5gHEOUwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjIwNTMxMTA0MzQ4WhcNMjcwNTMwMTA0MzQ4WjCBgTETMBEGA1UEAwwK
+MTYyNTQ5NDUwMzEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTplb/mspnmt7zojrHkv6Hmga/np5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYM
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKHnCVc56FLoaIOk9Xpxh0PyPykzoNVmr+p2CsmWiDvomGDspdQ5Mhqu
+L8X69de4cYjq+uwSgWFJT8PmIlJXu5iJGptJ0KmvuQta126hlw2L2QKSTSBleDhv
+3unG0xJs5PFP1i/v4OhaecMF8WzOZ1Dku+3CD7yXWWIQaIx/b0SS0ph/YLSegbwP
+aubhqi0R6iuDgSVJXdIw9+ZjG2ofSraEOPeHCM5A0SnMWj+Vu4CzMv4Uh57hlr/n
+l8xFHll+2RZNwWuVfZWLBzcaS2gm4GoXd/z7kXvlvKykaMmvqeWkaRWaYatj4vbI
+me8W8P2abwb3Yd/3cpyuGvyZ0cKB6V0CAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD
+VR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNv
+bS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1
+NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAPcobIPNkwJXfkErK
+jv12Ungs2XM7GeMS5izljoH8ldl+QWSPW6U9xmhVJBVj/7gfaaSLBeNAQAmcz/IE
+Yk79INxfgPo57VPauErMzKATOfixAiqr2M7nDq4AVRQd4/e+2bOr5pgHOhNzxw8/
+Q4fNYVusDcq4KJIte0thh6S4eOf0EvlRtbCFcMuNGU5i87EzOZDnKFAaoJ7p67/W
+ta9BLxOejv3C3Dn32ztGcR9T3IylfKUwG/HjWplpkh9hoL99CV1TYKii3NPfgxOf
+mbjWDY40pBuTjwdhgs0XwwGmOarg0fin2roISKc0CtuMfl8tyoSElFtqKG5ZDzET
+wD4kGQ==
+-----END CERTIFICATE-----

+ 28 - 0
src/utils/cert/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCh5wlXOehS6GiD
+pPV6cYdD8j8pM6DVZq/qdgrJlog76Jhg7KXUOTIari/F+vXXuHGI6vrsEoFhSU/D
+5iJSV7uYiRqbSdCpr7kLWtduoZcNi9kCkk0gZXg4b97pxtMSbOTxT9Yv7+DoWnnD
+BfFszmdQ5Lvtwg+8l1liEGiMf29EktKYf2C0noG8D2rm4aotEeorg4ElSV3SMPfm
+YxtqH0q2hDj3hwjOQNEpzFo/lbuAszL+FIee4Za/55fMRR5ZftkWTcFrlX2Viwc3
+GktoJuBqF3f8+5F75byspGjJr6nlpGkVmmGrY+L2yJnvFvD9mm8G92Hf93Kcrhr8
+mdHCgeldAgMBAAECggEARAeioyZP+tZxZC+iforJvcFCzPtGr6TwcmKbcc1w/Utl
+DAUkQSKvbQqYRGaJetWjz1Z9jUjRWKHHhJdlAJig2R1zMqE3rrWJ2b2YHIKFyEll
+LHFxOxWoCH7pee3zryBWqxdS9t2i8b9ivpH2ujOYsiMK3ILYvfQSuOQQKkk55ePo
+xb7JN8fgs3VlFi+jB0SOYgxncxJ/bDgGCsLcPT9QVZeLrI3oOPc81w4GwBDeJ3VT
+cd8OZXw9hp08afeTNZLvF/b4VHpm/zoGB6XF6i/xDpX/DGsCzI1LYg3ObVA0gwnL
+i2YFWWY7h4QBc5SoTE5VswXOrSGUrn+5jHAaIv97OQKBgQDMuu7NKYarXaP0v1nl
+OYLGnEaTO18DuBKPrVrjnuuFWgMziEzG1vhDceZDmOEf0lfWT0j11R+UUhHeohUd
+lHQ32Mly/knNMUhAy6DBFlm1hDBXnOJGAQeHpSPTDKUWr337sZysV4jSzFik82fS
+RAJWSjQKGOlECmRqaBcoSQNY/wKBgQDKcnUf95a1QwN3+vncM8NLSTreyMi7bVNI
+H/YGcsMMbph5InaLwF3ANnyrvlcROEMgrHdq2bRMI+wxKwr5c8D6kaDvoQNefsOl
+g6DUj0nDS7lfrdCbAQyT0eOaou57wTzYLLz7HE4kXAviGNYJBMH3hL+bzHtlXN4r
+QHnAOLjBowKBgQDHUdN+oMhA/KjMdqORvP0qWimH3Eyz9Tj08uTDKQzJxonJWRDO
+oaoRF8oD08qRzZrAxm4VEMpu/7vwEcMXClpfqMrwDsxRXoKmutkmQ5lRVIIwOkg9
+uXDYShnntq7fuDmimxga3hoSiOpgpa1Vk+rmkdW6Yuhv2uJKik7JZNRChwKBgAIn
+L3m0j2TEHrBS+f9OiaAuWjLuXbwokH8u39X3uH1UW8jGBg68cALQUYkeEBz9xTD+
+xJJdWF6K70Mimw5GHeJMVDLYOonxvTDwcnBwSa+LCaCr35EWdMTJsar+Wpz0VCpU
+Z3ogNfCLDhFMhFI6O7nfLo6AoTtVvoMlP2Y89DITAoGBAL58FxPW6AyqQU9RStqq
+XvJ88lCQGWonHu70UVkStMKIKpQuIByw4l+sPXFRQzupENGwrxquoYmxjxsdZVql
+gAyNunJHk/jjy0rJIScip99dAyIms94jcW2nxEpFKvx2dY/sPkmtFcEVTeOP/QzZ
+HE8912WKFbIBQG92ULixDjfD
+-----END PRIVATE KEY-----

BIN
src/utils/out.txt


+ 0 - 0
src/utils/test.txt


+ 67 - 0
src/utils/wxAppPay.py

@@ -0,0 +1,67 @@
+#-*-coding:utf-8-*-
+import requests
+import json,os
+import datetime,time
+import pprint
+
+
+class wxAppPay(object):
+    def __init__(self):
+        """
+        """
+        self.appid = "wxc37e33635b5bd6c1"
+        self.mchid = "1625494503"
+        self.notify_url = "https://api.hunanwanzhu.com/api/wx/v3/signup/notify"
+        self.apikey = "7ce0aeb3eeeb9406a88652f550d6275e"
+
+    def gen_signature(self,method,url,params,timestamp):
+        """
+        """
+        waiting_str = "%s\n" % method
+        waiting_str += "%s\n" % url
+        waiting_str += "%s\n" % timestamp
+        waiting_str += "%s\n\n" % timestamp
+        #waiting_str += "%s\n\n" % json.dumps(params)
+        
+        root = os.path.dirname(os.path.abspath(__file__))
+        pem_file = os.path.join(root,"cert/apiclient_key.pem")
+        sign_cmd = 'echo -n -e "%s" | openssl dgst -sha256 -sign %s | openssl base64 -A' % (waiting_str,pem_file)
+        pprint.pprint(sign_cmd)
+        sign = os.popen(sign_cmd).read()
+        pprint.pprint(sign)
+
+
+
+    def create_transaction_order(self,total_fee,description):
+        """
+        """
+        out_trade_no = "app"+datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(int(time.time()*1000))
+
+        url = "https://api.mch.weixin.qq.com/v3/pay/transactions/app"
+        sign_url = "/v3/pay/transactions/app"
+        params = {
+                "appid":self.appid, 
+                "mchid":self.mchid, 
+                "notify_url":self.notify_url, 
+                "out_trade_no":out_trade_no, 
+                "description":description, 
+                "amount":{"total":total_fee,"currency":"CNY"}
+            }
+
+        timestamp = int(time.time())
+        sign = self.gen_signature("POST",sign_url,params,timestamp)
+
+        Authorization = 'WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",signature="%s",timestamp="%s",serial_no="%s"' % (self.mchid,timestamp,sign,timestamp,self.apikey)
+        headers = {
+            "Authorization":Authorization
+        }
+        res = requests.post(url,json=params,headers=headers)
+        print(res.text)
+
+
+
+if __name__ == "__main__":
+    wxapppay = wxAppPay()
+    total_fee = 1
+    description = u"测试"
+    wxapppay.create_transaction_order(total_fee,description)

+ 47 - 0
src/weixin/controls.py

@@ -2379,10 +2379,15 @@ def add_comments(request):
     stock_id = qdata.get("stock_id")
     pid = qdata.get("pid")
     match_id = qdata.get("match_id")
+    target_user_id = qdata.get("target_user_id")
 
     ip = ccf.get_ip(request)
     location = ccf.get_city_from_ip(ip)
 
+    if record_id and target_user_id:
+        if cm.UserBlacks.objects.filter(user_id=user_id,black_user_id=target_user_id).exists():
+            raise ce.TipException(u"对不起,暂无法评论/留言!")
+
     obj = cm.Comments.objects.create(
         user_id = user_id, 
         user_name = user_name, 
@@ -2651,6 +2656,10 @@ def get_format_user_info(request):
         userinfo["is_follow"] = 1
     else:
         userinfo["is_follow"] = 0
+    if cm.UserBlacks.objects.filter(user_id=cur_user_id,black_user_id=user_id).exists():
+        userinfo["is_black"] = 1
+    else:
+        userinfo["is_black"] = 0
     return userinfo
 
 def get_day_inout_rank_list(request):
@@ -3092,4 +3101,42 @@ def get_user_avatar(records):
             item["avatar"]    = ""
 
 
+def black_user(request):
+    """
+    """
+    qdata = request.json
+    user_id = request.user.get("id",0)
+    black_user_id = qdata.get("black_user_id")
+    cm.UserBlacks.objects.get_or_create(
+        user_id = user_id, 
+        black_user_id = black_user_id
+    )
+
+
+def delete_black_user(request):
+    """
+    """
+    qdata = request.json
+    user_id = request.user.get("id",0)
+    black_user_id = qdata.get("black_user_id")
+    cm.UserBlacks.objects.filter(user_id=user_id,black_user_id=black_user_id).delete()
+    
 
+def get_user_black_user_list(request):
+    """
+    """
+    #user_id = 5709
+    user_id = request.user.get("id",0)
+    kwargs = request.json
+    qset = cm.UserBlacks.objects.filter(user_id=user_id)
+
+    page = int(kwargs.get("page",0))
+    page_size = int(kwargs.get("page_size",20))
+
+    if page and page_size:
+        total,qset = ccc.get_page_qset(qset,page,page_size)
+    else:
+        total = qset.count()
+
+    data = list(qset.values("black_user__id","black_user__username","black_user__avatar"))
+    return total,data

+ 2 - 0
src/weixin/urls_backstage.py

@@ -97,5 +97,7 @@ urlpatterns = [
     url(r'^v3/match/winlost/top5$', views.MatchWinlostTop5ListView.as_view()),
     url(r'^v3/ai/detect/image$', views.AiDetectImageView.as_view()),
     url(r'^v3/ai/detect/txt$', views.AiDetectTxtView.as_view()),
+    url(r'^v3/user/black$', views.UserBlacksView.as_view()),
+    url(r'^v3/user/black/list$', views.UserBlacksListView.as_view()),
 ]
 

+ 34 - 0
src/weixin/views.py

@@ -1478,3 +1478,37 @@ class AiDetectTxtView(cv.BaseView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class UserBlacksView(cv.BaseView):
+    def post(self, request):
+        """#拉黑用户(3.0小程序)
+        @black_user_id:1,拉黑用户id
+        """
+        try:
+            rst = ctl.black_user(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            return cv.to_fail(e)
+
+    def delete(self, request):
+        """#取消拉黑用户v3(3.0小程序)
+        @black_user_id:1,拉黑用户id
+        """
+        try:
+            rst = ctl.delete_black_user(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            return cv.to_fail(e)
+
+
+class UserBlacksListView(cv.BaseView):
+    def get(self, request):                                                        
+        """#用户黑名单(小程序)
+        """                                                                        
+        try:
+            total,rst = ctl.get_user_black_user_list(request)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)

+ 2 - 0
templates/topic/xsSignup.html

@@ -103,9 +103,11 @@
         </div>
         <br/><br/><br/><br/><br/><br/>
 
+<!--
         <div class="footer">
             <button class="signupBtn">立即报名</button> 
         </div>
+-->
     </div>
     <script>
         var app = new Vue({

+ 2 - 0
templates/topic/ykSignup.html

@@ -71,9 +71,11 @@
         <div class="data">比赛只做学习交流,不做任何投资建议,比赛系统内的选手操作与言论,仅代表选手个人意见,与比赛举办方无关,请勿跟风模仿,盈亏自负。如您发现比赛系统内有人发表不当言论,有任何割韭菜的嫌疑,请及时跟比赛方反应。</div>
         <br/><br/><br/><br/><br/><br/><br/>
 
+<!--
         <div class="footer">
             <button class="signupBtn">立即报名</button> 
         </div>
+-->
     </div>
     <script>
         var app = new Vue({