"430111": "雨花区", 2236
+    "430112": "望城区",
2237
+    "430121": "长沙县",
2238
+    "430124": "宁乡县",
2239
+    "430181": "浏阳市"
2240
+  },
2241
+  "430200": {
2242
+    "430202": "荷塘区",
2243
+    "430203": "芦淞区",
2244
+    "430204": "石峰区",
2245
+    "430211": "天元区",
2246
+    "430221": "株洲县",
2247
+    "430223": "攸县",
2248
+    "430224": "茶陵县",
2249
+    "430225": "炎陵县",
2250
+    "430281": "醴陵市"
2251
+  },
2252
+  "430300": {
2253
+    "430302": "雨湖区",
2254
+    "430304": "岳塘区",
2255
+    "430321": "湘潭县",
2256
+    "430381": "湘乡市",
2257
+    "430382": "韶山市"
2258
+  },
2259
+  "430400": {
2260
+    "430405": "珠晖区",
2261
+    "430406": "雁峰区",
2262
+    "430407": "石鼓区",
2263
+    "430408": "蒸湘区",
2264
+    "430412": "南岳区",
2265
+    "430421": "衡阳县",
2266
+    "430422": "衡南县",
2267
+    "430423": "衡山县",
2268
+    "430424": "衡东县",
2269
+    "430426": "祁东县",
2270
+    "430481": "耒阳市",
2271
+    "430482": "常宁市"
2272
+  },
2273
+  "430500": {
2274
+    "430502": "双清区",
2275
+    "430503": "大祥区",
2276
+    "430511": "北塔区",
2277
+    "430521": "邵东县",
2278
+    "430522": "新邵县",
2279
+    "430523": "邵阳县",
2280
+    "430524": "隆回县",
2281
+    "430525": "洞口县",
2282
+    "430527": "绥宁县",
2283
+    "430528": "新宁县",
2284
+    "430529": "城步苗族自治县",
2285
+    "430581": "武冈市"
2286
+  },
2287
+  "430600": {
2288
+    "430602": "岳阳楼区",
2289
+    "430603": "云溪区",
2290
+    "430611": "君山区",
2291
+    "430621": "岳阳县",
2292
+    "430623": "华容县",
2293
+    "430624": "湘阴县",
2294
+    "430626": "平江县",
2295
+    "430681": "汨罗市",
2296
+    "430682": "临湘市"
2297
+  },
2298
+  "430700": {
2299
+    "430702": "武陵区",
2300
+    "430703": "鼎城区",
2301
+    "430721": "安乡县",
2302
+    "430722": "汉寿县",
2303
+    "430723": "澧县",
2304
+    "430724": "临澧县",
2305
+    "430725": "桃源县",
2306
+    "430726": "石门县",
2307
+    "430781": "津市市"
2308
+  },
2309
+  "430800": {
2310
+    "430802": "永定区",
2311
+    "430811": "武陵源区",
2312
+    "430821": "慈利县",
2313
+    "430822": "桑植县"
2314
+  },
2315
+  "430900": {
2316
+    "430902": "资阳区",
2317
+    "430903": "赫山区",
2318
+    "430921": "南县",
2319
+    "430922": "桃江县",
2320
+    "430923": "安化县",
2321
+    "430981": "沅江市"
2322
+  },
2323
+  "431000": {
2324
+    "431002": "北湖区",
2325
+    "431003": "苏仙区",
2326
+    "431021": "桂阳县",
2327
+    "431022": "宜章县",
2328
+    "431023": "永兴县",
2329
+    "431024": "嘉禾县",
2330
+    "431025": "临武县",
2331
+    "431026": "汝城县",
2332
+    "431027": "桂东县",
2333
+    "431028": "安仁县",
2334
+    "431081": "资兴市"
2335
+  },
2336
+  "431100": {
2337
+    "431102": "零陵区",
2338
+    "431103": "冷水滩区",
2339
+    "431121": "祁阳县",
2340
+    "431122": "东安县",
2341
+    "431123": "双牌县",
2342
+    "431124": "道县",
2343
+    "431125": "江永县",
2344
+    "431126": "宁远县",
2345
+    "431127": "蓝山县",
2346
+    "431128": "新田县",
2347
+    "431129": "江华瑶族自治县"
2348
+  },
2349
+  "431200": {
2350
+    "431202": "鹤城区",
2351
+    "431221": "中方县",
2352
+    "431222": "沅陵县",
2353
+    "431223": "辰溪县",
2354
+    "431224": "溆浦县",
2355
+    "431225": "会同县",
2356
+    "431226": "麻阳苗族自治县",
2357
+    "431227": "新晃侗族自治县",
2358
+    "431228": "芷江侗族自治县",
2359
+    "431229": "靖州苗族侗族自治县",
2360
+    "431230": "通道侗族自治县",
2361
+    "431281": "洪江市"
2362
+  },
2363
+  "431300": {
2364
+    "431302": "娄星区",
2365
+    "431321": "双峰县",
2366
+    "431322": "新化县",
2367
+    "431381": "冷水江市",
2368
+    "431382": "涟源市"
2369
+  },
2370
+  "433100": {
2371
+    "433101": "吉首市",
2372
+    "433122": "泸溪县",
2373
+    "433123": "凤凰县",
2374
+    "433124": "花垣县",
2375
+    "433125": "保靖县",
2376
+    "433126": "古丈县",
2377
+    "433127": "永顺县",
2378
+    "433130": "龙山县"
2379
+  },
2380
+  "440000": {
2381
+    "440100": "广州市",
2382
+    "440200": "韶关市",
2383
+    "440300": "深圳市",
2384
+    "440400": "珠海市",
2385
+    "440500": "汕头市",
2386
+    "440600": "佛山市",
2387
+    "440700": "江门市",
2388
+    "440800": "湛江市",
2389
+    "440900": "茂名市",
2390
+    "441200": "肇庆市",
2391
+    "441300": "惠州市",
2392
+    "441400": "梅州市",
2393
+    "441500": "汕尾市",
2394
+    "441600": "河源市",
2395
+    "441700": "阳江市",
2396
+    "441800": "清远市",
2397
+    "441900": "东莞市",
2398
+    "442000": "中山市",
2399
+    "445100": "潮州市",
2400
+    "445200": "揭阳市",
2401
+    "445300": "云浮市"
2402
+  },
2403
+  "440100": {
2404
+    "440103": "荔湾区",
2405
+    "440104": "越秀区",
2406
+    "440105": "海珠区",
2407
+    "440106": "天河区",
2408
+    "440111": "白云区",
2409
+    "440112": "黄埔区",
2410
+    "440113": "番禺区",
2411
+    "440114": "花都区",
2412
+    "440115": "南沙区",
2413
+    "440117": "从化区",
2414
+    "440118": "增城区"
2415
+  },
2416
+  "440200": {
2417
+    "440203": "武江区",
2418
+    "440204": "浈江区",
2419
+    "440205": "曲江区",
2420
+    "440222": "始兴县",
2421
+    "440224": "仁化县",
2422
+    "440229": "翁源县",
2423
+    "440232": "乳源瑶族自治县",
2424
+    "440233": "新丰县",
2425
+    "440281": "乐昌市",
2426
+    "440282": "南雄市"
2427
+  },
2428
+  "440300": {
2429
+    "440303": "罗湖区",
2430
+    "440304": "福田区",
2431
+    "440305": "南山区",
2432
+    "440306": "宝安区",
2433
+    "440307": "龙岗区",
2434
+    "440308": "盐田区"
2435
+  },
2436
+  "440400": {
2437
+    "440402": "香洲区",
2438
+    "440403": "斗门区",
2439
+    "440404": "金湾区"
2440
+  },
2441
+  "440500": {
2442
+    "440507": "龙湖区",
2443
+    "440511": "金平区",
2444
+    "440512": "濠江区",
2445
+    "440513": "潮阳区",
2446
+    "440514": "潮南区",
2447
+    "440515": "澄海区",
2448
+    "440523": "南澳县"
2449
+  },
2450
+  "440600": {
2451
+    "440604": "禅城区",
2452
+    "440605": "南海区",
2453
+    "440606": "顺德区",
2454
+    "440607": "三水区",
2455
+    "440608": "高明区"
2456
+  },
2457
+  "440700": {
2458
+    "440703": "蓬江区",
2459
+    "440704": "江海区",
2460
+    "440705": "新会区",
2461
+    "440781": "台山市",
2462
+    "440783": "开平市",
2463
+    "440784": "鹤山市",
2464
+    "440785": "恩平市"
2465
+  },
2466
+  "440800": {
2467
+    "440802": "赤坎区",
2468
+    "440803": "霞山区",
2469
+    "440804": "坡头区",
2470
+    "440811": "麻章区",
2471
+    "440823": "遂溪县",
2472
+    "440825": "徐闻县",
2473
+    "440881": "廉江市",
2474
+    "440882": "雷州市",
2475
+    "440883": "吴川市"
2476
+  },
2477
+  "440900": {
2478
+    "440902": "茂南区",
2479
+    "440904": "电白区",
2480
+    "440981": "高州市",
2481
+    "440982": "化州市",
2482
+    "440983": "信宜市"
2483
+  },
2484
+  "441200": {
2485
+    "441202": "端州区",
2486
+    "441203": "鼎湖区",
2487
+    "441204": "高要区",
2488
+    "441223": "广宁县",
2489
+    "441224": "怀集县",
2490
+    "441225": "封开县",
2491
+    "441226": "德庆县",
2492
+    "441284": "四会市"
2493
+  },
2494
+  "441300": {
2495
+    "441302": "惠城区",
2496
+    "441303": "惠阳区",
2497
+    "441322": "博罗县",
2498
+    "441323": "惠东县",
2499
+    "441324": "龙门县"
2500
+  },
2501
+  "441400": {
2502
+    "441402": "梅江区",
2503
+    "441403": "梅县区",
2504
+    "441422": "大埔县",
2505
+    "441423": "丰顺县",
2506
+    "441424": "五华县",
2507
+    "441426": "平远县",
2508
+    "441427": "蕉岭县",
2509
+    "441481": "兴宁市"
2510
+  },
2511
+  "441500": {
2512
+    "441502": "城区",
2513
+    "441521": "海丰县",
2514
+    "441523": "陆河县",
2515
+    "441581": "陆丰市"
2516
+  },
2517
+  "441600": {
2518
+    "441602": "源城区",
2519
+    "441621": "紫金县",
2520
+    "441622": "龙川县",
2521
+    "441623": "连平县",
2522
+    "441624": "和平县",
2523
+    "441625": "东源县"
2524
+  },
2525
+  "441700": {
2526
+    "441702": "江城区",
2527
+    "441704": "阳东区",
2528
+    "441721": "阳西县",
2529
+    "441781": "阳春市"
2530
+  },
2531
+  "441800": {
2532
+    "441802": "清城区",
2533
+    "441803": "清新区",
2534
+    "441821": "佛冈县",
2535
+    "441823": "阳山县",
2536
+    "441825": "连山壮族瑶族自治县",
2537
+    "441826": "连南瑶族自治县",
2538
+    "441881": "英德市",
2539
+    "441882": "连州市"
2540
+  },
2541
+  "445100": {
2542
+    "445102": "湘桥区",
2543
+    "445103": "潮安区",
2544
+    "445122": "饶平县"
2545
+  },
2546
+  "445200": {
2547
+    "445202": "榕城区",
2548
+    "445203": "揭东区",
2549
+    "445222": "揭西县",
2550
+    "445224": "惠来县",
2551
+    "445281": "普宁市"
2552
+  },
2553
+  "445300": {
2554
+    "445302": "云城区",
2555
+    "445303": "云安区",
2556
+    "445321": "新兴县",
2557
+    "445322": "郁南县",
2558
+    "445381": "罗定市"
2559
+  },
2560
+  "450000": {
2561
+    "450100": "南宁市",
2562
+    "450200": "柳州市",
2563
+    "450300": "桂林市",
2564
+    "450400": "梧州市",
2565
+    "450500": "北海市",
2566
+    "450600": "防城港市",
2567
+    "450700": "钦州市",
2568
+    "450800": "贵港市",
2569
+    "450900": "玉林市",
2570
+    "451000": "百色市",
2571
+    "451100": "贺州市",
2572
+    "451200": "河池市",
2573
+    "451300": "来宾市",
2574
+    "451400": "崇左市"
2575
+  },
2576
+  "450100": {
2577
+    "450102": "兴宁区",
2578
+    "450103": "青秀区",
2579
+    "450105": "江南区",
2580
+    "450107": "西乡塘区",
2581
+    "450108": "良庆区",
2582
+    "450109": "邕宁区",
2583
+    "450110": "武鸣区",
2584
+    "450123": "隆安县",
2585
+    "450124": "马山县",
2586
+    "450125": "上林县",
2587
+    "450126": "宾阳县",
2588
+    "450127": "横县"
2589
+  },
2590
+  "450200": {
2591
+    "450202": "城中区",
2592
+    "450203": "鱼峰区",
2593
+    "450204": "柳南区",
2594
+    "450205": "柳北区",
2595
+    "450206": "柳江区",
2596
+    "450222": "柳城县",
2597
+    "450223": "鹿寨县",
2598
+    "450224": "融安县",
2599
+    "450225": "融水苗族自治县",
2600
+    "450226": "三江侗族自治县"
2601
+  },
2602
+  "450300": {
2603
+    "450302": "秀峰区",
2604
+    "450303": "叠彩区",
2605
+    "450304": "象山区",
2606
+    "450305": "七星区",
2607
+    "450311": "雁山区",
2608
+    "450312": "临桂区",
2609
+    "450321": "阳朔县",
2610
+    "450323": "灵川县",
2611
+    "450324": "全州县",
2612
+    "450325": "兴安县",
2613
+    "450326": "永福县",
2614
+    "450327": "灌阳县",
2615
+    "450328": "龙胜各族自治县",
2616
+    "450329": "资源县",
2617
+    "450330": "平乐县",
2618
+    "450331": "荔浦县",
2619
+    "450332": "恭城瑶族自治县"
2620
+  },
2621
+  "450400": {
2622
+    "450403": "万秀区",
2623
+    "450405": "长洲区",
2624
+    "450406": "龙圩区",
2625
+    "450421": "苍梧县",
2626
+    "450422": "藤县",
2627
+    "450423": "蒙山县",
2628
+    "450481": "岑溪市"
2629
+  },
2630
+  "450500": {
2631
+    "450502": "海城区",
2632
+    "450503": "银海区",
2633
+    "450512": "铁山港区",
2634
+    "450521": "合浦县"
2635
+  },
2636
+  "450600": {
2637
+    "450602": "港口区",
2638
+    "450603": "防城区",
2639
+    "450621": "上思县",
2640
+    "450681": "东兴市"
2641
+  },
2642
+  "450700": {
2643
+    "450702": "钦南区",
2644
+    "450703": "钦北区",
2645
+    "450721": "灵山县",
2646
+    "450722": "浦北县"
2647
+  },
2648
+  "450800": {
2649
+    "450802": "港北区",
2650
+    "450803": "港南区",
2651
+    "450804": "覃塘区",
2652
+    "450821": "平南县",
2653
+    "450881": "桂平市"
2654
+  },
2655
+  "450900": {
2656
+    "450902": "玉州区",
2657
+    "450903": "福绵区",
2658
+    "450921": "容县",
2659
+    "450922": "陆川县",
2660
+    "450923": "博白县",
2661
+    "450924": "兴业县",
2662
+    "450981": "北流市"
2663
+  },
2664
+  "451000": {
2665
+    "451002": "右江区",
2666
+    "451021": "田阳县",
2667
+    "451022": "田东县",
2668
+    "451023": "平果县",
2669
+    "451024": "德保县",
2670
+    "451026": "那坡县",
2671
+    "451027": "凌云县",
2672
+    "451028": "乐业县",
2673
+    "451029": "田林县",
2674
+    "451030": "西林县",
2675
+    "451031": "隆林各族自治县",
2676
+    "451081": "靖西市"
2677
+  },
2678
+  "451100": {
2679
+    "451102": "八步区",
2680
+    "451103": "平桂区",
2681
+    "451121": "昭平县",
2682
+    "451122": "钟山县",
2683
+    "451123": "富川瑶族自治县"
2684
+  },
2685
+  "451200": {
2686
+    "451202": "金城江区",
2687
+    "451221": "南丹县",
2688
+    "451222": "天峨县",
2689
+    "451223": "凤山县",
2690
+    "451224": "东兰县",
2691
+    "451225": "罗城仫佬族自治县",
2692
+    "451226": "环江毛南族自治县",
2693
+    "451227": "巴马瑶族自治县",
2694
+    "451228": "都安瑶族自治县",
2695
+    "451229": "大化瑶族自治县",
2696
+    "451281": "宜州市"
2697
+  },
2698
+  "451300": {
2699
+    "451302": "兴宾区",
2700
+    "451321": "忻城县",
2701
+    "451322": "象州县",
2702
+    "451323": "武宣县",
2703
+    "451324": "金秀瑶族自治县",
2704
+    "451381": "合山市"
2705
+  },
2706
+  "451400": {
2707
+    "451402": "江州区",
2708
+    "451421": "扶绥县",
2709
+    "451422": "宁明县",
2710
+    "451423": "龙州县",
2711
+    "451424": "大新县",
2712
+    "451425": "天等县",
2713
+    "451481": "凭祥市"
2714
+  },
2715
+  "460000": {
2716
+    "460100": "海口市",
2717
+    "460200": "三亚市",
2718
+    "460300": "三沙市",
2719
+    "460400": "儋州市",
2720
+    "469001": "五指山市",
2721
+    "469002": "琼海市",
2722
+    "469005": "文昌市",
2723
+    "469006": "万宁市",
2724
+    "469007": "东方市",
2725
+    "469021": "定安县",
2726
+    "469022": "屯昌县",
2727
+    "469023": "澄迈县",
2728
+    "469024": "临高县",
2729
+    "469025": "白沙黎族自治县",
2730
+    "469026": "昌江黎族自治县",
2731
+    "469027": "乐东黎族自治县",
2732
+    "469028": "陵水黎族自治县",
2733
+    "469029": "保亭黎族苗族自治县",
2734
+    "469030": "琼中黎族苗族自治县"
2735
+  },
2736
+  "460100": {
2737
+    "460105": "秀英区",
2738
+    "460106": "龙华区",
2739
+    "460107": "琼山区",
2740
+    "460108": "美兰区"
2741
+  },
2742
+  "460200": {
2743
+    "460202": "海棠区",
2744
+    "460203": "吉阳区",
2745
+    "460204": "天涯区",
2746
+    "460205": "崖州区"
2747
+  },
2748
+  "500000": {
2749
+    "500100": "市辖区"
2750
+  },
2751
+  "500100": {
2752
+    "500101": "万州区",
2753
+    "500102": "涪陵区",
2754
+    "500103": "渝中区",
2755
+    "500104": "大渡口区",
2756
+    "500105": "江北区",
2757
+    "500106": "沙坪坝区",
2758
+    "500107": "九龙坡区",
2759
+    "500108": "南岸区",
2760
+    "500109": "北碚区",
2761
+    "500110": "綦江区",
2762
+    "500111": "大足区",
2763
+    "500112": "渝北区",
2764
+    "500113": "巴南区",
2765
+    "500114": "黔江区",
2766
+    "500115": "长寿区",
2767
+    "500116": "江津区",
2768
+    "500117": "合川区",
2769
+    "500118": "永川区",
2770
+    "500119": "南川区",
2771
+    "500120": "璧山区",
2772
+    "500151": "铜梁区",
2773
+    "500152": "潼南区",
2774
+    "500153": "荣昌区",
2775
+    "500154": "开州区",
2776
+    "500228": "梁平县",
2777
+    "500229": "城口县",
2778
+    "500230": "丰都县",
2779
+    "500231": "垫江县",
2780
+    "500232": "武隆县",
2781
+    "500233": "忠县",
2782
+    "500235": "云阳县",
2783
+    "500236": "奉节县",
2784
+    "500237": "巫山县",
2785
+    "500238": "巫溪县",
2786
+    "500240": "石柱土家族自治县",
2787
+    "500241": "秀山土家族苗族自治县",
2788
+    "500242": "酉阳土家族苗族自治县",
2789
+    "500243": "彭水苗族土家族自治县"
2790
+  },
2791
+  "510000": {
2792
+    "510100": "成都市",
2793
+    "510300": "自贡市",
2794
+    "510400": "攀枝花市",
2795
+    "510500": "泸州市",
2796
+    "510600": "德阳市",
2797
+    "510700": "绵阳市",
2798
+    "510800": "广元市",
2799
+    "510900": "遂宁市",
2800
+    "511000": "内江市",
2801
+    "511100": "乐山市",
2802
+    "511300": "南充市",
2803
+    "511400": "眉山市",
2804
+    "511500": "宜宾市",
2805
+    "511600": "广安市",
2806
+    "511700": "达州市",
2807
+    "511800": "雅安市",
2808
+    "511900": "巴中市",
2809
+    "512000": "资阳市",
2810
+    "513200": "阿坝藏族羌族自治州",
2811
+    "513300": "甘孜藏族自治州",
2812
+    "513400": "凉山彝族自治州"
2813
+  },
2814
+  "510100": {
2815
+    "510104": "锦江区",
2816
+    "510105": "青羊区",
2817
+    "510106": "金牛区",
2818
+    "510107": "武侯区",
2819
+    "510108": "成华区",
2820
+    "510112": "龙泉驿区",
2821
+    "510113": "青白江区",
2822
+    "510114": "新都区",
2823
+    "510115": "温江区",
2824
+    "510116": "双流区",
2825
+    "510121": "金堂县",
2826
+    "510124": "郫县",
2827
+    "510129": "大邑县",
2828
+    "510131": "蒲江县",
2829
+    "510132": "新津县",
2830
+    "510181": "都江堰市",
2831
+    "510182": "彭州市",
2832
+    "510183": "邛崃市",
2833
+    "510184": "崇州市",
2834
+    "510185": "简阳市"
2835
+  },
2836
+  "510300": {
2837
+    "510302": "自流井区",
2838
+    "510303": "贡井区",
2839
+    "510304": "大安区",
2840
+    "510311": "沿滩区",
2841
+    "510321": "荣县",
2842
+    "510322": "富顺县"
2843
+  },
2844
+  "510400": {
2845
+    "510402": "东区",
2846
+    "510403": "西区",
2847
+    "510411": "仁和区",
2848
+    "510421": "米易县",
2849
+    "510422": "盐边县"
2850
+  },
2851
+  "510500": {
2852
+    "510502": "江阳区",
2853
+    "510503": "纳溪区",
2854
+    "510504": "龙马潭区",
2855
+    "510521": "泸县",
2856
+    "510522": "合江县",
2857
+    "510524": "叙永县",
2858
+    "510525": "古蔺县"
2859
+  },
2860
+  "510600": {
2861
+    "510603": "旌阳区",
2862
+    "510623": "中江县",
2863
+    "510626": "罗江县",
2864
+    "510681": "广汉市",
2865
+    "510682": "什邡市",
2866
+    "510683": "绵竹市"
2867
+  },
2868
+  "510700": {
2869
+    "510703": "涪城区",
2870
+    "510704": "游仙区",
2871
+    "510705": "安州区",
2872
+    "510722": "三台县",
2873
+    "510723": "盐亭县",
2874
+    "510725": "梓潼县",
2875
+    "510726": "北川羌族自治县",
2876
+    "510727": "平武县",
2877
+    "510781": "江油市"
2878
+  },
2879
+  "510800": {
2880
+    "510802": "利州区",
2881
+    "510811": "昭化区",
2882
+    "510812": "朝天区",
2883
+    "510821": "旺苍县",
2884
+    "510822": "青川县",
2885
+    "510823": "剑阁县",
2886
+    "510824": "苍溪县"
2887
+  },
2888
+  "510900": {
2889
+    "510903": "船山区",
2890
+    "510904": "安居区",
2891
+    "510921": "蓬溪县",
2892
+    "510922": "射洪县",
2893
+    "510923": "大英县"
2894
+  },
2895
+  "511000": {
2896
+    "511002": "市中区",
2897
+    "511011": "东兴区",
2898
+    "511024": "威远县",
2899
+    "511025": "资中县",
2900
+    "511028": "隆昌县"
2901
+  },
2902
+  "511100": {
2903
+    "511102": "市中区",
2904
+    "511111": "沙湾区",
2905
+    "511112": "五通桥区",
2906
+    "511113": "金口河区",
2907
+    "511123": "犍为县",
2908
+    "511124": "井研县",
2909
+    "511126": "夹江县",
2910
+    "511129": "沐川县",
2911
+    "511132": "峨边彝族自治县",
2912
+    "511133": "马边彝族自治县",
2913
+    "511181": "峨眉山市"
2914
+  },
2915
+  "511300": {
2916
+    "511302": "顺庆区",
2917
+    "511303": "高坪区",
2918
+    "511304": "嘉陵区",
2919
+    "511321": "南部县",
2920
+    "511322": "营山县",
2921
+    "511323": "蓬安县",
2922
+    "511324": "仪陇县",
2923
+    "511325": "西充县",
2924
+    "511381": "阆中市"
2925
+  },
2926
+  "511400": {
2927
+    "511402": "东坡区",
2928
+    "511403": "彭山区",
2929
+    "511421": "仁寿县",
2930
+    "511423": "洪雅县",
2931
+    "511424": "丹棱县",
2932
+    "511425": "青神县"
2933
+  },
2934
+  "511500": {
2935
+    "511502": "翠屏区",
2936
+    "511503": "南溪区",
2937
+    "511521": "宜宾县",
2938
+    "511523": "江安县",
2939
+    "511524": "长宁县",
2940
+    "511525": "高县",
2941
+    "511526": "珙县",
2942
+    "511527": "筠连县",
2943
+    "511528": "兴文县",
2944
+    "511529": "屏山县"
2945
+  },
2946
+  "511600": {
2947
+    "511602": "广安区",
2948
+    "511603": "前锋区",
2949
+    "511621": "岳池县",
2950
+    "511622": "武胜县",
2951
+    "511623": "邻水县",
2952
+    "511681": "华蓥市"
2953
+  },
2954
+  "511700": {
2955
+    "511702": "通川区",
2956
+    "511703": "达川区",
2957
+    "511722": "宣汉县",
2958
+    "511723": "开江县",
2959
+    "511724": "大竹县",
2960
+    "511725": "渠县",
2961
+    "511781": "万源市"
2962
+  },
2963
+  "511800": {
2964
+    "511802": "雨城区",
2965
+    "511803": "名山区",
2966
+    "511822": "荥经县",
2967
+    "511823": "汉源县",
2968
+    "511824": "石棉县",
2969
+    "511825": "天全县",
2970
+    "511826": "芦山县",
2971
+    "511827": "宝兴县"
2972
+  },
2973
+  "511900": {
2974
+    "511902": "巴州区",
2975
+    "511903": "恩阳区",
2976
+    "511921": "通江县",
2977
+    "511922": "南江县",
2978
+    "511923": "平昌县"
2979
+  },
2980
+  "512000": {
2981
+    "512002": "雁江区",
2982
+    "512021": "安岳县",
2983
+    "512022": "乐至县"
2984
+  },
2985
+  "513200": {
2986
+    "513201": "马尔康市",
2987
+    "513221": "汶川县",
2988
+    "513222": "理县",
2989
+    "513223": "茂县",
2990
+    "513224": "松潘县",
2991
+    "513225": "九寨沟县",
2992
+    "513226": "金川县",
2993
+    "513227": "小金县",
2994
+    "513228": "黑水县",
2995
+    "513230": "壤塘县",
2996
+    "513231": "阿坝县",
2997
+    "513232": "若尔盖县",
2998
+    "513233": "红原县"
2999
+  },
3000
+  "513300": {
3001
+    "513301": "康定市",
3002
+    "513322": "泸定县",
3003
+    "513323": "丹巴县",
3004
+    "513324": "九龙县",
3005
+    "513325": "雅江县",
3006
+    "513326": "道孚县",
3007
+    "513327": "炉霍县",
3008
+    "513328": "甘孜县",
3009
+    "513329": "新龙县",
3010
+    "513330": "德格县",
3011
+    "513331": "白玉县",
3012
+    "513332": "石渠县",
3013
+    "513333": "色达县",
3014
+    "513334": "理塘县",
3015
+    "513335": "巴塘县",
3016
+    "513336": "乡城县",
3017
+    "513337": "稻城县",
3018
+    "513338": "得荣县"
3019
+  },
3020
+  "513400": {
3021
+    "513401": "西昌市",
3022
+    "513422": "木里藏族自治县",
3023
+    "513423": "盐源县",
3024
+    "513424": "德昌县",
3025
+    "513425": "会理县",
3026
+    "513426": "会东县",
3027
+    "513427": "宁南县",
3028
+    "513428": "普格县",
3029
+    "513429": "布拖县",
3030
+    "513430": "金阳县",
3031
+    "513431": "昭觉县",
3032
+    "513432": "喜德县",
3033
+    "513433": "冕宁县",
3034
+    "513434": "越西县",
3035
+    "513435": "甘洛县",
3036
+    "513436": "美姑县",
3037
+    "513437": "雷波县"
3038
+  },
3039
+  "520000": {
3040
+    "520100": "贵阳市",
3041
+    "520200": "六盘水市",
3042
+    "520300": "遵义市",
3043
+    "520400": "安顺市",
3044
+    "520500": "毕节市",
3045
+    "520600": "铜仁市",
3046
+    "522300": "黔西南布依族苗族自治州",
3047
+    "522600": "黔东南苗族侗族自治州",
3048
+    "522700": "黔南布依族苗族自治州"
3049
+  },
3050
+  "520100": {
3051
+    "520102": "南明区",
3052
+    "520103": "云岩区",
3053
+    "520111": "花溪区",
3054
+    "520112": "乌当区",
3055
+    "520113": "白云区",
3056
+    "520115": "观山湖区",
3057
+    "520121": "开阳县",
3058
+    "520122": "息烽县",
3059
+    "520123": "修文县",
3060
+    "520181": "清镇市"
3061
+  },
3062
+  "520200": {
3063
+    "520201": "钟山区",
3064
+    "520203": "六枝特区",
3065
+    "520221": "水城县",
3066
+    "520222": "盘县"
3067
+  },
3068
+  "520300": {
3069
+    "520302": "红花岗区",
3070
+    "520303": "汇川区",
3071
+    "520304": "播州区",
3072
+    "520322": "桐梓县",
3073
+    "520323": "绥阳县",
3074
+    "520324": "正安县",
3075
+    "520325": "道真仡佬族苗族自治县",
3076
+    "520326": "务川仡佬族苗族自治县",
3077
+    "520327": "凤冈县",
3078
+    "520328": "湄潭县",
3079
+    "520329": "余庆县",
3080
+    "520330": "习水县",
3081
+    "520381": "赤水市",
3082
+    "520382": "仁怀市"
3083
+  },
3084
+  "520400": {
3085
+    "520402": "西秀区",
3086
+    "520403": "平坝区",
3087
+    "520422": "普定县",
3088
+    "520423": "镇宁布依族苗族自治县",
3089
+    "520424": "关岭布依族苗族自治县",
3090
+    "520425": "紫云苗族布依族自治县"
3091
+  },
3092
+  "520500": {
3093
+    "520502": "七星关区",
3094
+    "520521": "大方县",
3095
+    "520522": "黔西县",
3096
+    "520523": "金沙县",
3097
+    "520524": "织金县",
3098
+    "520525": "纳雍县",
3099
+    "520526": "威宁彝族回族苗族自治县",
3100
+    "520527": "赫章县"
3101
+  },
3102
+  "520600": {
3103
+    "520602": "碧江区",
3104
+    "520603": "万山区",
3105
+    "520621": "江口县",
3106
+    "520622": "玉屏侗族自治县",
3107
+    "520623": "石阡县",
3108
+    "520624": "思南县",
3109
+    "520625": "印江土家族苗族自治县",
3110
+    "520626": "德江县",
3111
+    "520627": "沿河土家族自治县",
3112
+    "520628": "松桃苗族自治县"
3113
+  },
3114
+  "522300": {
3115
+    "522301": "兴义市",
3116
+    "522322": "兴仁县",
3117
+    "522323": "普安县",
3118
+    "522324": "晴隆县",
3119
+    "522325": "贞丰县",
3120
+    "522326": "望谟县",
3121
+    "522327": "册亨县",
3122
+    "522328": "安龙县"
3123
+  },
3124
+  "522600": {
3125
+    "522601": "凯里市",
3126
+    "522622": "黄平县",
3127
+    "522623": "施秉县",
3128
+    "522624": "三穗县",
3129
+    "522625": "镇远县",
3130
+    "522626": "岑巩县",
3131
+    "522627": "天柱县",
3132
+    "522628": "锦屏县",
3133
+    "522629": "剑河县",
3134
+    "522630": "台江县",
3135
+    "522631": "黎平县",
3136
+    "522632": "榕江县",
3137
+    "522633": "从江县",
3138
+    "522634": "雷山县",
3139
+    "522635": "麻江县",
3140
+    "522636": "丹寨县"
3141
+  },
3142
+  "522700": {
3143
+    "522701": "都匀市",
3144
+    "522702": "福泉市",
3145
+    "522722": "荔波县",
3146
+    "522723": "贵定县",
3147
+    "522725": "瓮安县",
3148
+    "522726": "独山县",
3149
+    "522727": "平塘县",
3150
+    "522728": "罗甸县",
3151
+    "522729": "长顺县",
3152
+    "522730": "龙里县",
3153
+    "522731": "惠水县",
3154
+    "522732": "三都水族自治县"
3155
+  },
3156
+  "530000": {
3157
+    "530100": "昆明市",
3158
+    "530300": "曲靖市",
3159
+    "530400": "玉溪市",
3160
+    "530500": "保山市",
3161
+    "530600": "昭通市",
3162
+    "530700": "丽江市",
3163
+    "530800": "普洱市",
3164
+    "530900": "临沧市",
3165
+    "532300": "楚雄彝族自治州",
3166
+    "532500": "红河哈尼族彝族自治州",
3167
+    "532600": "文山壮族苗族自治州",
3168
+    "532800": "西双版纳傣族自治州",
3169
+    "532900": "大理白族自治州",
3170
+    "533100": "德宏傣族景颇族自治州",
3171
+    "533300": "怒江傈僳族自治州",
3172
+    "533400": "迪庆藏族自治州"
3173
+  },
3174
+  "530100": {
3175
+    "530102": "五华区",
3176
+    "530103": "盘龙区",
3177
+    "530111": "官渡区",
3178
+    "530112": "西山区",
3179
+    "530113": "东川区",
3180
+    "530114": "呈贡区",
3181
+    "530122": "晋宁县",
3182
+    "530124": "富民县",
3183
+    "530125": "宜良县",
3184
+    "530126": "石林彝族自治县",
3185
+    "530127": "嵩明县",
3186
+    "530128": "禄劝彝族苗族自治县",
3187
+    "530129": "寻甸回族彝族自治县",
3188
+    "530181": "安宁市"
3189
+  },
3190
+  "530300": {
3191
+    "530302": "麒麟区",
3192
+    "530303": "沾益区",
3193
+    "530321": "马龙县",
3194
+    "530322": "陆良县",
3195
+    "530323": "师宗县",
3196
+    "530324": "罗平县",
3197
+    "530325": "富源县",
3198
+    "530326": "会泽县",
3199
+    "530381": "宣威市"
3200
+  },
3201
+  "530400": {
3202
+    "530402": "红塔区",
3203
+    "530403": "江川区",
3204
+    "530422": "澄江县",
3205
+    "530423": "通海县",
3206
+    "530424": "华宁县",
3207
+    "530425": "易门县",
3208
+    "530426": "峨山彝族自治县",
3209
+    "530427": "新平彝族傣族自治县",
3210
+    "530428": "元江哈尼族彝族傣族自治县"
3211
+  },
3212
+  "530500": {
3213
+    "530502": "隆阳区",
3214
+    "530521": "施甸县",
3215
+    "530523": "龙陵县",
3216
+    "530524": "昌宁县",
3217
+    "530581": "腾冲市"
3218
+  },
3219
+  "530600": {
3220
+    "530602": "昭阳区",
3221
+    "530621": "鲁甸县",
3222
+    "530622": "巧家县",
3223
+    "530623": "盐津县",
3224
+    "530624": "大关县",
3225
+    "530625": "永善县",
3226
+    "530626": "绥江县",
3227
+    "530627": "镇雄县",
3228
+    "530628": "彝良县",
3229
+    "530629": "威信县",
3230
+    "530630": "水富县"
3231
+  },
3232
+  "530700": {
3233
+    "530702": "古城区",
3234
+    "530721": "玉龙纳西族自治县",
3235
+    "530722": "永胜县",
3236
+    "530723": "华坪县",
3237
+    "530724": "宁蒗彝族自治县"
3238
+  },
3239
+  "530800": {
3240
+    "530802": "思茅区",
3241
+    "530821": "宁洱哈尼族彝族自治县",
3242
+    "530822": "墨江哈尼族自治县",
3243
+    "530823": "景东彝族自治县",
3244
+    "530824": "景谷傣族彝族自治县",
3245
+    "530825": "镇沅彝族哈尼族拉祜族自治县",
3246
+    "530826": "江城哈尼族彝族自治县",
3247
+    "530827": "孟连傣族拉祜族佤族自治县",
3248
+    "530828": "澜沧拉祜族自治县",
3249
+    "530829": "西盟佤族自治县"
3250
+  },
3251
+  "530900": {
3252
+    "530902": "临翔区",
3253
+    "530921": "凤庆县",
3254
+    "530922": "云县",
3255
+    "530923": "永德县",
3256
+    "530924": "镇康县",
3257
+    "530925": "双江拉祜族佤族布朗族傣族自治县",
3258
+    "530926": "耿马傣族佤族自治县",
3259
+    "530927": "沧源佤族自治县"
3260
+  },
3261
+  "532300": {
3262
+    "532301": "楚雄市",
3263
+    "532322": "双柏县",
3264
+    "532323": "牟定县",
3265
+    "532324": "南华县",
3266
+    "532325": "姚安县",
3267
+    "532326": "大姚县",
3268
+    "532327": "永仁县",
3269
+    "532328": "元谋县",
3270
+    "532329": "武定县",
3271
+    "532331": "禄丰县"
3272
+  },
3273
+  "532500": {
3274
+    "532501": "个旧市",
3275
+    "532502": "开远市",
3276
+    "532503": "蒙自市",
3277
+    "532504": "弥勒市",
3278
+    "532523": "屏边苗族自治县",
3279
+    "532524": "建水县",
3280
+    "532525": "石屏县",
3281
+    "532527": "泸西县",
3282
+    "532528": "元阳县",
3283
+    "532529": "红河县",
3284
+    "532530": "金平苗族瑶族傣族自治县",
3285
+    "532531": "绿春县",
3286
+    "532532": "河口瑶族自治县"
3287
+  },
3288
+  "532600": {
3289
+    "532601": "文山市",
3290
+    "532622": "砚山县",
3291
+    "532623": "西畴县",
3292
+    "532624": "麻栗坡县",
3293
+    "532625": "马关县",
3294
+    "532626": "丘北县",
3295
+    "532627": "广南县",
3296
+    "532628": "富宁县"
3297
+  },
3298
+  "532800": {
3299
+    "532801": "景洪市",
3300
+    "532822": "勐海县",
3301
+    "532823": "勐腊县"
3302
+  },
3303
+  "532900": {
3304
+    "532901": "大理市",
3305
+    "532922": "漾濞彝族自治县",
3306
+    "532923": "祥云县",
3307
+    "532924": "宾川县",
3308
+    "532925": "弥渡县",
3309
+    "532926": "南涧彝族自治县",
3310
+    "532927": "巍山彝族回族自治县",
3311
+    "532928": "永平县",
3312
+    "532929": "云龙县",
3313
+    "532930": "洱源县",
3314
+    "532931": "剑川县",
3315
+    "532932": "鹤庆县"
3316
+  },
3317
+  "533100": {
3318
+    "533102": "瑞丽市",
3319
+    "533103": "芒市",
3320
+    "533122": "梁河县",
3321
+    "533123": "盈江县",
3322
+    "533124": "陇川县"
3323
+  },
3324
+  "533300": {
3325
+    "533301": "泸水市",
3326
+    "533323": "福贡县",
3327
+    "533324": "贡山独龙族怒族自治县",
3328
+    "533325": "兰坪白族普米族自治县"
3329
+  },
3330
+  "533400": {
3331
+    "533401": "香格里拉市",
3332
+    "533422": "德钦县",
3333
+    "533423": "维西傈僳族自治县"
3334
+  },
3335
+  "540000": {
3336
+    "540100": "拉萨市",
3337
+    "540200": "日喀则市",
3338
+    "540300": "昌都市",
3339
+    "540400": "林芝市",
3340
+    "540500": "山南市",
3341
+    "542400": "那曲地区",
3342
+    "542500": "阿里地区"
3343
+  },
3344
+  "540100": {
3345
+    "540102": "城关区",
3346
+    "540103": "堆龙德庆区",
3347
+    "540121": "林周县",
3348
+    "540122": "当雄县",
3349
+    "540123": "尼木县",
3350
+    "540124": "曲水县",
3351
+    "540126": "达孜县",
3352
+    "540127": "墨竹工卡县"
3353
+  },
3354
+  "540200": {
3355
+    "540202": "桑珠孜区",
3356
+    "540221": "南木林县",
3357
+    "540222": "江孜县",
3358
+    "540223": "定日县",
3359
+    "540224": "萨迦县",
3360
+    "540225": "拉孜县",
3361
+    "540226": "昂仁县",
3362
+    "540227": "谢通门县",
3363
+    "540228": "白朗县",
3364
+    "540229": "仁布县",
3365
+    "540230": "康马县",
3366
+    "540231": "定结县",
3367
+    "540232": "仲巴县",
3368
+    "540233": "亚东县",
3369
+    "540234": "吉隆县",
3370
+    "540235": "聂拉木县",
3371
+    "540236": "萨嘎县",
3372
+    "540237": "岗巴县"
3373
+  },
3374
+  "540300": {
3375
+    "540302": "卡若区",
3376
+    "540321": "江达县",
3377
+    "540322": "贡觉县",
3378
+    "540323": "类乌齐县",
3379
+    "540324": "丁青县",
3380
+    "540325": "察雅县",
3381
+    "540326": "八宿县",
3382
+    "540327": "左贡县",
3383
+    "540328": "芒康县",
3384
+    "540329": "洛隆县",
3385
+    "540330": "边坝县"
3386
+  },
3387
+  "540400": {
3388
+    "540402": "巴宜区",
3389
+    "540421": "工布江达县",
3390
+    "540422": "米林县",
3391
+    "540423": "墨脱县",
3392
+    "540424": "波密县",
3393
+    "540425": "察隅县",
3394
+    "540426": "朗县"
3395
+  },
3396
+  "540500": {
3397
+    "540502": "乃东区",
3398
+    "540521": "扎囊县",
3399
+    "540522": "贡嘎县",
3400
+    "540523": "桑日县",
3401
+    "540524": "琼结县",
3402
+    "540525": "曲松县",
3403
+    "540526": "措美县",
3404
+    "540527": "洛扎县",
3405
+    "540528": "加查县",
3406
+    "540529": "隆子县",
3407
+    "540530": "错那县",
3408
+    "540531": "浪卡子县"
3409
+  },
3410
+  "542400": {
3411
+    "542421": "那曲县",
3412
+    "542422": "嘉黎县",
3413
+    "542423": "比如县",
3414
+    "542424": "聂荣县",
3415
+    "542425": "安多县",
3416
+    "542426": "申扎县",
3417
+    "542427": "索县",
3418
+    "542428": "班戈县",
3419
+    "542429": "巴青县",
3420
+    "542430": "尼玛县",
3421
+    "542431": "双湖县"
3422
+  },
3423
+  "542500": {
3424
+    "542521": "普兰县",
3425
+    "542522": "札达县",
3426
+    "542523": "噶尔县",
3427
+    "542524": "日土县",
3428
+    "542525": "革吉县",
3429
+    "542526": "改则县",
3430
+    "542527": "措勤县"
3431
+  },
3432
+  "610000": {
3433
+    "610100": "西安市",
3434
+    "610200": "铜川市",
3435
+    "610300": "宝鸡市",
3436
+    "610400": "咸阳市",
3437
+    "610500": "渭南市",
3438
+    "610600": "延安市",
3439
+    "610700": "汉中市",
3440
+    "610800": "榆林市",
3441
+    "610900": "安康市",
3442
+    "611000": "商洛市"
3443
+  },
3444
+  "610100": {
3445
+    "610102": "新城区",
3446
+    "610103": "碑林区",
3447
+    "610104": "莲湖区",
3448
+    "610111": "灞桥区",
3449
+    "610112": "未央区",
3450
+    "610113": "雁塔区",
3451
+    "610114": "阎良区",
3452
+    "610115": "临潼区",
3453
+    "610116": "长安区",
3454
+    "610117": "高陵区",
3455
+    "610122": "蓝田县",
3456
+    "610124": "周至县",
3457
+    "610125": "户县"
3458
+  },
3459
+  "610200": {
3460
+    "610202": "王益区",
3461
+    "610203": "印台区",
3462
+    "610204": "耀州区",
3463
+    "610222": "宜君县"
3464
+  },
3465
+  "610300": {
3466
+    "610302": "渭滨区",
3467
+    "610303": "金台区",
3468
+    "610304": "陈仓区",
3469
+    "610322": "凤翔县",
3470
+    "610323": "岐山县",
3471
+    "610324": "扶风县",
3472
+    "610326": "眉县",
3473
+    "610327": "陇县",
3474
+    "610328": "千阳县",
3475
+    "610329": "麟游县",
3476
+    "610330": "凤县",
3477
+    "610331": "太白县"
3478
+  },
3479
+  "610400": {
3480
+    "610402": "秦都区",
3481
+    "610403": "杨陵区",
3482
+    "610404": "渭城区",
3483
+    "610422": "三原县",
3484
+    "610423": "泾阳县",
3485
+    "610424": "乾县",
3486
+    "610425": "礼泉县",
3487
+    "610426": "永寿县",
3488
+    "610427": "彬县",
3489
+    "610428": "长武县",
3490
+    "610429": "旬邑县",
3491
+    "610430": "淳化县",
3492
+    "610431": "武功县",
3493
+    "610481": "兴平市"
3494
+  },
3495
+  "610500": {
3496
+    "610502": "临渭区",
3497
+    "610503": "华州区",
3498
+    "610522": "潼关县",
3499
+    "610523": "大荔县",
3500
+    "610524": "合阳县",
3501
+    "610525": "澄城县",
3502
+    "610526": "蒲城县",
3503
+    "610527": "白水县",
3504
+    "610528": "富平县",
3505
+    "610581": "韩城市",
3506
+    "610582": "华阴市"
3507
+  },
3508
+  "610600": {
3509
+    "610602": "宝塔区",
3510
+    "610603": "安塞区",
3511
+    "610621": "延长县",
3512
+    "610622": "延川县",
3513
+    "610623": "子长县",
3514
+    "610625": "志丹县",
3515
+    "610626": "吴起县",
3516
+    "610627": "甘泉县",
3517
+    "610628": "富县",
3518
+    "610629": "洛川县",
3519
+    "610630": "宜川县",
3520
+    "610631": "黄龙县",
3521
+    "610632": "黄陵县"
3522
+  },
3523
+  "610700": {
3524
+    "610702": "汉台区",
3525
+    "610721": "南郑县",
3526
+    "610722": "城固县",
3527
+    "610723": "洋县",
3528
+    "610724": "西乡县",
3529
+    "610725": "勉县",
3530
+    "610726": "宁强县",
3531
+    "610727": "略阳县",
3532
+    "610728": "镇巴县",
3533
+    "610729": "留坝县",
3534
+    "610730": "佛坪县"
3535
+  },
3536
+  "610800": {
3537
+    "610802": "榆阳区",
3538
+    "610803": "横山区",
3539
+    "610821": "神木县",
3540
+    "610822": "府谷县",
3541
+    "610824": "靖边县",
3542
+    "610825": "定边县",
3543
+    "610826": "绥德县",
3544
+    "610827": "米脂县",
3545
+    "610828": "佳县",
3546
+    "610829": "吴堡县",
3547
+    "610830": "清涧县",
3548
+    "610831": "子洲县"
3549
+  },
3550
+  "610900": {
3551
+    "610902": "汉滨区",
3552
+    "610921": "汉阴县",
3553
+    "610922": "石泉县",
3554
+    "610923": "宁陕县",
3555
+    "610924": "紫阳县",
3556
+    "610925": "岚皋县",
3557
+    "610926": "平利县",
3558
+    "610927": "镇坪县",
3559
+    "610928": "旬阳县",
3560
+    "610929": "白河县"
3561
+  },
3562
+  "611000": {
3563
+    "611002": "商州区",
3564
+    "611021": "洛南县",
3565
+    "611022": "丹凤县",
3566
+    "611023": "商南县",
3567
+    "611024": "山阳县",
3568
+    "611025": "镇安县",
3569
+    "611026": "柞水县"
3570
+  },
3571
+  "620000": {
3572
+    "620100": "兰州市",
3573
+    "620200": "嘉峪关市",
3574
+    "620300": "金昌市",
3575
+    "620400": "白银市",
3576
+    "620500": "天水市",
3577
+    "620600": "武威市",
3578
+    "620700": "张掖市",
3579
+    "620800": "平凉市",
3580
+    "620900": "酒泉市",
3581
+    "621000": "庆阳市",
3582
+    "621100": "定西市",
3583
+    "621200": "陇南市",
3584
+    "622900": "临夏回族自治州",
3585
+    "623000": "甘南藏族自治州"
3586
+  },
3587
+  "620100": {
3588
+    "620102": "城关区",
3589
+    "620103": "七里河区",
3590
+    "620104": "西固区",
3591
+    "620105": "安宁区",
3592
+    "620111": "红古区",
3593
+    "620121": "永登县",
3594
+    "620122": "皋兰县",
3595
+    "620123": "榆中县"
3596
+  },
3597
+  "620300": {
3598
+    "620302": "金川区",
3599
+    "620321": "永昌县"
3600
+  },
3601
+  "620400": {
3602
+    "620402": "白银区",
3603
+    "620403": "平川区",
3604
+    "620421": "靖远县",
3605
+    "620422": "会宁县",
3606
+    "620423": "景泰县"
3607
+  },
3608
+  "620500": {
3609
+    "620502": "秦州区",
3610
+    "620503": "麦积区",
3611
+    "620521": "清水县",
3612
+    "620522": "秦安县",
3613
+    "620523": "甘谷县",
3614
+    "620524": "武山县",
3615
+    "620525": "张家川回族自治县"
3616
+  },
3617
+  "620600": {
3618
+    "620602": "凉州区",
3619
+    "620621": "民勤县",
3620
+    "620622": "古浪县",
3621
+    "620623": "天祝藏族自治县"
3622
+  },
3623
+  "620700": {
3624
+    "620702": "甘州区",
3625
+    "620721": "肃南裕固族自治县",
3626
+    "620722": "民乐县",
3627
+    "620723": "临泽县",
3628
+    "620724": "高台县",
3629
+    "620725": "山丹县"
3630
+  },
3631
+  "620800": {
3632
+    "620802": "崆峒区",
3633
+    "620821": "泾川县",
3634
+    "620822": "灵台县",
3635
+    "620823": "崇信县",
3636
+    "620824": "华亭县",
3637
+    "620825": "庄浪县",
3638
+    "620826": "静宁县"
3639
+  },
3640
+  "620900": {
3641
+    "620902": "肃州区",
3642
+    "620921": "金塔县",
3643
+    "620922": "瓜州县",
3644
+    "620923": "肃北蒙古族自治县",
3645
+    "620924": "阿克塞哈萨克族自治县",
3646
+    "620981": "玉门市",
3647
+    "620982": "敦煌市"
3648
+  },
3649
+  "621000": {
3650
+    "621002": "西峰区",
3651
+    "621021": "庆城县",
3652
+    "621022": "环县",
3653
+    "621023": "华池县",
3654
+    "621024": "合水县",
3655
+    "621025": "正宁县",
3656
+    "621026": "宁县",
3657
+    "621027": "镇原县"
3658
+  },
3659
+  "621100": {
3660
+    "621102": "安定区",
3661
+    "621121": "通渭县",
3662
+    "621122": "陇西县",
3663
+    "621123": "渭源县",
3664
+    "621124": "临洮县",
3665
+    "621125": "漳县",
3666
+    "621126": "岷县"
3667
+  },
3668
+  "621200": {
3669
+    "621202": "武都区",
3670
+    "621221": "成县",
3671
+    "621222": "文县",
3672
+    "621223": "宕昌县",
3673
+    "621224": "康县",
3674
+    "621225": "西和县",
3675
+    "621226": "礼县",
3676
+    "621227": "徽县",
3677
+    "621228": "两当县"
3678
+  },
3679
+  "622900": {
3680
+    "622901": "临夏市",
3681
+    "622921": "临夏县",
3682
+    "622922": "康乐县",
3683
+    "622923": "永靖县",
3684
+    "622924": "广河县",
3685
+    "622925": "和政县",
3686
+    "622926": "东乡族自治县",
3687
+    "622927": "积石山保安族东乡族撒拉族自治县"
3688
+  },
3689
+  "623000": {
3690
+    "623001": "合作市",
3691
+    "623021": "临潭县",
3692
+    "623022": "卓尼县",
3693
+    "623023": "舟曲县",
3694
+    "623024": "迭部县",
3695
+    "623025": "玛曲县",
3696
+    "623026": "碌曲县",
3697
+    "623027": "夏河县"
3698
+  },
3699
+  "630000": {
3700
+    "630100": "西宁市",
3701
+    "630200": "海东市",
3702
+    "632200": "海北藏族自治州",
3703
+    "632300": "黄南藏族自治州",
3704
+    "632500": "海南藏族自治州",
3705
+    "632600": "果洛藏族自治州",
3706
+    "632700": "玉树藏族自治州",
3707
+    "632800": "海西蒙古族藏族自治州"
3708
+  },
3709
+  "630100": {
3710
+    "630102": "城东区",
3711
+    "630103": "城中区",
3712
+    "630104": "城西区",
3713
+    "630105": "城北区",
3714
+    "630121": "大通回族土族自治县",
3715
+    "630122": "湟中县",
3716
+    "630123": "湟源县"
3717
+  },
3718
+  "630200": {
3719
+    "630202": "乐都区",
3720
+    "630203": "平安区",
3721
+    "630222": "民和回族土族自治县",
3722
+    "630223": "互助土族自治县",
3723
+    "630224": "化隆回族自治县",
3724
+    "630225": "循化撒拉族自治县"
3725
+  },
3726
+  "632200": {
3727
+    "632221": "门源回族自治县",
3728
+    "632222": "祁连县",
3729
+    "632223": "海晏县",
3730
+    "632224": "刚察县"
3731
+  },
3732
+  "632300": {
3733
+    "632321": "同仁县",
3734
+    "632322": "尖扎县",
3735
+    "632323": "泽库县",
3736
+    "632324": "河南蒙古族自治县"
3737
+  },
3738
+  "632500": {
3739
+    "632521": "共和县",
3740
+    "632522": "同德县",
3741
+    "632523": "贵德县",
3742
+    "632524": "兴海县",
3743
+    "632525": "贵南县"
3744
+  },
3745
+  "632600": {
3746
+    "632621": "玛沁县",
3747
+    "632622": "班玛县",
3748
+    "632623": "甘德县",
3749
+    "632624": "达日县",
3750
+    "632625": "久治县",
3751
+    "632626": "玛多县"
3752
+  },
3753
+  "632700": {
3754
+    "632701": "玉树市",
3755
+    "632722": "杂多县",
3756
+    "632723": "称多县",
3757
+    "632724": "治多县",
3758
+    "632725": "囊谦县",
3759
+    "632726": "曲麻莱县"
3760
+  },
3761
+  "632800": {
3762
+    "632801": "格尔木市",
3763
+    "632802": "德令哈市",
3764
+    "632821": "乌兰县",
3765
+    "632822": "都兰县",
3766
+    "632823": "天峻县"
3767
+  },
3768
+  "640000": {
3769
+    "640100": "银川市",
3770
+    "640200": "石嘴山市",
3771
+    "640300": "吴忠市",
3772
+    "640400": "固原市",
3773
+    "640500": "中卫市"
3774
+  },
3775
+  "640100": {
3776
+    "640104": "兴庆区",
3777
+    "640105": "西夏区",
3778
+    "640106": "金凤区",
3779
+    "640121": "永宁县",
3780
+    "640122": "贺兰县",
3781
+    "640181": "灵武市"
3782
+  },
3783
+  "640200": {
3784
+    "640202": "大武口区",
3785
+    "640205": "惠农区",
3786
+    "640221": "平罗县"
3787
+  },
3788
+  "640300": {
3789
+    "640302": "利通区",
3790
+    "640303": "红寺堡区",
3791
+    "640323": "盐池县",
3792
+    "640324": "同心县",
3793
+    "640381": "青铜峡市"
3794
+  },
3795
+  "640400": {
3796
+    "640402": "原州区",
3797
+    "640422": "西吉县",
3798
+    "640423": "隆德县",
3799
+    "640424": "泾源县",
3800
+    "640425": "彭阳县"
3801
+  },
3802
+  "640500": {
3803
+    "640502": "沙坡头区",
3804
+    "640521": "中宁县",
3805
+    "640522": "海原县"
3806
+  },
3807
+  "650000": {
3808
+    "650100": "乌鲁木齐市",
3809
+    "650200": "克拉玛依市",
3810
+    "650400": "吐鲁番市",
3811
+    "650500": "哈密市",
3812
+    "652300": "昌吉回族自治州",
3813
+    "652700": "博尔塔拉蒙古自治州",
3814
+    "652800": "巴音郭楞蒙古自治州",
3815
+    "652900": "阿克苏地区",
3816
+    "653000": "克孜勒苏柯尔克孜自治州",
3817
+    "653100": "喀什地区",
3818
+    "653200": "和田地区",
3819
+    "654000": "伊犁哈萨克自治州",
3820
+    "654200": "塔城地区",
3821
+    "654300": "阿勒泰地区",
3822
+    "659001": "石河子市",
3823
+    "659002": "阿拉尔市",
3824
+    "659003": "图木舒克市",
3825
+    "659004": "五家渠市",
3826
+    "659006": "铁门关市"
3827
+  },
3828
+  "650100": {
3829
+    "650102": "天山区",
3830
+    "650103": "沙依巴克区",
3831
+    "650104": "新市区",
3832
+    "650105": "水磨沟区",
3833
+    "650106": "头屯河区",
3834
+    "650107": "达坂城区",
3835
+    "650109": "米东区",
3836
+    "650121": "乌鲁木齐县"
3837
+  },
3838
+  "650200": {
3839
+    "650202": "独山子区",
3840
+    "650203": "克拉玛依区",
3841
+    "650204": "白碱滩区",
3842
+    "650205": "乌尔禾区"
3843
+  },
3844
+  "650400": {
3845
+    "650402": "高昌区",
3846
+    "650421": "鄯善县",
3847
+    "650422": "托克逊县"
3848
+  },
3849
+  "650500": {
3850
+    "650502": "伊州区",
3851
+    "650521": "巴里坤哈萨克自治县",
3852
+    "650522": "伊吾县"
3853
+  },
3854
+  "652300": {
3855
+    "652301": "昌吉市",
3856
+    "652302": "阜康市",
3857
+    "652323": "呼图壁县",
3858
+    "652324": "玛纳斯县",
3859
+    "652325": "奇台县",
3860
+    "652327": "吉木萨尔县",
3861
+    "652328": "木垒哈萨克自治县"
3862
+  },
3863
+  "652700": {
3864
+    "652701": "博乐市",
3865
+    "652702": "阿拉山口市",
3866
+    "652722": "精河县",
3867
+    "652723": "温泉县"
3868
+  },
3869
+  "652800": {
3870
+    "652801": "库尔勒市",
3871
+    "652822": "轮台县",
3872
+    "652823": "尉犁县",
3873
+    "652824": "若羌县",
3874
+    "652825": "且末县",
3875
+    "652826": "焉耆回族自治县",
3876
+    "652827": "和静县",
3877
+    "652828": "和硕县",
3878
+    "652829": "博湖县"
3879
+  },
3880
+  "652900": {
3881
+    "652901": "阿克苏市",
3882
+    "652922": "温宿县",
3883
+    "652923": "库车县",
3884
+    "652924": "沙雅县",
3885
+    "652925": "新和县",
3886
+    "652926": "拜城县",
3887
+    "652927": "乌什县",
3888
+    "652928": "阿瓦提县",
3889
+    "652929": "柯坪县"
3890
+  },
3891
+  "653000": {
3892
+    "653001": "阿图什市",
3893
+    "653022": "阿克陶县",
3894
+    "653023": "阿合奇县",
3895
+    "653024": "乌恰县"
3896
+  },
3897
+  "653100": {
3898
+    "653101": "喀什市",
3899
+    "653121": "疏附县",
3900
+    "653122": "疏勒县",
3901
+    "653123": "英吉沙县",
3902
+    "653124": "泽普县",
3903
+    "653125": "莎车县",
3904
+    "653126": "叶城县",
3905
+    "653127": "麦盖提县",
3906
+    "653128": "岳普湖县",
3907
+    "653129": "伽师县",
3908
+    "653130": "巴楚县",
3909
+    "653131": "塔什库尔干塔吉克自治县"
3910
+  },
3911
+  "653200": {
3912
+    "653201": "和田市",
3913
+    "653221": "和田县",
3914
+    "653222": "墨玉县",
3915
+    "653223": "皮山县",
3916
+    "653224": "洛浦县",
3917
+    "653225": "策勒县",
3918
+    "653226": "于田县",
3919
+    "653227": "民丰县"
3920
+  },
3921
+  "654000": {
3922
+    "654002": "伊宁市",
3923
+    "654003": "奎屯市",
3924
+    "654004": "霍尔果斯市",
3925
+    "654021": "伊宁县",
3926
+    "654022": "察布查尔锡伯自治县",
3927
+    "654023": "霍城县",
3928
+    "654024": "巩留县",
3929
+    "654025": "新源县",
3930
+    "654026": "昭苏县",
3931
+    "654027": "特克斯县",
3932
+    "654028": "尼勒克县"
3933
+  },
3934
+  "654200": {
3935
+    "654201": "塔城市",
3936
+    "654202": "乌苏市",
3937
+    "654221": "额敏县",
3938
+    "654223": "沙湾县",
3939
+    "654224": "托里县",
3940
+    "654225": "裕民县",
3941
+    "654226": "和布克赛尔蒙古自治县"
3942
+  },
3943
+  "654300": {
3944
+    "654301": "阿勒泰市",
3945
+    "654321": "布尔津县",
3946
+    "654322": "富蕴县",
3947
+    "654323": "福海县",
3948
+    "654324": "哈巴河县",
3949
+    "654325": "青河县",
3950
+    "654326": "吉木乃县"
3951
+  },
3952
+  "810000": {
3953
+    "810001": "中西區",
3954
+    "810002": "灣仔區",
3955
+    "810003": "東區",
3956
+    "810004": "南區",
3957
+    "810005": "油尖旺區",
3958
+    "810006": "深水埗區",
3959
+    "810007": "九龍城區",
3960
+    "810008": "黃大仙區",
3961
+    "810009": "觀塘區",
3962
+    "810010": "荃灣區",
3963
+    "810011": "屯門區",
3964
+    "810012": "元朗區",
3965
+    "810013": "北區",
3966
+    "810014": "大埔區",
3967
+    "810015": "西貢區",
3968
+    "810016": "沙田區",
3969
+    "810017": "葵青區",
3970
+    "810018": "離島區"
3971
+  },
3972
+  "820000": {
3973
+    "820001": "花地瑪堂區",
3974
+    "820002": "花王堂區",
3975
+    "820003": "望德堂區",
3976
+    "820004": "大堂區",
3977
+    "820005": "風順堂區",
3978
+    "820006": "嘉模堂區",
3979
+    "820007": "路氹填海區",
3980
+    "820008": "聖方濟各堂區"
3981
+  }
3982
+}

+ 7 - 0
data/tests.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.test import TestCase
5
+
6
+
7
+# Create your tests here.

+ 7 - 0
data/views.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.shortcuts import render
5
+
6
+
7
+# Create your views here.

+ 0 - 0
docs/COMMANDS.md


+ 2 - 0
docs/CRONTAB.md

@@ -0,0 +1,2 @@
1
+# 定时任务
2
+# m h  dom mon dow   command

+ 3 - 0
isort.sh

@@ -0,0 +1,3 @@
1
+#!/bin/bash
2
+
3
+isort -rc -sp . .

+ 0 - 0
jdjos/__init__.py


+ 26 - 0
jdjos/basemodels.py

@@ -0,0 +1,26 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.db import models
4
+from django.utils.translation import ugettext_lazy as _
5
+
6
+
7
+class BaseModelMixin(models.Model):
8
+    status = models.BooleanField(_(u'status'), default=True, help_text=_(u'状态'), db_index=True)
9
+    created_at = models.DateTimeField(_(u'created_at'), auto_now_add=True, editable=True, help_text=_(u'创建时间'))
10
+    updated_at = models.DateTimeField(_(u'updated_at'), auto_now=True, editable=True, help_text=_(u'更新时间'))
11
+
12
+    class Meta:
13
+        abstract = True
14
+
15
+
16
+class SexChoicesMixin(models.Model):
17
+    MALE = 1
18
+    FEMALE = 0
19
+
20
+    SEX_TYPE = (
21
+        (MALE, u'男'),
22
+        (FEMALE, u'女'),
23
+    )
24
+
25
+    class Meta:
26
+        abstract = True

+ 93 - 0
jdjos/decorators.py

@@ -0,0 +1,93 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from functools import wraps
4
+
5
+from django.conf import settings
6
+from django.shortcuts import redirect
7
+from furl import furl
8
+from pywe_oauth import get_oauth_redirect_url
9
+from pywe_sign import check_signature
10
+
11
+from utils.error.errno_utils import SignatureStatusCode
12
+from utils.error.response_utils import response
13
+from utils.redis.connect import r
14
+
15
+
16
+def check_user_cookie(func=None, key=settings.COOKIE_USER_CHECK_KEY):
17
+    def decorator(func):
18
+        @wraps(func)
19
+        def returned_wrapper(request, *args, **kwargs):
20
+            user_id = request.get_signed_cookie(key, default='', salt=settings.COOKIE_SALT)
21
+            if not user_id:
22
+                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', request.get_full_path()))
23
+            return func(request, *args, **kwargs)
24
+        return returned_wrapper
25
+
26
+    if not func:
27
+        def foo(func):
28
+            return decorator(func)
29
+        return foo
30
+
31
+    return decorator(func)
32
+
33
+
34
+def check_token(func=None, entry=None):
35
+    def decorator(func):
36
+        @wraps(func)
37
+        def returned_wrapper(request, *args, **kwargs):
38
+            if not settings.DEBUG and request.wechat:
39
+                vtoken = request.GET.get('vtoken', '') or request.POST.get('vtoken', '')
40
+                token_check_key = request.GET.get(settings.TOKEN_CHECK_KEY, '') or request.POST.get(settings.TOKEN_CHECK_KEY, '')
41
+                if not r.token_exists(token_check_key, vtoken):
42
+                    # 3rd OAuth
43
+                    # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
44
+                    # Current OAuth
45
+                    redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
46
+                    return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
47
+            return func(request, *args, **kwargs)
48
+        return returned_wrapper
49
+
50
+    if not func:
51
+        def foo(func):
52
+            return decorator(func)
53
+        return foo
54
+
55
+    return decorator(func)
56
+
57
+
58
+def check_sign(func=None, method='POST'):
59
+    def decorator(func):
60
+        @wraps(func)
61
+        def returned_wrapper(request, *args, **kwargs):
62
+            if not settings.DEBUG and not check_signature(getattr(request, method).dict(), settings.PARAMS_SIGN_KEY):
63
+                return response(SignatureStatusCode.SIGNATURE_ERROR)
64
+            return func(request, *args, **kwargs)
65
+        return returned_wrapper
66
+
67
+    if not func:
68
+        def foo(func):
69
+            return decorator(func)
70
+        return foo
71
+
72
+    return decorator(func)
73
+
74
+
75
+def check_cookie(func=None, entry=None):
76
+    def decorator(func):
77
+        @wraps(func)
78
+        def returned_wrapper(request, *args, **kwargs):
79
+            if not settings.DEBUG and not request.COOKIES.get('user_id'):
80
+                # 3rd OAuth
81
+                # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
82
+                # Current OAuth
83
+                redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
84
+                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
85
+            return func(request, *args, **kwargs)
86
+        return returned_wrapper
87
+
88
+    if not func:
89
+        def foo(func):
90
+            return decorator(func)
91
+        return foo
92
+
93
+    return decorator(func)

+ 35 - 0
jdjos/deploy.bak/jdjos.ini

@@ -0,0 +1,35 @@
1
+# Refer: https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
2
+# jdjos_uwsgi.ini file
3
+[uwsgi]
4
+
5
+# Django-related settings
6
+# the base directory (full path)
7
+chdir           = /home/diors/work/jdjos
8
+# Django's wsgi file
9
+module          = jdjos.wsgi
10
+# the virtualenv (full path)
11
+# home            = /path/to/virtualenv
12
+
13
+# process-related settings
14
+# master
15
+master          = true
16
+# maximum number of worker processes
17
+processes       = 10
18
+# the socket (use the full path to be safe
19
+socket          = /home/diors/work/jdjos/jdjos/deploy/jdjos.sock
20
+# ... with appropriate permissions - may be needed
21
+chmod-socket    = 777
22
+# clear environment on exit
23
+vacuum          = true
24
+
25
+# connect() to unix:///home/xxx/xxx.sock failed (11: Resource temporarily unavailable) while connecting to upstream
26
+# Exec sysctl.sh first
27
+# #!/bin/bash
28
+# sudo sysctl -w net.core.somaxconn=4096
29
+# sudo sysctl -w net.core.netdev_max_backlog=50000
30
+reload-mercy    = 64
31
+max-requests    = 8192
32
+listen          = 4096
33
+
34
+# recv() failed (104: Connection reset by peer) while reading response header from upstream
35
+buffer-size     = 65536

+ 91 - 0
jdjos/deploy.bak/jdjos_nginx.conf

@@ -0,0 +1,91 @@
1
+# jdjos_nginx.conf
2
+
3
+# the upstream component nginx needs to connect to
4
+upstream jdjos {
5
+    # server unix:///home/diors/work/jdjos/jdjos/deploy/jdjos.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 .a.com; # substitute your machine's IP address or FQDN
15
+    charset     utf-8;
16
+
17
+    # access_log /var/log/nginx/jdjos_access.log;
18
+    # error_log /var/log/nginx/jdjos_error.log;
19
+
20
+    # max upload size
21
+    client_max_body_size 75M;   # adjust to taste
22
+
23
+    # JS接口安全域名 & 业务域名 验证
24
+    location /xxx.txt {
25
+        alias /home/diors/work/jdjos/docs/we/xxx.txt;
26
+    }
27
+
28
+    # Django media
29
+    location /media  {
30
+        alias /home/diors/work/jdjos/media;  # your Django project's media files - amend as required
31
+    }
32
+
33
+    location /static {
34
+        alias /home/diors/work/jdjos/collect_static; # your Django project's static files - amend as required
35
+    }
36
+
37
+    # Finally, send all non-media requests to the Django server.
38
+    location / {
39
+        # uwsgi_pass  jdjos;
40
+        proxy_pass  http://jdjos;
41
+        include     /home/diors/work/jdjos/jdjos/deploy/uwsgi_params; # the uwsgi_params file you installed
42
+    }
43
+}
44
+
45
+# configuration of the server
46
+server {
47
+    # the port your site will be served on
48
+    listen      443;
49
+    # the domain name it will serve for
50
+    server_name .a.com; # substitute your machine's IP address or FQDN
51
+    charset     utf-8;
52
+
53
+    # access_log /var/log/nginx/jdjos_ssl_access.log;
54
+    # error_log /var/log/nginx/jdjos_ssl_error.log;
55
+
56
+    ssl on;
57
+    ssl_certificate   cert/214180103970874.pem;
58
+    ssl_certificate_key  cert/214180103970874.key;
59
+    ssl_session_timeout 5m;
60
+    # worker process * exited on signal 11
61
+    # 同一台服务器部署多个 SSL 转发,Nginx 默认是开启 Session 缓存的,导致冲突,验证不通过,连接直接退出
62
+    # 解决方案:禁用 Ningx SSL Session 的缓存
63
+    ssl_session_cache none;
64
+    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
65
+    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
66
+    ssl_prefer_server_ciphers on;
67
+
68
+    # max upload size
69
+    client_max_body_size 75M;   # adjust to taste
70
+
71
+    # JS接口安全域名 & 业务域名 验证
72
+    location /xxx.txt {
73
+        alias /home/diors/work/jdjos/docs/we/xxx.txt;
74
+    }
75
+
76
+    # Django media
77
+    location /media  {
78
+        alias /home/diors/work/jdjos/media;  # your Django project's media files - amend as required
79
+    }
80
+
81
+    location /static {
82
+        alias /home/diors/work/jdjos/collect_static; # your Django project's static files - amend as required
83
+    }
84
+
85
+    # Finally, send all non-media requests to the Django server.
86
+    location / {
87
+        # uwsgi_pass  jdjos;
88
+        proxy_pass  http://jdjos;
89
+        include     /home/diors/work/jdjos/jdjos/deploy/uwsgi_params; # the uwsgi_params file you installed
90
+    }
91
+}

+ 12 - 0
jdjos/deploy.bak/jdjos_supervisor.ini

@@ -0,0 +1,12 @@
1
+[program:jdjos]
2
+command=/home/diors/env/bin/uwsgi --ini /home/diors/work/jdjos/jdjos/deploy/jdjos.ini
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_jdjos_access.log
11
+stderr_logfile=/var/log/supervisor_jdjos_error.log
12
+user=diors

+ 12 - 0
jdjos/deploy.bak/supervisor_commands/pollqueue.ini

@@ -0,0 +1,12 @@
1
+[program:pollqueue]
2
+command=/home/diors/env/bin/python /home/diors/work/jdjos/manage.py poll_queue
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_pollqueue_access.log
11
+stderr_logfile=/var/log/supervisor_pollqueue_error.log
12
+user=diors

+ 12 - 0
jdjos/deploy.bak/supervisor_commands/rlistlog.ini

@@ -0,0 +1,12 @@
1
+[program:rlistlog]
2
+command=/home/diors/env/bin/python /home/diors/work/jdjos/manage.py rlistlog --key=django:logit:jdjos --filename=/tmp/jdjos.logit.log
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_rlistlog_access.log
11
+stderr_logfile=/var/log/supervisor_rlistlog_error.log
12
+user=diors

+ 15 - 0
jdjos/deploy.bak/uwsgi_params

@@ -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;

+ 5 - 0
jdjos/django_file_callback_settings.py

@@ -0,0 +1,5 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def DJANGO_FILE_UPLOAD_CALLBACK_FUNC(request, file_path=None, file_url=None):
5
+    """ DJANGO FILE UPLOAD Callback Func """

+ 81 - 0
jdjos/django_we_callback_settings.py

@@ -0,0 +1,81 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def DJANGO_WE_CFG_FUNC(request, state=None):
5
+    """ WeChat CFG Callback Func """
6
+
7
+
8
+def DJANGO_WE_QUOTE_STATE_FUNC(request, state):
9
+    """ WeChat Quote Callback Func """
10
+    from utils.redis.connect import r
11
+    return r.quote(state, short_uuid=True)
12
+
13
+
14
+def DJANGO_WE_UNQUOTE_STATE_FUNC(request, state):
15
+    """ WeChat UnQuote Callback Func """
16
+    from utils.redis.connect import r
17
+    # If Not Buf, When Wechat Multi Request, Unquote Will Get None
18
+    # Then Once Should ReOAuth, Will Raise Error
19
+    return r.unquote(state, buf=True) or state
20
+
21
+
22
+def DJANGO_WE_BASE_FUNC(code, state, access_info=None):
23
+    """ WeChat Base Redirect Callback Func """
24
+
25
+
26
+def DJANGO_WE_BASE_COOKIE_FUNC(code, state, access_info=None):
27
+    """ WeChat Base Set Cookie Redirect Callback Func """
28
+
29
+
30
+def DJANGO_WE_USERINFO_FUNC(code, state, access_info=None, userinfo=None):
31
+    """ WeChat Userinfo Redirect Callback Func """
32
+    from django.conf import settings
33
+    from utils.redis.connect import r
34
+    from utils.user.userinfo_save import userinfo_save
35
+
36
+    # Save profile or something else
37
+    user = userinfo_save(userinfo)
38
+
39
+    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
40
+
41
+    return {
42
+        settings.TOKEN_CHECK_KEY: token_check_key,
43
+        'vtoken': r.token(token_check_key, ex=True, time=r.REDIS_EXPIRED_ONE_DAY, buf=False, short_uuid=True),
44
+    }
45
+
46
+
47
+def DJANGO_WE_USERINFO_COOKIE_FUNC(code, state, access_info=None, userinfo=None):
48
+    """ WeChat Userinfo Set Cookie Redirect Callback Func """
49
+    from django.conf import settings
50
+    from utils.user.userinfo_save import userinfo_save
51
+
52
+    # Save profile or something else
53
+    user = userinfo_save(userinfo)
54
+
55
+    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
56
+
57
+    return {}, settings.TOKEN_CHECK_KEY, token_check_key
58
+
59
+
60
+def DJANGO_WE_SHARE_FUNC(request, state=None):
61
+    """ WeChat Share Callback Func """
62
+    # from django.conf import settings
63
+    # return settings.WECHAT_OAUTH2_REDIRECT_URL
64
+
65
+
66
+def DJANGO_WE_MESSAGE_CALLBACK_FUNC(request, xmldict, decrypted):
67
+    """ WeChat Message Callback Func """
68
+
69
+
70
+def DJANGO_WE_COMPONENT_AUTH_FUNC(request, xmldict, decrypted):
71
+    """ WeChat COMPONENT Auth Func """
72
+
73
+
74
+def DJANGO_WE_COMPONENT_CALLBACK_FUNC(request, appid, xmldict, decrypted):
75
+    """ WeChat COMPONENT Callback Func """
76
+
77
+
78
+def DJANGO_WE_REDIS_OBJ_FUNC(request):
79
+    """ WeChat Redis Object Callback Func """
80
+    from utils.redis.connect import r
81
+    return r

+ 16 - 0
jdjos/func_settings.py

@@ -0,0 +1,16 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import redis_extensions as redis
4
+
5
+
6
+def redis_conf(conf):
7
+    return {
8
+        'host': conf.get('HOST', 'localhost'),
9
+        'port': conf.get('PORT', 6379),
10
+        'password': '{0}:{1}'.format(conf.get('USER', ''), conf.get('PASSWORD', '')) if conf.get('USER') else '',
11
+        'db': conf.get('db', 0),
12
+    }
13
+
14
+
15
+def redis_connect(conf):
16
+    return redis.StrictRedisExtensions(connection_pool=redis.ConnectionPool(**redis_conf(conf)))

+ 17 - 0
jdjos/local_settings_bak.py

@@ -0,0 +1,17 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# DEBUG = False
4
+
5
+ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'jdjos']
6
+
7
+# DOMAIN
8
+DOMAIN = 'http://a.com'
9
+
10
+# 邮件设置
11
+# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
12
+SERVER_EMAIL = 'error.notify@exmail.com'
13
+EMAIL_HOST_USER = 'error.notify@exmail.com'
14
+EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
15
+DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
16
+ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
17
+EMAIL_SUBJECT_PREFIX = u'[Templet] '

+ 27 - 0
jdjos/local_settings_dev_bak.py

@@ -0,0 +1,27 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import os
4
+
5
+
6
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
7
+PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
8
+
9
+TEMPLATES = [
10
+    {
11
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
12
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
13
+        # 'APP_DIRS': True,
14
+        'OPTIONS': {
15
+            'context_processors': [
16
+                'django.template.context_processors.debug',
17
+                'django.template.context_processors.request',
18
+                'django.contrib.auth.context_processors.auth',
19
+                'django.contrib.messages.context_processors.messages',
20
+            ],
21
+            'loaders': [
22
+                'django.template.loaders.filesystem.Loader',
23
+                'django.template.loaders.app_directories.Loader',
24
+            ],
25
+        },
26
+    },
27
+]

+ 396 - 0
jdjos/settings.py

@@ -0,0 +1,396 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+Django settings for jdjos project.
5
+
6
+Generated by 'django-admin startproject' using Django 1.11.3.
7
+
8
+For more information on this file, see
9
+https://docs.djangoproject.com/en/1.11/topics/settings/
10
+
11
+For the full list of settings and their values, see
12
+https://docs.djangoproject.com/en/1.11/ref/settings/
13
+"""
14
+
15
+import os
16
+
17
+# try:
18
+#     from func_settings import redis_connect
19
+#     REDIS_CACHE = redis_connect(REDIS.get('default', {}))
20
+# except ImportError:
21
+#     REDIS_CACHE = None
22
+from django_redis_connector import connector
23
+
24
+
25
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
26
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
27
+PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
28
+
29
+
30
+# Quick-start development settings - unsuitable for production
31
+# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
32
+
33
+# SECURITY WARNING: keep the secret key used in production secret!
34
+SECRET_KEY = '0=hpv21&am(7(k5ab!^zjvvl=ntj)^i@7)87t47uzumt_5rq$+'
35
+
36
+# SECURITY WARNING: don't run with debug turned on in production!
37
+DEBUG = True
38
+
39
+ALLOWED_HOSTS = []
40
+
41
+
42
+# Application definition
43
+
44
+INSTALLED_APPS = [
45
+    'django.contrib.admin',
46
+    'django.contrib.auth',
47
+    'django.contrib.contenttypes',
48
+    'django.contrib.sessions',
49
+    'django.contrib.messages',
50
+    'django.contrib.staticfiles',
51
+    # 'django_file_upload',
52
+    # 'django_short_url',
53
+    'django_uniapi',
54
+    'django_admin',
55
+    'django_we',
56
+    'commands',
57
+    'api',
58
+]
59
+
60
+MIDDLEWARE = [
61
+    'django.middleware.security.SecurityMiddleware',
62
+    'django.contrib.sessions.middleware.SessionMiddleware',
63
+    'django.middleware.common.CommonMiddleware',
64
+    # 'django.middleware.csrf.CsrfViewMiddleware',
65
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
66
+    'django.contrib.messages.middleware.MessageMiddleware',
67
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
68
+    'detect.middleware.UserAgentDetectionMiddleware',
69
+]
70
+
71
+ROOT_URLCONF = 'jdjos.urls'
72
+
73
+TEMPLATES = [
74
+    {
75
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
76
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
77
+        # 'APP_DIRS': True,
78
+        'OPTIONS': {
79
+            'context_processors': [
80
+                'django.template.context_processors.debug',
81
+                'django.template.context_processors.request',
82
+                'django.contrib.auth.context_processors.auth',
83
+                'django.contrib.messages.context_processors.messages',
84
+            ],
85
+            'loaders': [
86
+                ('django.template.loaders.cached.Loader', [
87
+                    'django.template.loaders.filesystem.Loader',
88
+                    'django.template.loaders.app_directories.Loader',
89
+                ]),
90
+            ],
91
+        },
92
+    },
93
+]
94
+
95
+WSGI_APPLICATION = 'jdjos.wsgi.application'
96
+
97
+
98
+# Database9
99
+# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
100
+
101
+DATABASES = {
102
+    # Create Database
103
+    # CREATE DATABASE jdjos DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
104
+    'default': {
105
+        'ENGINE': 'django.db.backends.mysql',
106
+        'NAME': 'jdjos',
107
+        'USER': 'root',
108
+        'PASSWORD': '',
109
+        'HOST': '127.0.0.1',
110
+        'PORT': 3306,
111
+        'CONN_MAX_AGE': 600,
112
+        'OPTIONS': {
113
+            # Utf8mb4 for Emoji
114
+            #
115
+            # Nickname
116
+            #
117
+            # account.WechatInfo ==> nickname
118
+            #   ALTER TABLE account_wechatinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
119
+            'charset': 'utf8mb4',
120
+        },
121
+    }
122
+}
123
+
124
+
125
+# Password validation
126
+# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
127
+
128
+AUTH_PASSWORD_VALIDATORS = [
129
+    {
130
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
131
+    },
132
+    {
133
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
134
+    },
135
+    {
136
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
137
+    },
138
+    {
139
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
140
+    },
141
+]
142
+
143
+
144
+# Internationalization
145
+# https://docs.djangoproject.com/en/1.11/topics/i18n/
146
+
147
+LANGUAGE_CODE = 'zh-Hans'
148
+
149
+TIME_ZONE = 'Asia/Shanghai'
150
+
151
+USE_I18N = True
152
+
153
+USE_L10N = True
154
+
155
+USE_TZ = True
156
+
157
+
158
+# Static files (CSS, JavaScript, Images)
159
+# https://docs.djangoproject.com/en/1.11/howto/static-files/
160
+
161
+STATICFILES_DIRS = (
162
+    os.path.join(PROJ_DIR, 'static').replace('\\', '/'),
163
+)
164
+
165
+STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static').replace('\\', '/')
166
+
167
+STATIC_URL = '/static/'
168
+
169
+STATICFILES_FINDERS = (
170
+    'django.contrib.staticfiles.finders.FileSystemFinder',
171
+    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
172
+    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
173
+)
174
+
175
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
176
+
177
+MEDIA_URL = '/media/'
178
+
179
+# File 设置
180
+FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880  # InMemoryUploadedFile 文件最大值,设置为 5 MB
181
+FILE_UPLOAD_PERMISSIONS = 0o644  # TemporaryUploadedFile 文件权限设置
182
+
183
+# DOMAIN
184
+DOMAIN = 'http://a.com'
185
+
186
+# Redis 设置
187
+REDIS = {
188
+    'default': {
189
+        'HOST': '127.0.0.1',
190
+        'PORT': 6379,
191
+        'USER': '',
192
+        'PASSWORD': '',
193
+        'db': 0,
194
+    }
195
+}
196
+
197
+# 微信设置
198
+WECHAT = {
199
+    'JSAPI': {
200
+        'trade_type': 'JSAPI',  # JSAPI-网页支付、Native-原生支付、APP-APP支付、MICROPAY-刷卡支付
201
+        'token': '5201314',
202
+        'appID': '',
203
+        'appsecret': '',
204
+        'encodingaeskey': '',
205
+        'mchID': '',
206
+        'apiKey': '',
207
+        'mch_cert': '',
208
+        'mch_key': '',
209
+        'redpack': {
210
+
211
+        }
212
+    },
213
+}
214
+
215
+WECHAT_DEFAULT_CFG = 'JSAPI'
216
+
217
+# 微信唯一标识
218
+# Choices: 'unionid' or 'openid'
219
+#
220
+# models.py
221
+#   'unique_identifier': self.unionid if settings.WECHAT_UNIQUE_IDENTIFICATION == 'unionid' else self.openid,
222
+# views.py
223
+#   unique_identifier = request.POST.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
224
+#   profile = Profile.objects.get(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
225
+#
226
+# If not bind to OpenPlat, change `WECHAT_UNIQUE_IDENTIFICATION` as `openid`
227
+WECHAT_UNIQUE_IDENTIFICATION = 'unionid'
228
+
229
+# Token 错误重授权设置
230
+TOKEN_CHECK_KEY = ''
231
+# TOKEN_CHECK_KEY = 'user_id'
232
+WECHAT_OAUTH2_REDIRECT_ENTRY = ''
233
+WECHAT_OAUTH2_REDIRECT_URL = ''
234
+
235
+# Cookie 设置
236
+DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE = 31536000  # 单位:秒,1年:365 * 24 * 60 * 60 = 31536000
237
+DJANGO_WE_COOKIE_SALT = COOKIE_SALT = 'djwe'  # Salt for ``set_signed_cookie``
238
+# Cookie 校验设置
239
+COOKIE_USER_CHECK_KEY = ''
240
+# COOKIE_USER_CHECK_KEY = 'user_id'
241
+
242
+# 邮件设置
243
+# https://docs.djangoproject.com/en/1.11/howto/error-reporting/#email-reports
244
+# When DEBUG is False, Django will email the users listed in the ADMINS setting
245
+# whenever your code raises an unhandled exception and results in an internal server error (HTTP status code 500).
246
+# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
247
+# Email address that error messages come from.
248
+SERVER_EMAIL = 'error.notify@exmail.com'
249
+# The email backend to use. For possible shortcuts see django.core.mail.
250
+# The default is to use the SMTP backend.
251
+# Third-party backends can be specified by providing a Python path
252
+# to a module that defines an EmailBackend class.
253
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
254
+# Host for sending email.
255
+EMAIL_HOST = 'smtp.exmail.qq.com'
256
+# Port for sending email.
257
+EMAIL_PORT = 25
258
+# Optional SMTP authentication information for EMAIL_HOST.
259
+EMAIL_HOST_USER = 'error.notify@exmail.com'
260
+EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
261
+EMAIL_USE_TLS = False
262
+EMAIL_USE_SSL = False
263
+EMAIL_SSL_CERTFILE = None
264
+EMAIL_SSL_KEYFILE = None
265
+EMAIL_TIMEOUT = None
266
+# Default email address to use for various automated correspondence from
267
+# the site managers.
268
+DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
269
+# People who get code error notifications.
270
+# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
271
+ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
272
+# Not-necessarily-technical managers of the site. They get broken link
273
+# notifications and other various emails.
274
+MANAGERS = ADMINS
275
+# Subject-line prefix for email messages send with django.core.mail.mail_admins
276
+# or ...mail_managers.  Make sure to include the trailing space.
277
+EMAIL_SUBJECT_PREFIX = u'[Templet] '
278
+
279
+# Django-Admin Settings
280
+DJANGO_ADMIN_DISABLE_DELETE_SELECTED = False
281
+
282
+# Django-FILE-UPLOAD Settings
283
+DJANGO_FILE_UPLOAD_USE_YM = True
284
+DJANGO_FILE_UPLOAD_USE_DT = True
285
+
286
+# Django-Logit Settings
287
+DJANGO_LOGIT_ENABLED = True
288
+DJANGO_LOGIT_BODY_FLAG = False
289
+DJANGO_LOGIT_RES_FLAG = False
290
+
291
+# Django-Onerror Settings
292
+DJANGO_ONERROR_ACCEPT_REPORT = True
293
+DJANGO_ONERROR_ADMIN_SITE_REGISTER = True
294
+
295
+# Django-Short-URL Settings
296
+# Redirect url when short url not exists
297
+DJANGO_SHORT_URL_REDIRECT_URL = ''
298
+
299
+# Django-We Settings
300
+DJANGO_WE_QUOTE_OR_NOT = True
301
+# Enable Cookie or not
302
+# DJANGO_WE_BASE_REDIRECT_SET_COOKIE = False
303
+# DJANGO_WE_USERINFO_REDIRECT_SET_COOKIE = True
304
+# Cookie Config
305
+DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE
306
+DJANGO_WE_COOKIE_SALT = COOKIE_SALT
307
+
308
+# 开发调试相关配置
309
+if DEBUG:
310
+    try:
311
+        from local_settings_dev import *
312
+    except ImportError:
313
+        pass
314
+
315
+try:
316
+    from local_settings import *
317
+except ImportError:
318
+    pass
319
+
320
+try:
321
+    from django_file_callback_settings import *
322
+except ImportError:
323
+    pass
324
+
325
+try:
326
+    from django_we_callback_settings import *
327
+except ImportError:
328
+    pass
329
+
330
+# 依赖 local_settings 中的配置
331
+# 微信授权设置
332
+# WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/oauth2?scope={{0}}&redirect_url={{1}}'.format(DOMAIN)
333
+# Shorten URL
334
+# ``o`` is short for oauth2
335
+# ``r`` is short for redirect_url
336
+WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/o?scope={{0}}&r={{1}}'.format(DOMAIN)
337
+WECHAT_OAUTH2_USERINFO_REDIRECT_URI = '{0}/we/o?r={{0}}'.format(DOMAIN)  # Scope default snsapi_userinfo
338
+WECHAT_BASE_REDIRECT_URI = '{0}/we/base_redirect'.format(DOMAIN)
339
+WECHAT_USERINFO_REDIRECT_URI = '{0}/we/userinfo_redirect'.format(DOMAIN)
340
+WECHAT_DIRECT_BASE_REDIRECT_URI = '{0}/we/direct_base_redirect'.format(DOMAIN)
341
+WECHAT_DIRECT_USERINFO_REDIRECT_URI = '{0}/we/direct_userinfo_redirect'.format(DOMAIN)
342
+
343
+JDJOS_OAUTH_AUTHORIZE = 'https://oauth.jd.com/oauth/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&state={state}'
344
+JDJOS_OAUTH_TOKEN = 'https://oauth.jd.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&code={code}&state={state}&client_secret={client_secret}'
345
+JDJOS_REDIRECT_URI = '{0}/jos/oauth'.format(DOMAIN)
346
+
347
+# Redis 连接
348
+WECHAT_REDIS_OBJ = REDIS_CACHE = connector(REDIS.get('default', {}))
349
+
350
+# LOGGER 设置
351
+# python manage.py rlistlog --key=django:logit:jdjos --filename=/tmp/jdjos.logit.log
352
+LOGGING = {
353
+    'version': 1,
354
+    'disable_existing_loggers': False,
355
+    'formatters': {
356
+        'verbose': {
357
+            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
358
+        },
359
+        'simple': {
360
+            'format': '%(levelname)s %(message)s'
361
+        },
362
+    },
363
+    'handlers': {
364
+        'logit': {
365
+            'level': 'DEBUG',
366
+            'class': 'rlog.RedisListHandler',
367
+            'redis_client': REDIS_CACHE,
368
+            'key': 'django:logit:jdjos',
369
+            'formatter': 'verbose',
370
+        },
371
+        'console': {
372
+            'level': 'DEBUG',
373
+            'class': 'logging.StreamHandler',
374
+            'formatter': 'verbose'
375
+        },
376
+    },
377
+    'loggers': {
378
+        'logit': {
379
+            'handlers': ['logit'],
380
+            'level': 'DEBUG',
381
+            'propagate': True,
382
+        },
383
+        'console': {
384
+            'handlers': ['console'],
385
+            'level': 'DEBUG',
386
+            'propagate': True,
387
+        },
388
+    },
389
+}
390
+
391
+# MAX_BIGINT
392
+# Why Not ``sys.maxint``
393
+# n bit platform sys.maxint = 2 ** (n - 1) - 1
394
+# 64 bit 9223372036854775807, 32 bit 2147483647
395
+from django.db.models import BigIntegerField  # isort:skip
396
+MAX_BIGINT = BigIntegerField.MAX_BIGINT

+ 68 - 0
jdjos/static/jdjos/css/common.css

@@ -0,0 +1,68 @@
1
+.text-center {
2
+    text-align: center;
3
+}
4
+
5
+/*
6
+  文本溢出省略,元素需要设置定宽度
7
+  */
8
+/* 单行 */
9
+.text_ellipsis {
10
+    overflow: hidden;
11
+    white-space: nowrap;
12
+    text-overflow: ellipsis;
13
+}
14
+/* 多行 */
15
+.a {
16
+    overflow: hidden;
17
+    text-overflow: ellipsis;
18
+    display: -webkit-box;
19
+    -webkit-line-clamp: 2;
20
+    -webkit-box-orient: vertical;
21
+}
22
+
23
+/*
24
+  浮动 & 清除浮动
25
+ */
26
+.fl {
27
+    float: left;
28
+}
29
+
30
+.fr {
31
+    float: right;
32
+}
33
+
34
+.clearfix {
35
+    zoom: 1;
36
+}
37
+
38
+.clearfix:after {
39
+    content: "\200B";
40
+    display: block;
41
+    height: 0;
42
+    clear: both;
43
+}
44
+
45
+.clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; }
46
+.clearfix { *zoom:1; }
47
+
48
+/*
49
+  解决安卓微信点击图片预览问题
50
+  这个会让 img 标签的点击事件失效,如果想要点击图片就要给上面再写一层
51
+  需要长按识别二维码的时候,则再单独给该图片添加
52
+  ```css
53
+  pointer-events: auto;
54
+  ```
55
+  来恢复对应的点击事件
56
+  */
57
+img {
58
+    pointer-events: none;
59
+}
60
+
61
+.clickable {
62
+    pointer-events: auto;
63
+}
64
+
65
+/* Input 自动填充后,移除 Chrome 默认黄色 */
66
+input:-webkit-autofill {
67
+    box-shadow: 0 0 0 1000px white inset !important;
68
+}

+ 574 - 0
jdjos/static/jdjos/js/jswe.js

@@ -0,0 +1,574 @@
1
+!(function(e, t) {
2
+    var config = {
3
+        wxconfig: 'http://api.tt4it.com/wx/jsapi_signature',
4
+        callback: 'callback'
5
+    }, wxData = {
6
+        debug: false,
7
+        imgUrl: '',
8
+        link: '',
9
+        desc: '',
10
+        title: '',
11
+        timeLine: ''
12
+    }, wxConfig = {
13
+        hide: false,
14
+        baseFlag: false,
15
+        baseHide: false,
16
+        close: false,
17
+        hideMenuItems: [],
18
+        showMenuItems: []
19
+    }, jsApiList = [
20
+        'checkJsApi',
21
+        'onMenuShareTimeline',
22
+        'onMenuShareAppMessage',
23
+        'onMenuShareQQ',
24
+        'onMenuShareWeibo',
25
+        'onMenuShareQZone',
26
+        'hideMenuItems',
27
+        'showMenuItems',
28
+        'hideAllNonBaseMenuItem',
29
+        'showAllNonBaseMenuItem',
30
+        'translateVoice',
31
+        'startRecord',
32
+        'stopRecord',
33
+        'onRecordEnd',
34
+        'playVoice',
35
+        'pauseVoice',
36
+        'stopVoice',
37
+        'uploadVoice',
38
+        'downloadVoice',
39
+        'chooseImage',
40
+        'previewImage',
41
+        'uploadImage',
42
+        'downloadImage',
43
+        'getLocalImgData',
44
+        'getNetworkType',
45
+        'openLocation',
46
+        'getLocation',
47
+        'hideOptionMenu',
48
+        'showOptionMenu',
49
+        'closeWindow',
50
+        'scanQRCode',
51
+        'chooseWXPay',
52
+        'openEnterpriseRedPacket',
53
+        'openProductSpecificView',
54
+        'addCard',
55
+        'chooseCard',
56
+        'openCard'
57
+    ], wxApiFun
58
+
59
+    function isEmpty(obj) {
60
+        if (obj == null) return true
61
+        if (obj.length > 0) return false
62
+        if (obj.length === 0) return true
63
+        for (var key in obj) {
64
+            if (Object.prototype.hasOwnProperty.call(obj, key)) return false
65
+        }
66
+        return true
67
+    }
68
+
69
+    function isNotEmpty(obj) {
70
+        return !isEmpty(obj)
71
+    }
72
+
73
+    function isOpenOnPC() {  // 判断当前网页是否在 PC 浏览器中打开
74
+        var ua = navigator.userAgent
75
+        return /windows nt/i.test(ua) || /macintosh/i.test(ua) || /linux x86_64/i.test(ua)
76
+    }
77
+
78
+    function isOpenInWeixin() {  // 判断当前网页是否在微信内置浏览器中打开
79
+        return /micromessenger/i.test(navigator.userAgent)
80
+    }
81
+
82
+    function getWeixinVersion() {
83
+        var ua = navigator.userAgent,
84
+            mt = ua.match(/micromessenger\/([\d.]+)/i)
85
+        return (mt ? mt[1] : '')
86
+    }
87
+
88
+    // This function checks whether Wechat is the appointed version or not
89
+    // Cmp: http://jsperf.com/regexp-test-vs-indexof-ignore-upper-and-lower
90
+    function isWeixinVersion(version) {
91
+        // return new RegExp('micromessenger/' + version , 'i').test(navigator.userAgent)
92
+        return navigator.userAgent.toLowerCase().indexOf('micromessenger/' + version) != -1
93
+    }
94
+
95
+    function hideOptionMenu() {
96
+        wxConfig.hide = true
97
+        fixedWxData()
98
+    }
99
+
100
+    function showOptionMenu() {
101
+        wxConfig.hide = false
102
+        fixedWxData()
103
+    }
104
+
105
+    function hideMenuItems(items) {
106
+        wxConfig.hideMenuItems = items
107
+        fixedWxData()
108
+    }
109
+
110
+    function showMenuItems(items) {
111
+        wxConfig.showMenuItems = items
112
+        fixedWxData()
113
+    }
114
+
115
+    function hideAllNonBaseMenuItem() {
116
+        wxConfig.baseFlag = true
117
+        wxConfig.baseHide = true
118
+        fixedWxData()
119
+    }
120
+
121
+    function showAllNonBaseMenuItem() {
122
+        wxConfig.baseFlag = true
123
+        wxConfig.baseHide = false
124
+        fixedWxData()
125
+    }
126
+
127
+    function closeWindow() {
128
+        wxConfig.close = true
129
+        fixedWxData()
130
+    }
131
+
132
+    function wxReady(data) {
133
+        data = typeof data === 'object' ? data : JSON.parse(data)
134
+        wx.config({
135
+            debug: wxData.debug,
136
+            appId: data.appId,
137
+            timestamp: data.timestamp,
138
+            nonceStr: data.nonceStr,
139
+            signature: data.signature,
140
+            jsApiList: jsApiList
141
+        })
142
+
143
+        var callbacks = {
144
+            trigger: function (res) {
145
+                // alert('用户点击发送给朋友')
146
+                if (JSWE.wxTrigger) {JSWE.wxTrigger(res)}
147
+            },
148
+            success: function (res) {
149
+                // alert('已分享')
150
+                if (JSWE.wxSuccess) {JSWE.wxSuccess(res)}
151
+            },
152
+            cancel: function (res) {
153
+                // alert('已取消')
154
+                if (JSWE.wxCancel) {JSWE.wxCancel(res)}
155
+            },
156
+            fail: function (res) {
157
+                // alert(JSON.stringify(res))
158
+                if (JSWE.wxFail) {JSWE.wxFail(res)}
159
+            }
160
+        }, shareInfo = function(flag) {
161
+            var _share = {
162
+                title: flag ? wxData.title : (wxData.timeLine || wxData.desc),
163
+                link: wxData.link,
164
+                imgUrl: wxData.imgUrl,
165
+                trigger: callbacks.trigger,
166
+                success: callbacks.success,
167
+                cancel: callbacks.cancel,
168
+                fail: callbacks.fail
169
+            }
170
+            if (flag) _share.desc = wxData.desc
171
+            return _share
172
+        }, wxShareApi = function() {
173
+            // 2. 分享接口
174
+            // 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口
175
+            wx.onMenuShareAppMessage(shareInfo(1))
176
+            // 2.2 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
177
+            wx.onMenuShareTimeline(shareInfo(0))
178
+            // 2.3 监听“分享到QQ”按钮点击、自定义分享内容及分享结果接口
179
+            wx.onMenuShareQQ(shareInfo(1))
180
+            // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口
181
+            wx.onMenuShareWeibo(shareInfo(1))
182
+            // 2.5 监听“分享到QQ空间”按钮点击、自定义分享内容及分享结果接口
183
+            wx.onMenuShareQZone(shareInfo(1))
184
+        }, wxMenuApi = function () {
185
+            // 8. 界面操作接口
186
+            // 8.1 隐藏右上角菜单
187
+            // 8.2 显示右上角菜单
188
+            if (wxConfig.hide) {wx.hideOptionMenu()} else {wx.showOptionMenu()}
189
+            // 8.3 批量隐藏菜单项
190
+            if (isNotEmpty(wxConfig.hideMenuItems)) {
191
+                wx.hideMenuItems({
192
+                    menuList: wxConfig.hideMenuItems,
193
+                    success: function (res) {
194
+                        if (JSWE.wxHideMenuItemsSuccess) {JSWE.wxHideMenuItemsSuccess(res)}
195
+                    },
196
+                    fail: function (res) {
197
+                        if (JSWE.wxHideMenuItemsFail) {JSWE.wxHideMenuItemsFail(res)}
198
+                    }
199
+                })
200
+            }
201
+            // 8.4 批量显示菜单项
202
+            if (isNotEmpty(wxConfig.showMenuItems)) {
203
+                wx.showMenuItems({
204
+                    menuList: wxConfig.showMenuItems,
205
+                    success: function (res) {
206
+                        if (JSWE.wxShowMenuItemsSuccess) {JSWE.wxShowMenuItemsSuccess(res)}
207
+                    },
208
+                    fail: function (res) {
209
+                        if (JSWE.wxShowMenuItemsFail) {JSWE.wxShowMenuItemsFail(res)}
210
+                    }
211
+                })
212
+            }
213
+            // 8.5 隐藏所有非基本菜单项
214
+            // 8.6 显示所有被隐藏的非基本菜单项
215
+            if (wxConfig.baseFlag) {
216
+                if (wxConfig.baseHide) {wx.hideAllNonBaseMenuItem()} else {wx.showAllNonBaseMenuItem()}
217
+            }
218
+            // 8.7 关闭当前窗口
219
+            if (wxConfig.close) {wx.closeWindow()}
220
+        }, wxVoiceApi = function() {
221
+            // 4.3 监听录音自动停止
222
+            wx.onVoiceRecordEnd({
223
+                complete: function (res) {
224
+                    voice.localId = res.localId
225
+                    if (JSWE.wxVoiceRecordEnd) {JSWE.wxVoiceRecordEnd(res)}
226
+                }
227
+            })
228
+            // 4.7 监听录音播放停止
229
+            wx.onVoicePlayEnd({
230
+                complete: function (res) {
231
+                    if (JSWE.wxVoicePlayEnd) {JSWE.wxVoicePlayEnd(res)}
232
+                }
233
+            })
234
+        }, wxApi = function () {
235
+            wxShareApi()
236
+            wxMenuApi()
237
+            wxVoiceApi()
238
+        }
239
+
240
+        wx.ready(wxApi)
241
+
242
+        return wxApiFun = wxApi
243
+    }
244
+
245
+    if (isOpenInWeixin() || isOpenOnPC()) {
246
+        if ('undefined' !== typeof JSWE_CONF_UPDATE) JSWE_CONF_UPDATE(config)
247
+        $.ajax({
248
+            url: config.wxconfig,
249
+            type: 'get',
250
+            dataType: 'jsonp',
251
+            jsonpCallback: config.callback,
252
+            data: {
253
+                url: window.location.href.split('#')[0]
254
+            },
255
+            success: wxReady
256
+        })
257
+    }
258
+
259
+    function initWxData(data, flag) {
260
+        for(var d in data) {if (d in wxData) wxData[d] = data[d]}
261
+        if (flag) fixedWxData()
262
+    }
263
+
264
+    function changeWxData(key, value, flag) {
265
+        if (key in falDwxDataata) {wxData[key] = value}
266
+        if (flag) fixedWxData()
267
+    }
268
+
269
+    function fixedWxData() {
270
+        if ('undefined' !== typeof wxApiFun) wxApiFun()
271
+    }
272
+
273
+    // 3 智能接口
274
+    var voice = {
275
+        localId: '',
276
+        serverId: ''
277
+    }
278
+    // 3.1 识别音频并返回识别结果
279
+    function translateVoice() {
280
+        if (voice.localId == '') {
281
+            if (JSWE.wxTranslateVoiceEmpty) {JSWE.wxTranslateVoiceEmpty()}
282
+            return
283
+        }
284
+        wx.translateVoice({
285
+            localId: voice.localId,
286
+            complete: function (res) {
287
+                if (JSWE.wxTranslateVoiceComplete) {JSWE.wxTranslateVoiceComplete(res)}
288
+            }
289
+        })
290
+    }
291
+
292
+    // 4 音频接口
293
+    // 4.1 开始录音
294
+    function startRecord() {
295
+        wx.startRecord({
296
+            cancel: function () {
297
+                if (JSWE.wxStartRecordCancel) {JSWE.wxStartRecordCancel(res)}
298
+            }
299
+        })
300
+    }
301
+
302
+    // 4.2 停止录音
303
+    function stopRecord() {
304
+        wx.stopRecord({
305
+          success: function (res) {
306
+              voice.localId = res.localId
307
+              if (JSWE.wxStopRecordSuccess) {JSWE.wxStopRecordSuccess(res)}
308
+          },
309
+          fail: function (res) {
310
+              if (JSWE.wxStopRecordFail) {JSWE.wxStopRecordFail(res)}
311
+          }
312
+        })
313
+    }
314
+
315
+    // 4.4 播放音频
316
+    function playVoice() {
317
+        if (voice.localId == '') {
318
+            if (JSWE.wxPlayVoiceEmpty) {JSWE.wxPlayVoiceEmpty()}
319
+            return
320
+        }
321
+        wx.playVoice({
322
+            localId: voice.localId
323
+        })
324
+    }
325
+
326
+    // 4.5 暂停播放音频
327
+    function pauseVoice() {
328
+        if (voice.localId == '') {
329
+            if (JSWE.wxPauseVoiceEmpty) {JSWE.wxPauseVoiceEmpty()}
330
+            return
331
+        }
332
+        wx.pauseVoice({
333
+            localId: voice.localId
334
+        })
335
+    }
336
+
337
+    // 4.6 停止播放音频
338
+    function stopVoice() {
339
+        if (voice.localId == '') {
340
+            if (JSWE.wxStopVoiceEmpty) {JSWE.wxStopVoiceEmpty()}
341
+            return
342
+        }
343
+        wx.stopVoice({
344
+            localId: voice.localId
345
+        })
346
+    }
347
+
348
+    // 4.8 上传语音
349
+    function uploadVoice() {
350
+        var localId = voice.localId
351
+        if (localId == '') {
352
+            if (JSWE.wxUploadVoiceEmpty) {JSWE.wxUploadVoiceEmpty()}
353
+            return
354
+        }
355
+        wx.uploadVoice({
356
+            localId: localId,
357
+            success: function (res) {
358
+                voice.serverId = res.serverId
359
+                if (JSWE.wxUploadVoiceSuccess) {JSWE.wxUploadVoiceSuccess(res, localId)}
360
+            }
361
+        })
362
+    }
363
+
364
+    // 4.9 下载语音
365
+    function downloadVoice() {
366
+        var serverId = voice.serverId
367
+        if (serverId == '') {
368
+            if (JSWE.wxDownloadVoiceEmpty) {JSWE.wxDownloadVoiceEmpty()}
369
+            return
370
+        }
371
+        wx.downloadVoice({
372
+            serverId: serverId,
373
+            success: function (res) {
374
+                voice.localId = res.localId
375
+                if (JSWE.wxDownloadVoiceSuccess) {JSWE.wxDownloadVoiceSuccess(res, serverId)}
376
+            }
377
+        })
378
+    }
379
+
380
+    // 5 图片接口
381
+    var images = {
382
+        localIds: [],
383
+        serverIds: []
384
+    }
385
+    // 5.1 拍照、本地选图
386
+    function chooseImage(choose_params) {
387
+        if ('undefined' === typeof choose_params) choose_params = {}
388
+        wx.chooseImage({
389
+            count: choose_params.count || 9, // 默认9
390
+            sizeType: choose_params.sizeType || ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
391
+            sourceType: choose_params.sourceType || ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
392
+            success: function (res) {
393
+                images.localIds = res.localIds // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
394
+                // 判断是否直接上传
395
+                if (choose_params.directUpload) {setTimeout(uploadImages({localIds: images.localIds, isShowProgressTips: choose_params.isShowProgressTips || 1}), 100)}
396
+                // 拍照、本地选图成功后的回调函数
397
+                if (JSWE.wxChooseImageSuccess) {JSWE.wxChooseImageSuccess(res, choose_params.extras || {})}
398
+            }
399
+        })
400
+    }
401
+
402
+    // 5.2 图片预览
403
+    function previewImage(preview_params) {
404
+        wx.previewImage({
405
+            current: preview_params.current, // 当前显示图片的链接,不填则默认为 urls 的第一张
406
+            urls: preview_params.urls // 需要预览的图片链接列表
407
+        })
408
+    }
409
+
410
+    // 5.3 上传图片
411
+    function uploadImage(upload_params) {
412
+        // 上传图片为异步处理,重复上传同一图片,返回的serverId也是不同的
413
+        var localId = upload_params.localId
414
+        wx.uploadImage({
415
+            localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
416
+            isShowProgressTips: upload_params.isShowProgressTips || 1, // 默认为1,显示进度提示
417
+            success: function (res) {
418
+                images.serverIds.push(res.serverId) // 返回图片的服务器端ID
419
+                // 上传图片成功后的回调函数
420
+                if (JSWE.wxUploadImageSuccess) {JSWE.wxUploadImageSuccess(res, localId)}
421
+            }
422
+        })
423
+    }
424
+
425
+    function uploadImages(upload_params) {
426
+        var localIds = upload_params.localIds, isShowProgressTips = upload_params.isShowProgressTips || 1
427
+        images.serverIds = []
428
+        for (var idx in localIds) {uploadImage({localId: localIds[idx], isShowProgressTips: isShowProgressTips})}
429
+    }
430
+
431
+    // 5.4 下载图片
432
+    function downloadImage(download_params) {
433
+        var serverId = download_params.serverId
434
+        wx.downloadImage({
435
+            serverId: serverId, // 需要下载的图片的服务器端ID,由uploadImage接口获得
436
+            isShowProgressTips: download_params.isShowProgressTips || 1, // 默认为1,显示进度提示
437
+            success: function (res) {
438
+                images.localId.push(res.localId)
439
+                if (JSWE.wxDownloadImageSuccess) {JSWE.wxDownloadImageSuccess(res, serverId)}
440
+            }
441
+        })
442
+    }
443
+
444
+    function downloadImages(download_params) {
445
+        var serverIds = download_params.serverIds, isShowProgressTips = download_params.isShowProgressTips || 1
446
+        images.localIds = []
447
+        for (var idx in serverIds) {downloadImage({serverId: serverIds[idx], isShowProgressTips: isShowProgressTips})}
448
+    }
449
+
450
+    function getLocalImgData(localId) {
451
+        wx.getLocalImgData({
452
+            localId: localId, // 图片的localID
453
+            success: function (res) {
454
+                // var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
455
+                if (JSWE.wxGetLocalImgDataSuccess) {JSWE.wxGetLocalImgDataSuccess(res)}
456
+            }
457
+        })
458
+    }
459
+
460
+    // 9 微信原生接口
461
+    // 9.1.1 扫描二维码并返回结果
462
+    // 9.1.2 扫描二维码并返回结果
463
+    function scanQRCode(scan_params) {
464
+        if ('undefined' === typeof scan_params) scan_params = {}
465
+        wx.scanQRCode({
466
+            needResult: scan_params.needResult || 0,  // 默认为0,0扫描结果由微信处理,1直接返回扫描结果
467
+            scanType: scan_params.scanType || ['qrCode', 'barCode'],  // 可以指定扫二维码还是一维码,默认二者都有
468
+            success: function (res) {  // 当 needResult 为 1 时,扫码返回的结果
469
+                if (JSWE.wxScanQRCodeSuccess) {JSWE.wxScanQRCodeSuccess(res)}
470
+            }
471
+        })
472
+    }
473
+
474
+    // QRCode & BarCode is different
475
+    function parseScanQRCodeResultStr(resultStr) {
476
+        var strs = resultStr.split(',')
477
+        return strs[strs.length - 1]
478
+    }
479
+
480
+    // 10 微信支付接口
481
+    // 10.1 发起一个支付请求
482
+    function chooseWXPay(wxpay_params) {
483
+        wx.chooseWXPay({
484
+            timestamp: wxpay_params.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
485
+            nonceStr: wxpay_params.nonceStr, // 支付签名随机串,不长于 32 位
486
+            package: wxpay_params.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
487
+            signType: wxpay_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
488
+            paySign: wxpay_params.paySign, // 支付签名
489
+            success: function (res) {
490
+                // 支付成功后的回调函数
491
+                if (JSWE.wxPaySuccess) {JSWE.wxPaySuccess(res)}
492
+            }
493
+        })
494
+    }
495
+
496
+    // xx 微信原生企业红包接口
497
+    // xx.1 发起一个发送原生企业红包请求
498
+    function openEnterpriseRedPacket(wxredpack_params) {
499
+        wx.openEnterpriseRedPacket({
500
+            timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
501
+            nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位
502
+            package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***)
503
+            signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
504
+            paySign: wxredpack_params.paySign, // 红包签名
505
+            success: function (res) {
506
+                // 发送原生企业红包成功后的回调函数
507
+                if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
508
+            }
509
+        })
510
+    }
511
+
512
+    var v = {
513
+        version: '1.0.5',
514
+
515
+        // Basic Vars
516
+        config: config,
517
+        wxData: wxData,
518
+        jsApiList: jsApiList,
519
+
520
+        isEmpty: isEmpty,
521
+        isNotEmpty: isNotEmpty,
522
+
523
+        // Weixin Function
524
+        isOpenInWeixin: isOpenInWeixin,
525
+        getWeixinVersion: getWeixinVersion,
526
+        isWeixinVersion: isWeixinVersion,
527
+
528
+        // Menu Function
529
+        hideOptionMenu: hideOptionMenu,
530
+        showOptionMenu: showOptionMenu,
531
+        hideMenuItems: hideMenuItems,
532
+        showMenuItems: showMenuItems,
533
+        hideAllNonBaseMenuItem: hideAllNonBaseMenuItem,
534
+        showAllNonBaseMenuItem: showAllNonBaseMenuItem,
535
+        closeWindow: closeWindow,
536
+
537
+        // Share Function
538
+        initWxData: initWxData,
539
+        changeWxData: changeWxData,
540
+        fixedWxData: fixedWxData,
541
+
542
+        // Voice Function
543
+        voice: voice,
544
+        translateVoice: translateVoice,
545
+        startRecord: startRecord,
546
+        stopRecord: stopRecord,
547
+        playVoice: playVoice,
548
+        pauseVoice: pauseVoice,
549
+        stopVoice: stopVoice,
550
+        uploadVoice: uploadVoice,
551
+        downloadVoice: downloadVoice,
552
+
553
+        // Image Function
554
+        images: images,
555
+        chooseImage: chooseImage,
556
+        previewImage: previewImage,
557
+        uploadImage: uploadImage,
558
+        uploadImages: uploadImages,
559
+        downloadImage: downloadImage,
560
+        downloadImages: downloadImages,
561
+        getLocalImgData: getLocalImgData,
562
+
563
+        // Scan Function
564
+        scanQRCode: scanQRCode,
565
+        parseScanQRCodeResultStr: parseScanQRCodeResultStr,
566
+
567
+        // Pay Function
568
+        chooseWXPay: chooseWXPay,
569
+
570
+        // EnterpriseRedPacket Function
571
+        openEnterpriseRedPacket: openEnterpriseRedPacket
572
+    }
573
+    e.JSWE = e.V = v
574
+})(window)

+ 52 - 0
jdjos/urls.py

@@ -0,0 +1,52 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""jdjos URL Configuration
4
+
5
+The `urlpatterns` list routes URLs to views. For more information please see:
6
+    https://docs.djangoproject.com/en/1.11/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. Import the include() function: from django.conf.urls import url, include
16
+    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
17
+"""
18
+from django.conf import settings
19
+from django.conf.urls import include, url
20
+from django.conf.urls.static import static
21
+from django.contrib import admin
22
+
23
+
24
+urlpatterns = [
25
+    url(r'^admin/', admin.site.urls),
26
+]
27
+
28
+urlpatterns += [
29
+    url(r'^api/', include('api.urls', namespace='api')),
30
+    url(r'^uniapi/', include('django_uniapi.urls', namespace='uniapi')),
31
+]
32
+
33
+urlpatterns += [
34
+    # url(r'^s/', include('django_short_url.urls', namespace='django_short_url')),
35
+]
36
+
37
+urlpatterns += [
38
+    url(r'^w/', include('django_we.urls', namespace='shortwechat')),
39
+    url(r'^we/', include('django_we.urls', namespace='wechat')),
40
+]
41
+
42
+urlpatterns += [
43
+    # url(r'^p/', include('page.urls', namespace='shortpage')),
44
+    # url(r'^page/', include('page.urls', namespace='page')),
45
+]
46
+
47
+urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
48
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
49
+
50
+# AdminSite
51
+admin.site.site_title = ''
52
+admin.site.site_header = 'My administration'

+ 17 - 0
jdjos/wsgi.py

@@ -0,0 +1,17 @@
1
+"""
2
+WSGI config for jdjos 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.11/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", "jdjos.settings")
16
+
17
+application = get_wsgi_application()

+ 23 - 0
manage.py

@@ -0,0 +1,23 @@
1
+#!/usr/bin/env python
2
+import os
3
+import sys
4
+
5
+
6
+if __name__ == "__main__":
7
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jdjos.settings")
8
+    try:
9
+        from django.core.management import execute_from_command_line
10
+    except ImportError:
11
+        # The above import may fail for some other reason. Ensure that the
12
+        # issue is really that Django is missing to avoid masking other
13
+        # exceptions on Python 2.
14
+        try:
15
+            import django
16
+        except ImportError:
17
+            raise ImportError(
18
+                "Couldn't import Django. Are you sure it's installed and "
19
+                "available on your PYTHONPATH environment variable? Did you "
20
+                "forget to activate a virtual environment?"
21
+            )
22
+        raise
23
+    execute_from_command_line(sys.argv)

+ 10 - 0
pep8.sh

@@ -0,0 +1,10 @@
1
+#!/bin/bash
2
+
3
+# Ignoring autogenerated files
4
+#  -- Migration directories
5
+# Ignoring error codes
6
+#  -- E128 continuation line under-indented for visual indent
7
+#  -- E402 module level import not at top of file
8
+#  -- E501 line too long
9
+
10
+pycodestyle --exclude=build,migrations,.tox --ignore=E128,E402,E501 .

+ 7 - 0
requirements.txt

@@ -0,0 +1,7 @@
1
+StatusCode==1.0.0
2
+furl==2.0.0
3
+jsonfield==2.0.2
4
+mysqlclient==1.3.13
5
+-r requirements_dj.txt
6
+-r requirements_pywe.txt
7
+-r requirements_redis.txt

+ 3 - 0
requirements_deploy.txt

@@ -0,0 +1,3 @@
1
+ipdb==0.11
2
+ipython==5.6.0
3
+uwsgi==2.0.17

+ 2 - 0
requirements_dev.txt

@@ -0,0 +1,2 @@
1
+isort==4.3.9
2
+pycodestyle==2.4.0

+ 15 - 0
requirements_dj.txt

@@ -0,0 +1,15 @@
1
+Django==1.11.16
2
+django-admin==1.3.2
3
+django-detect==1.0.8
4
+django-file==1.0.3
5
+django-json-render==1.0.2
6
+django-json-response==1.1.5
7
+django-logit==1.1.3
8
+django-models-ext==1.1.8
9
+django-redis-connector==1.0.1
10
+django-response==1.1.1
11
+django-rlog==1.0.7
12
+django-short-url==1.1.3
13
+django-six==1.0.4
14
+django-uniapi==1.0.5
15
+django-we==1.4.2

+ 2 - 0
requirements_pywe.txt

@@ -0,0 +1,2 @@
1
+pywe-oauth==1.0.7
2
+pywe-pay==1.0.12

+ 3 - 0
requirements_redis.txt

@@ -0,0 +1,3 @@
1
+hiredis==1.0.0
2
+redis==2.10.6
3
+redis-extensions==1.2.5

+ 4 - 0
sysctl.sh

@@ -0,0 +1,4 @@
1
+#!/bin/bash
2
+
3
+sudo sysctl -w net.core.somaxconn=4096
4
+sudo sysctl -w net.core.netdev_max_backlog=50000

+ 0 - 0
utils/__init__.py


+ 0 - 0
utils/error/__init__.py


+ 77 - 0
utils/error/errno_utils.py

@@ -0,0 +1,77 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from StatusCode import BaseStatusCode, StatusCodeField
4
+
5
+
6
+class ParamStatusCode(BaseStatusCode):
7
+    """ 4000xx 参数相关错误码 """
8
+    PARAM_NOT_FOUND = StatusCodeField(400000, 'Param Not Found', description=u'参数不存在')
9
+
10
+
11
+class ProfileStatusCode(BaseStatusCode):
12
+    """ 4001xx 用户相关错误码 """
13
+    PROFILE_NOT_FOUND = StatusCodeField(400101, 'Profile Not Found', description=u'用户不存在')
14
+
15
+
16
+class PhoneStatusCode(BaseStatusCode):
17
+    """ 4002xx 手机相关错误码 """
18
+    INVALID_PHONE = StatusCodeField(400200, 'Invalid Phone', description=u'非法手机号')
19
+    PHONE_NOT_FOUND = StatusCodeField(400201, 'Phone Not Found', description=u'手机号不存在')
20
+    PHONE_ALREADY_EXISTS = StatusCodeField(400202, 'Phone Already Exists', description=u'手机号已存在')
21
+
22
+
23
+class OrderStatusCode(BaseStatusCode):
24
+    """ 4040xx 订单/支付相关错误码 """
25
+    UNIFIED_ORDER_FAIL = StatusCodeField(404000, 'Unified Order Fail', description=u'统一下单失败')
26
+    ORDER_NOT_FOUND = StatusCodeField(404001, 'Order Not Found', description=u'订单不存在')
27
+    # 订单支付状态
28
+    ORDER_NOT_PAY = StatusCodeField(404011, 'Order Not Pay', description=u'订单未支付')
29
+    ORDER_PAYING = StatusCodeField(404012, 'Order Paying', description=u'订单支付中')
30
+    ORDER_PAY_FAIL = StatusCodeField(404013, 'Order Pay Fail', description=u'微信支付失败')
31
+    # 通知校验状态
32
+    SIGN_CHECK_FAIL = StatusCodeField(404090, 'Sign Check Fail', description=u'签名校验失败')
33
+    FEE_CHECK_FAIL = StatusCodeField(404091, 'FEE Check Fail', description=u'金额校验失败')
34
+
35
+
36
+class PayStatusCode(BaseStatusCode):
37
+    """ 4041xx 支付相关错误码 """
38
+
39
+
40
+class WithdrawStatusCode(BaseStatusCode):
41
+    """ 4042xx 提现相关错误码 """
42
+    BALANCE_INSUFFICIENT = StatusCodeField(404200, 'Balance Insufficient', description=u'提现金额不足')
43
+
44
+
45
+class TokenStatusCode(BaseStatusCode):
46
+    """ 4090xx 票据相关错误码 """
47
+    TOKEN_NOT_FOUND = StatusCodeField(409001, 'Token Not Found', description=u'票据不存在')
48
+
49
+
50
+class SignatureStatusCode(BaseStatusCode):
51
+    """ 4091xx 签名校验错误 """
52
+    SIGNATURE_ERROR = StatusCodeField(409101, 'Signature Error', description=u'签名错误')
53
+
54
+
55
+class GVCodeStatusCode(BaseStatusCode):
56
+    """ 4092xx 图形验证码相关错误码 """
57
+    GRAPHIC_VCODE_ERROR = StatusCodeField(409201, 'Graphic VCode Error', description=u'图形验证码错误')
58
+
59
+
60
+class SVCodeStatusCode(BaseStatusCode):
61
+    """ 4093xx 短信验证码相关错误码 """
62
+    SMS_QUOTA_LIMIT = StatusCodeField(409300, 'SMS Quota Limit', description=u'短信次数超限')
63
+    SMS_VCODE_ERROR = StatusCodeField(409301, 'SMS VCode Error', description=u'验证码错误,请稍后重试')
64
+    SMS_VCODE_HAS_SEND = StatusCodeField(409302, 'SMS VCode Has Send', description=u'验证码已发送,请勿重复获取')
65
+
66
+
67
+class InsufficientStatusCode(BaseStatusCode):
68
+    """ 4095xx 不足相关错误码 """
69
+    BALANCE_INSUFFICIENT = StatusCodeField(409501, 'Balance Insufficient', description=u'余额不足')
70
+    INTEGRAL_INSUFFICIENT = StatusCodeField(409502, 'Integral Insufficient', description=u'积分不足')
71
+
72
+
73
+class PermissionStatusCode(BaseStatusCode):
74
+    """ 4099xx 权限相关错误码 """
75
+    PERMISSION_DENIED = StatusCodeField(409900, 'Permission Denied', description=u'权限不足')
76
+    UPLOAD_PERMISSION_DENIED = StatusCodeField(409910, 'Upload Permission Denied', description=u'上传权限不足')
77
+    UPDATE_PERMISSION_DENIED = StatusCodeField(409930, 'Update Permission Denied', description=u'更新权限不足')

+ 24 - 0
utils/error/response_utils.py

@@ -0,0 +1,24 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from json_response import JsonpResponse, 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={}, msg_args=[], msg_kwargs={}, desc_args=[], desc_kwargs={}, request=None, callback=None, **kwargs):
17
+    # Final Message and Description
18
+    message, description = (message or status_code.message, description or status_code.description) if isinstance(status_code, StatusCodeField) else (message, description)
19
+    # Final Response Data
20
+    resp_data = response_data(status_code, (message or '').format(*msg_args, **msg_kwargs), (description or '').format(*desc_args, **desc_kwargs), data, **kwargs)
21
+    # Assign Callback
22
+    callback = callback or (request and request.GET.get('callback'))
23
+    # Call JsonResponse or JsonpResponse
24
+    return JsonpResponse(callback, resp_data, safe=False) if callback else JsonResponse(resp_data, safe=False)

+ 0 - 0
utils/redis/__init__.py


+ 6 - 0
utils/redis/connect.py

@@ -0,0 +1,6 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+
5
+
6
+r = settings.REDIS_CACHE

+ 1 - 0
utils/redis/rkeys.py

@@ -0,0 +1 @@
1
+# -*- coding: utf-8 -*-

+ 0 - 0
utils/user/__init__.py


+ 18 - 0
utils/user/userinfo_save.py

@@ -0,0 +1,18 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def userinfo_save(userinfo):
5
+    """ Save profile or something else """
6
+    # from account.models import UserInfo
7
+    # from django.conf import settings
8
+    #
9
+    # unique_identifier = userinfo.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
10
+    #
11
+    # user, created = UserInfo.objects.select_for_update().get_or_create(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
12
+    # user.unionid = userinfo.get('unionid', '')
13
+    # user.openid = userinfo.get('openid', '')
14
+    # user.nickname = userinfo.get('nickname', '')
15
+    # user.avatar = userinfo.get('headimgurl', '')
16
+    # user.save()
17
+    #
18
+    # return user

kodo - Gogs: Go Git Service

Nav apraksta

ess.py 119KB

    # -*- coding: utf-8 -*- import base64 import json from Cryptodome.Cipher import AES from django.conf import settings from tencentcloud.common import credential from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.ess.v20201111 import ess_client, models from TimeConvert import TimeConvert as tc tencentcloud_cfg = settings.TENCENTCLOUD.get('ess', {}) operator_id = tencentcloud_cfg.get('operator_id') template_id = tencentcloud_cfg.get('template_id') secret_id = tencentcloud_cfg.get('secret_id') secret_key = tencentcloud_cfg.get('secret_key') callback_secret_key = tencentcloud_cfg.get('callback_secret_key') callback_secret_token = tencentcloud_cfg.get('callback_secret_token') endpoint = tencentcloud_cfg.get('endpoint') file_endpoint = tencentcloud_cfg.get('file_endpoint') def test_upload_document_files(files, file_type='png'): files = [ { "FileBody": "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", "FileName": "test.png" } ] return upload_document_files(files, file_type='png') def upload_document_files(files, file_type='png'): _files = files file_ids = [] # 腾讯电子签接口限制 20 张图片 while len(_files) > 0: res = upload_files(_files[:20], file_type=file_type, business_type='DOCUMENT') print(res) file_ids = file_ids + res.FileIds _files = _files[20:] return file_ids def upload_files(files, file_type='png', business_type='DOCUMENT'): # https://qian.tencent.com/developers/companyApis/templatesAndFiles/UploadFiles/ try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = file_endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.UploadFilesRequest() params = { "FileType": file_type, "Caller": { "OperatorId": operator_id }, "FileInfos": files, "BusinessType": business_type } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.UploadFiles(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp def test_create_flow(): class lensman: phone = '18888888888' identity_card_name = '张三' identity_card_number = '460005199605144313' FlowName = lensman.identity_card_name + "的投稿合同" + tc.local_string(format='%Y%m%d') FlowType = '活动投稿授权书' Approvers = [{ "ApproverType": 1, "Required": True, "NotifyType": None, "ApproverMobile": lensman.phone, "ApproverName": lensman.identity_card_name, "ApproverIdCardType": "ID_CARD", "ApproverIdCardNumber": lensman.identity_card_number, }] return create_flow(flow_name=FlowName, flow_type=FlowType, approvers=Approvers) def create_flow(flow_name=None, flow_type=None, approvers=None): # https://qian.tencent.com/developers/companyApis/startFlows/CreateFlow try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.CreateFlowRequest() params = { "Operator": { "UserId": operator_id }, "FlowName": flow_name, "FlowType": flow_type, "Approvers": approvers, } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.CreateFlow(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp def test_create_document(): class lensman: phone = '18888888888' identity_card_name = '张三' identity_card_number = '460005199605144313' flow_id = 'yDCHHUU08ki1zsUY6XuiSQfzpNaT4BXE' file_id = 'yDCHHUU08q2s90UGmXutvE1Vf4nBGGYu' form_fields = [ { "ComponentId": "ComponentId_0", "ComponentValue": lensman.identity_card_name }, { "ComponentId": "ComponentId_1", "ComponentValue": lensman.identity_card_number, }, { "ComponentId": "ComponentId_2", "ComponentValue": "100", }, { "ComponentId": "ComponentId_3", "ComponentValue": "壹佰", }, { "ComponentId": "ComponentId_37", "ComponentValue": file_id, } ] return create_document(flow_id=flow_id, form_fields=form_fields) def create_document(flow_id=None, form_fields=None): # https://qian.tencent.com/developers/companyApis/startFlows/CreateDocument/ try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.CreateDocumentRequest() params = { "Operator": { "UserId": operator_id }, "TemplateId": template_id, "FlowId": flow_id, "FormFields": form_fields, } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.CreateDocument(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp def test_start_flow(): flow_id = 'yDCHHUU08ki1zsUY6XuiSQfzpNaT4BXE' return start_flow(flow_id=flow_id) def start_flow(flow_id=None): # https://qian.tencent.com/developers/companyApis/startFlows/StartFlow/ try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.StartFlowRequest() params = { "Operator": { "UserId": operator_id }, "FlowId": flow_id, } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.StartFlow(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp def test_create_scheme_url(): class lensman: phone = '18888888888' identity_card_name = '张三' identity_card_number = '460005199605144313' flow_id = 'yDCHHUU08ki1zsUY6XuiSQfzpNaT4BXE' return create_scheme_url(flow_id=flow_id, name=lensman.identity_card_name, mobile=lensman.phone, card_type='ID_CARD', card_number=lensman.identity_card_number) def create_scheme_url(flow_id=None, name=None, mobile=None, card_type='ID_CARD', card_number=None): # https://qian.tencent.com/developers/companyApis/startFlows/CreateSchemeUrl try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.CreateSchemeUrlRequest() params = { "Operator": { "UserId": operator_id }, "FlowId": flow_id, "Name": name, "Mobile": mobile, "IdCardType": card_type, "IdCardNumber": card_number, "EndPoint": "APP", "PathType": 1, # 腾讯电子签小程序流程合同的详情页 "AutoJumpBack": True, # 签署完成会自动跳转回来 } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.CreateSchemeUrl(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp def decode_aes256(data, encryption_key): iv = encryption_key[0:16] aes = AES.new(encryption_key, AES.MODE_CBC, iv) d = aes.decrypt(data) unpad = lambda s: s[0:-ord(d[-1:])] return unpad(d) def test_decode(): # https://qian.tencent.com/developers/company/callback_types_v2 data = "62KE4r5Wz0yHzEpMOwVRbM1KV0pPjj+cmJkT+i65MMscgfHAdNP+9K0nV/fFw1xriwi08APc/wM0mHprE43Hc91VPhRDnu2Wn0+bjzgjmy/FgZKZATR9oquy0/BCWu4C77AjkpkoU1/E7gGLr8M9u9t7zbS4AkkGK5xL5TtwI0sS+CMygmyV7bRjxebMycI52U3QJiwDRIPxFO+7yqeXYXV9AQrRskpCDBNFGW72bh+Ixw9dtX00kWcwVQ93V+mayrvdQ8oGSsL32m72kbBfahsIvIxSYSdDAEeTyokqKGfaLWD27vm55QG218IFKEsOJFDGdqCF+IBcM/+rOFeOrewvP5ehIO2KjFBecTDn0RQTlIiokXIQ4zJKvu6njePFRFoFCZjd4oiEIVn/OBw+rjXml3qwgVBQjPRtYdvDJFNENlVjlkVVmLWeS8MIdqsFWhm6Sa7O8X57mwc0cLJ22mGbyVEzNTFqeFJ/mkueW0leLcoZdjv/+IxZusqa1cpfwzkZhwi5rY6kJffNkkrxIc6OeRvpU4ECgBe/b+kxX+ObC0z9u7nzoZAOHx4akYviyIU5B1romjdfHQ/wDr5udm4Rl4NBhU/6V06Rvaadw0Ta9oBkZHGNxFWv32MnL7fVA0zVNOFDP8n+kaQiNGFAXLF4F5oIItYc5+Gp/IxfkltEki7ni7LztViE7b/ZiKSM+gzQn6fLsJ/dlUoZmh141Y0V/GPpsbxBOnWCjBZdNkLTKxdKCMScLCTysJxv7l6Swff8nAEurbzx1tvyhJAvUDnIaLyP8pRPRFq8p0xm3ZVpOo9k7A952XxVHSs40g4sr/Dihkn60aVhGtKK9DueCzn8P3cWG4TYc03M1hNlPfF+UAfnvQ1ZYAMKT/XPLqYtgRFpRkK96YfVecIrfUe9MjWl0/g4hYCAAOJurFoeGwkJiyQ8Q7DCI5EaHa3s/vI621yQyytC6D2u86RiDJxMW0PdvkUfayT7iPwC83EsfEzpQXr0yeSCQCSBgNByEuCNnZl8LAhYl05Y9+bgCzSPt6EUvmaXclYL+/EPrEmi+hzIdXUwBfhXgICT8MteJgMSgmJM2FjjGxy6uZtfHKRIzf1wk6OORPkPJtMgjlMtMs6VFC62EEeo5Xy2v1S95WT/WQ0tnGR8KjbNnmjNSRyD8VtS2mjlLXaK0xRb71YGt57O19YxQQ3R/Hq9zGqOjG+Agdl+pcvh47RlF8o3CnlU7Q==" encryption_key = 'TencentEssEncryptTestKey12345678' return callback_decode(data, encryption_key) def callback_decode(data, encryption_key=None): # 此处传入密文,如果接收到的数据是{"encrypt":"base64后的密文"} # data = 'base64后的密文' data = base64.b64decode(data) encryption_key = encryption_key or callback_secret_key # encryption_key = bytes(encryption_key or callback_secret_key, encoding="utf8") # 此处传入CallbackUrlKey e = decode_aes256(data, encryption_key) # print(type(e)) # print(e) # print(str(e, encoding="utf8")) return json.loads(e) def test_describe_file_urls(): # { # "TotalCount": 1, # "FileUrls": [ # { # "Url": "https://file.ess.tencent.cn/file/FLOW/yDCHQUU0q7lli4UxZZqK9EJQBXolGmKl/0/0.PDF?hkey=2224d95a960e5bc7e6e3686cff314349ca93867dbd0b1eca01ba63991c8bd8e9c479977410d668b7b3d5bf14af059f969ce4644cf43a7cb6395601a042cadd33a56be20d1643070aa660af450d0ee0b6e30758030e2c0cbd2276bd1d4f05c818", # "Option": "[\"595.30,841.90\",\"-1\"]" # } # ], # "RequestId": "e9381020-c673-4ea6-b051-3a64b0e8a821" # } business_id = 'yDCHQUU0q7lli4UxZZqK9EJQBXolGmKl' return describe_file_urls(business_id=business_id) def describe_file_urls(business_type='FLOW', business_id=None, business_ids=None, file_type='PDF', url_ttl=86400): # https://qian.tencent.com/developers/companyApis/templatesAndFiles/DescribeFileUrls/ try: # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(secret_id, secret_key) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = endpoint # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = ess_client.EssClient(cred, "", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.DescribeFileUrlsRequest() business_ids = business_ids or [business_id] params = { "Operator": { "UserId": operator_id }, "BusinessType": business_type, "BusinessIds": business_ids, "FileType": file_type, "UrlTtl": url_ttl, } req.from_json_string(json.dumps(params)) # 返回的resp是一个DescribeFlowTemplatesResponse的实例,与请求对象对应 resp = client.DescribeFileUrls(req) # 输出json格式的字符串回包 # print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) resp = {} return resp