feat: Optimize slice business management 04/101504/2
authorcyuamber <xuranyjy@chinamobile.com>
Tue, 11 Feb 2020 03:21:41 +0000 (11:21 +0800)
committercyuamber <xuranyjy@chinamobile.com>
Tue, 11 Feb 2020 03:38:45 +0000 (11:38 +0800)
Change-Id: I95a55038c22cb3d54d3217fb3b0031adafc3a56a
Issue-ID: USECASEUI-369
Signed-off-by: cyuamber <xuranyjy@chinamobile.com>
usecaseui-portal/src/app/core/services/slicingTaskServices.ts
usecaseui-portal/src/app/mock/json/csmf_slicing_businessData.json
usecaseui-portal/src/app/mock/json/csmf_slicing_purchase.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/routes.js
usecaseui-portal/src/app/mock/server.js
usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.html
usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.ts
usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/csmf-slicing-business-management.component.html
usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/csmf-slicing-business-management.component.ts
usecaseui-portal/src/constants/constants.ts

index 05cf188..5a1e911 100644 (file)
@@ -48,12 +48,12 @@ export class SlicingTaskServices {
         slicingNssiQueryOfStatus: this.baseUrl + "/resource/nssi/instanceStatus/{instanceStatus}/instances/pageNo/{pageNo}/pageSize/{pageSize}",\r
         slicingNssiDetail: this.baseUrl + "/resource/nssi/{nssiId}/details",\r
         //csmf\r
-        csmfSlicingBusinessList:"/api/usecaseui/csmf/5gSlicing/services/status/{status}/pageNo/{pageNo}/pageSize/{pageSize}",\r
+        csmfSlicingBusinessList:"/api/uui-slicing/csmf/5gSlicing/orders/status/{status}/pageNo/{pageNo}/pageSize/{pageSize}",\r
         csmfActivate:"/api/usecaseui/csmf/5gSlicing/service/{serviceId}/activate",\r
         csmfDeactivate:"/api/usecaseui/csmf/5gSlicing/service/{serviceId}/deactivate",\r
         csmfTerminate:"/api/usecaseui/csmf/5gSlicing/service/{serviceId}",\r
         csmfGetProgress:"/api/usecaseui/csmf/5gSlicing/service/{serviceId}/progress",\r
-        csmfPurchase:"/uui-slicing/csmf/5gSlicing ",\r
+        csmfPurchase:"/api/uui-slicing/csmf/5gSlicing",\r
         //monitor 5G\r
         fetchTraffic: this.baseUrl + "/monitoring/queryTimestamp/{queryTimestamp}/trafficData",\r
         fetchOnlineusers: this.baseUrl + "/monitoring/queryTimestamp/{queryTimestamp}/onlineUsers",\r
@@ -198,6 +198,10 @@ export class SlicingTaskServices {
         let url = this.url.csmfGetProgress.replace("{serviceId}", paramsObj.serviceId);\r
         return this.http.get<any>(url);\r
     }\r
+    csmfSlicingPurchase(paramsObj){\r
+        let url = this.url.csmfPurchase;\r
+        return this.http.post<any>(url, paramsObj);\r
+    }\r
 \r
     //monitor 5G\r
     getFetchTraffic(service_list, time) {\r
index 4ec9345..15a0ee8 100644 (file)
@@ -5,84 +5,84 @@
   },
   "result_body": {
     "record_number": 8,
-    "slicing_service_list": [
+    "slicing_order_list": [
       {
-        "service_id": "5G-777",
-        "service_name": "eMBB_e2e_Slice_Service_5GCustomer",
+        "order_id": "5G-777",
+        "order_name": "eMBB_e2e_Slice_Service_5GCustomer",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-010101",
-        "service_status": "activated",
-        "last_operation_id": "8401c767-4fe9-43c3-82b5-707c1aaf5caf",
+        "order_status": "activated",
         "last_operation_type": "activation",
         "last_operation_process": 100
       },
       {
-        "service_id": "8c681037-75c9-444c-a665-34a66372e13e",
-        "service_name": "test_0203",
+        "order_id": "8c681037-75c9-444c-a665-34a66372e13e",
+        "order_name": "test_0203",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-1370889D",
-        "service_status": "deactivated",
-        "last_operation_id": null,
+        "order_status": "deactivated",
         "last_operation_type": null,
         "last_operation_process": null
       },
       {
-        "service_id": "dfa76a2f-6416-4070-9024-355d0d210234",
-        "service_name": "CSMFService",
+        "order_id": "dfa76a2f-6416-4070-9024-355d0d210234",
+        "order_name": "CSMFService",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-485C16B6",
-        "service_status": "deactivated",
-        "last_operation_id": "06258836-8152-43ad-9c8e-e2a1783b1996",
+        "order_status": "deactivated",
         "last_operation_type": "activation",
         "last_operation_process": 0
       },
       {
-        "service_id": "1e6a6a4b-8efb-4211-b583-b2e8567c5950",
-        "service_name": "CSMFService",
+        "order_id": "1e6a6a4b-8efb-4211-b583-b2e8567c5950",
+        "order_name": "CSMFService",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-6C572676",
-        "service_status": "deactivated",
-        "last_operation_id": null,
+        "order_status": "deactivated",
         "last_operation_type": null,
         "last_operation_process": null
       },
       {
-        "service_id": "9941305e-311f-4a88-bd9e-431252a46337",
-        "service_name": "CSMFService",
+        "order_id": "9941305e-311f-4a88-bd9e-431252a46337",
+        "order_name": "CSMFService",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-D38E2F0",
-        "service_status": "deactivated",
-        "last_operation_id": null,
+        "order_status": "deactivated",
         "last_operation_type": null,
         "last_operation_process": null
       },
       {
-        "service_id": "4876265d-e4bb-4240-bcda-7b4b00481e4a",
-        "service_name": "test_0205",
+        "order_id": "4876265d-e4bb-4240-bcda-7b4b00481e4a",
+        "order_name": "test_0205",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-6A345C48",
-        "service_status": "deactivated",
-        "last_operation_id": null,
+        "order_status": "deactivated",
         "last_operation_type": null,
         "last_operation_process": null
       },
       {
-        "service_id": "6c52086a-e9b6-4f31-bc7a-7b34d66c69c0",
-        "service_name": "test_0204",
+        "order_id": "6c52086a-e9b6-4f31-bc7a-7b34d66c69c0",
+        "order_name": "test_0204",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-774F54FC",
-        "service_status": "deactivated",
-        "last_operation_id": null,
+        "order_status": "deactivated",
         "last_operation_type": null,
         "last_operation_process": null
       },
       {
-        "service_id": "1cab507a-3422-46f8-8520-9b46c95b7f9d",
-        "service_name": "aaa",
+        "order_id": "1cab507a-3422-46f8-8520-9b46c95b7f9d",
+        "order_name": "aaa",
+        "order_creation_time":"1454171445000",
         "service_type": "embb",
         "service_snssai": "01-44AA4085",
-        "service_status": "deactivated",
-        "last_operation_id": "012c888a-a46f-4ebc-bcde-7f7c769769b7",
+        "order_status": "deactivated",
         "last_operation_type": "DELETE",
         "last_operation_process": 100
       }
diff --git a/usecaseui-portal/src/app/mock/json/csmf_slicing_purchase.json b/usecaseui-portal/src/app/mock/json/csmf_slicing_purchase.json
new file mode 100644 (file)
index 0000000..1893f80
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "result_header": {
+    "result_code": "200",
+    "result_message": "5G slicing order created normally."
+  },
+  "result_body": {
+    "service_id": "service123456",
+    "operation_id": "operation123456"
+  }
+}
\ No newline at end of file
index c454d5b..85cb6fd 100644 (file)
@@ -20,8 +20,8 @@ module.exports =
         ///////<-------------api proxy--------->/////
         "/usecaseui-server/v1/*": "/$1",
         "/usecaseui-server/v1/*?:param": "/$1",
-        "/usecaseui/csmf/*": "/$1",
-        "/usecaseui/csmf/*?:param": "/$1",
+        "/uui-slicing/csmf/*": "/$1",
+        "/uui-slicing/csmf/*?:param": "/$1",
         ///////////////
 
         //text interface
@@ -120,7 +120,8 @@ module.exports =
         "/uui-slicing/nsmf/resource/nssi/instanceStatus/:instanceStatus/instances/pageNo/:pageNo/pageSize/:pageSize": "/slicing_nssi_list_activated",
         "/uui-slicing/nsmf/resource/nssi/:nssiId/details":"/getSlicingNssiDetail",
         ///////<-------------CSMF slicing_business--------->/////
-        "/5gSlicing/services/status/:status/pageNo/:pageNo/pageSize/:pageSize": "/csmf_slicing_businessData",
+        "/5gSlicing/orders/status/:status/pageNo/:pageNo/pageSize/:pageSize": "/csmf_slicing_businessData",
+        "/POST/uui-slicing/csmf/5gSlicing": "/csmf_slicing_purchase",
         "/PUT/usecaseui/csmf/5gSlicing/service/:serviceId/activate": "/csmfActivate",
         "/DELETE/usecaseui/csmf/5gSlicing/service/:serviceId": "/csmfTerminate",
         "/5gSlicing/service/:serviceId/progress": "/csmfSlicingProgress",
index 6dc0081..63e6167 100644 (file)
@@ -20,7 +20,7 @@ const middlewares = jsonServer.defaults();
 const customersRouters = require('./routes');
 const baseUrl = "/usecaseui-server/v1";
 const nsmfBaseUrl = "/uui-slicing/nsmf"; 
-const csmfBaseUrl = "/usecaseui/csmf";
+const csmfBaseUrl = "/uui-slicing/csmf";
 
 // Set default middlewares (logger, static, cors and no-cache)
 server.use(middlewares);
index bf95a83..0647b76 100644 (file)
@@ -1,4 +1,4 @@
-import { Component, OnInit } from '@angular/core';
+import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
 import {COMMUNICATION_FORM_ITEMS} from "../../../../../../constants/constants";
 @Component({
   selector: 'app-business-order',
@@ -11,5 +11,14 @@ export class BusinessOrderComponent implements OnInit {
 
   ngOnInit() {
   }
+    @Input() showModel: boolean;
+    @Output() cancel = new EventEmitter<boolean>();
 
+    handleCancel() {
+        this.showModel = false;
+        this.cancel.emit(this.showModel)
+    }
+    handleOk() {
+        console.log(1)
+    }
 }
index c260de7..818fc13 100644 (file)
@@ -7,7 +7,7 @@
         <nz-option *ngFor="let item of statusOptions" [nzLabel]="item" [nzValue]="item"></nz-option>
       </nz-select>
     </div>
-    <button nz-button nzType="primary" class="buy-button">Purchase</button>
+    <button nz-button nzType="primary" class="buy-button" (click)="OrderModelShow()">Purchase</button>
   </div>
   <div class="slicing-resource-table-list">
     <nz-table #basicTable [nzData]="listOfData" [nzFrontPagination]="false" nzShowSizeChanger
@@ -18,6 +18,7 @@
         <th width=100>No</th>
         <th width=280>Service Instance Id</th>
         <th width=200>Service Instance Name</th>
+        <th width=200>Creation Time</th>
         <th width=110>Service Type</th>
         <th width=110>S-NSSAI</th>
         <th width=110>Status</th>
@@ -28,8 +29,9 @@
       <ng-template ngFor let-data [ngForOf]="basicTable.data" let-i="index">
         <tr>
           <td>{{i+1}}</td>
-          <td>{{ data.service_instance_id }}</td>
-          <td>{{ data.service_instance_name }}</td>
+          <td>{{ data.order_id }}</td>
+          <td>{{ data.order_name }}</td>
+          <td>{{ data.order_creation_time }}</td>
           <td>{{ data.service_type?data.service_type:'--' }}</td>
           <td>{{ data.service_snssai }}</td>
           <td>
                                     {{data.last_operation_progress+'%'}}
                                 </span>
                                 <br>
-                                {{data.orchestration_status}}
+                                {{data.order_status}}
                             </span>
             <br>
           </td>
           <td>
             <div class="action-icon">
-              <nz-switch [ngModel]="data.orchestration_status==='activated'?true:false"
+              <nz-switch [ngModel]="data.order_status==='activated'?true:false"
                          [nzDisabled]="data.last_operation_type && data.last_operation_progress && data.last_operation_progress !== '100'"
                          (ngModelChange)="switchChange(data,i)"></nz-switch>
               <nz-progress
@@ -53,7 +55,7 @@
               </nz-progress>
             </div>
             <div class="action-icon">
-              <i [ngClass]="{'cannotclick': data.last_operation_type && data.last_operation_progress && data.last_operation_progress !== '100' && (data.last_operation_type !== 'DELETE' || data.orchestration_status==='activated')}"
+              <i [ngClass]="{'cannotclick': data.last_operation_type && data.last_operation_progress && data.last_operation_progress !== '100' && (data.last_operation_type !== 'DELETE' || data.order_status==='activated')}"
                  nz-icon nzType="poweroff" nzTheme="outline" class="anticon anticon-poweroff"
                  (click)="terminate(data)"></i>
               <nz-progress
@@ -67,4 +69,5 @@
       </tbody>
     </nz-table>
   </div>
+  <app-business-order [showModel]="businessOrderShow" (cancel)="businessOrderShow=$event"></app-business-order>
 </div>
\ No newline at end of file
index fac4e0c..76f0bcd 100644 (file)
@@ -2,6 +2,7 @@ import {Component, OnInit} from '@angular/core';
 import {BUSINESS_STATUS} from "../../../../../constants/constants";
 import {SlicingTaskServices} from '.././../../../core/services/slicingTaskServices';
 import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import *as moment from 'moment';
 @Component({
     selector: 'app-csmf-slicing-business-management',
     templateUrl: './csmf-slicing-business-management.component.html',
@@ -33,36 +34,37 @@ export class CsmfSlicingBusinessManagementComponent implements OnInit {
     total: number = 0;
     loading = false;
     statusOptions: any[] = BUSINESS_STATUS;
-    isSelect: boolean = false;
+    // isSelect: boolean = false;
     progressingTimer: any[] = [];
     terminateStart: boolean = false;
-
+    businessOrderShow: boolean = false;
     getCSMFBusinessList() {
         this.loading = true;
-        this.isSelect = false;
+        // this.isSelect = false;
         this.listOfData = [];
         let paramsObj = {
             status: this.selectedValue,
             pageNo: this.pageIndex,
             pageSize: this.pageSize
         };
-        if (this.selectedValue !== BUSINESS_STATUS[0]) {
-            paramsObj["businessStatus"] = this.selectedValue;
-            this.isSelect = true;
-        }
-        this.myhttp.getSlicingBusinessList(paramsObj, this.isSelect).subscribe(res => {
-            const {result_header: {result_code}, result_body: {slicing_business_list, record_number}} = res;
+        // if (this.selectedValue !== BUSINESS_STATUS[0]) {
+        //     paramsObj["businessStatus"] = this.selectedValue;
+        //     this.isSelect = true;
+        // }
+        this.myhttp.getCSMFSlicingBusinessList(paramsObj).subscribe(res => {
+            const {result_header: {result_code}, result_body: {slicing_order_list, record_number}} = res;
             this.loading = false;
             if (+result_code === 200) {
                 this.total = record_number;
-                if (slicing_business_list !== null && slicing_business_list.length > 0) {
-                    this.listOfData = slicing_business_list.map((item, index) => {
+                if (slicing_order_list !== null && slicing_order_list.length > 0) {
+                    this.listOfData = slicing_order_list.map((item, index) => {
+                        item.order_creation_time =  moment(Number(item.order_creation_time)).format('YYYY-MM-DD');
                         if (item.last_operation_progress && item.last_operation_type && Number(item.last_operation_progress) < 100) {
                             let updata = (prodata: { operation_progress: string }) => {
                                 item.last_operation_progress = prodata.operation_progress || item.last_operation_progress;
                             };
                             let obj = {
-                                serviceId: item.service_instance_id
+                                serviceId: item.order_id
                             };
                             if (item.last_operation_type === 'DELETE') this.terminateStart = true;
                             this.queryProgress(obj, index, updata).then((res) => {
@@ -99,12 +101,12 @@ export class CsmfSlicingBusinessManagementComponent implements OnInit {
         console.log(slicing, i, "slicing");
         this.modalService.confirm({
             nzTitle: '<i>Are you sure you want to perform this task?</i>',
-            nzContent: '<b>Name:' + slicing.service_instance_name + '</b>',
+            nzContent: '<b>Name:' + slicing.order_name + '</b>',
             nzOnOk: () => {
                 let paramsObj = {
-                    serviceId: slicing.service_instance_id
+                    serviceId: slicing.order_id
                 };
-                if (slicing.orchestration_status === 'activated') {
+                if (slicing.order_status === 'activated') {
                     this.changeActivate(paramsObj, false, slicing, "deactivate", "deactivated", i)
                 } else {
                     this.changeActivate(paramsObj, true, slicing, "activate", "activated", i);
@@ -145,9 +147,9 @@ export class CsmfSlicingBusinessManagementComponent implements OnInit {
         console.log(slicing, "slicing");
         this.modalService.confirm({
             nzTitle: 'Are you sure you want to terminate this task?',
-            nzContent: '<b>Name:&nbsp;</b>' + slicing.service_instance_name,
+            nzContent: '<b>Name:&nbsp;</b>' + slicing.order_name,
             nzOnOk: () => {
-                let paramsObj = { serviceId: slicing.service_instance_id };
+                let paramsObj = { serviceId: slicing.order_id };
                 this.terminateStart = true;
                 this.loading = true;
                 this.myhttp.terminateSlicingService(paramsObj).subscribe(res => {
@@ -215,4 +217,8 @@ export class CsmfSlicingBusinessManagementComponent implements OnInit {
             requery();
         })
     }
+
+    OrderModelShow(){
+        this.businessOrderShow = true;
+    }
 }
index d5f6183..8973f18 100644 (file)
@@ -284,156 +284,161 @@ export const COMMUNICATION_FORM_ITEMS = [
     {\r
         title: 'Mobility',\r
         key: 'uEMobilityLevel',\r
+        options: [\r
+            {\r
+                title: 'Stationary',\r
+                key: 'stationary'\r
+            },\r
+            {\r
+                title: 'Nomadic',\r
+                key: 'nomadic'\r
+            },\r
+            {\r
+                title: 'Spatially Restricted Mobility',\r
+                key: 'spatially restricted mobility'\r
+            },\r
+            {\r
+                title: 'Fully Mobility',\r
+                key: 'fully mobility'\r
+            }\r
+        ]\r
     },\r
     {\r
         title: 'Use Interval (Month)',\r
         key: 'useInterval'\r
     },\r
     {\r
-        title: 'Max Number of UEs',\r
+        title: 'Area',\r
         key: 'coverageArea'\r
     }\r
 ]\r
 \r
-export const COMMUNICATION_FORM_ADDRESS = {\r
-    "result_header": {\r
-        "result_code": 200,\r
-        "result_message": "Successfully"\r
-    },\r
-\r
-    "result_body": {\r
-        "province": [\r
+export const COMMUNICATION_FORM_ADDRESS = [\r
+    {\r
+        "id": "1",\r
+        "name": "Beijing",\r
+        "city": [\r
             {\r
-                "id": "1",\r
-                "name": "北京",\r
-                "city": [\r
+                "id": "101",\r
+                "name": "Beijing",\r
+                "county": [\r
                     {\r
-                        "id": "101",\r
-                        "name": "北京市",\r
-                        "county": [\r
+                        "id": "1001",\r
+                        "name": "Haiding District",\r
+                        "street": [\r
+                            {\r
+                                "id": "100101",\r
+                                "name": "Wanshoulu Street"\r
+                            },\r
                             {\r
-                                "id": "1001",\r
-                                "name": "海淀区",\r
-                                "street": [\r
-                                    {\r
-                                        "id": "100101",\r
-                                        "name": "万寿路街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100102",\r
-                                        "name": "中关村街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100103",\r
-                                        "name": "海淀街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100104",\r
-                                        "name": "西三旗街道"\r
-                                    }\r
-                                ]\r
+                                "id": "100102",\r
+                                "name": "Zhongguancun Street"\r
                             },\r
                             {\r
-                                "id": "1002",\r
-                                "name": "西城区",\r
-                                "street": [\r
-                                    {\r
-                                        "id": "100201",\r
-                                        "name": "广安门内街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100202",\r
-                                        "name": "广安门外街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100203",\r
-                                        "name": "西长安街街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100204",\r
-                                        "name": "金融街街道"\r
-                                    }\r
-                                ]\r
+                                "id": "100103",\r
+                                "name": "Haidian Street"\r
                             },\r
                             {\r
-                                "id": "1003",\r
-                                "name": "昌平区",\r
-                                "street": [\r
-                                    {\r
-                                        "id": "100301",\r
-                                        "name": "城北街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100302",\r
-                                        "name": "城南街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100303",\r
-                                        "name": "天通苑北街道"\r
-                                    },\r
-                                    {\r
-                                        "id": "100304",\r
-                                        "name": "天通苑南街道"\r
-                                    }\r
-                                ]\r
+                                "id": "100104",\r
+                                "name": "Xisanqi Street"\r
                             }\r
                         ]\r
-                    }\r
-                ]\r
-            },\r
-            {\r
-                "id": "2",\r
-                "name": "上海",\r
-                "city": [{\r
-                    "id": "201",\r
-                    "name": "上海市",\r
-                    "county": [{\r
-                        "id": "2001",\r
-                        "name": "浦东新区",\r
+                    },\r
+                    {\r
+                        "id": "1002",\r
+                        "name": "Xicheng District",\r
+                        "street": [\r
+                            {\r
+                                "id": "100201",\r
+                                "name": "Guang'anmenwai Street"\r
+                            },\r
+                            {\r
+                                "id": "100202",\r
+                                "name": "Xuanwumen Street"\r
+                            },\r
+                            {\r
+                                "id": "100203",\r
+                                "name": "West Changan Street"\r
+                            },\r
+                            {\r
+                                "id": "100204",\r
+                                "name": "Financial Street"\r
+                            }\r
+                        ]\r
+                    },\r
+                    {\r
+                        "id": "1003",\r
+                        "name": "Changping District",\r
                         "street": [\r
                             {\r
-                                "id": "200101",\r
-                                "name": "陆家嘴街道"\r
+                                "id": "100301",\r
+                                "name": "Chengbei Street"\r
                             },\r
                             {\r
-                                "id": "200102",\r
-                                "name": "周家渡街道"\r
+                                "id": "100302",\r
+                                "name": "Chengnan Street"\r
                             },\r
                             {\r
-                                "id": "200103",\r
-                                "name": "塘桥街道"\r
+                                "id": "100303",\r
+                                "name": "Tiantongyuan North Street"\r
                             },\r
                             {\r
-                                "id": "200104",\r
-                                "name": "南码头路街道"\r
+                                "id": "100304",\r
+                                "name": "Tiantongyuan South Street"\r
                             }\r
                         ]\r
+                    }\r
+                ]\r
+            }\r
+        ]\r
+    },\r
+    {\r
+        "id": "2",\r
+        "name": "Shanghai",\r
+        "city": [{\r
+            "id": "201",\r
+            "name": "Shanghai City",\r
+            "county": [{\r
+                "id": "2001",\r
+                "name": "udongxin District",\r
+                "street": [\r
+                    {\r
+                        "id": "200101",\r
+                        "name": "Lujiazui Street"\r
+                    },\r
+                    {\r
+                        "id": "200102",\r
+                        "name": "Zhoujiadu Street"\r
                     },\r
+                    {\r
+                        "id": "200103",\r
+                        "name": "Tangqiao Street"\r
+                    },\r
+                    {\r
+                        "id": "200104",\r
+                        "name": "Nanquanlu Street"\r
+                    }\r
+                ]\r
+            },\r
+                {\r
+                    "id": "2002",\r
+                    "name": "Jingan District",\r
+                    "street": [\r
+                        {\r
+                            "id": "200201",\r
+                            "name": "Jiangning Lu Street"\r
+                        },\r
                         {\r
-                            "id": "2002",\r
-                            "name": "静安区",\r
-                            "street": [\r
-                                {\r
-                                    "id": "200201",\r
-                                    "name": "江宁路街道"\r
-                                },\r
-                                {\r
-                                    "id": "200202",\r
-                                    "name": "静安寺街道"\r
-                                },\r
-                                {\r
-                                    "id": "200203",\r
-                                    "name": "南京西路街道"\r
-                                },\r
-                                {\r
-                                    "id": "200204",\r
-                                    "name": "曹家渡街道"\r
-                                }\r
-                            ]\r
+                            "id": "200202",\r
+                            "name": "Jing'an Temple Street"\r
+                        },\r
+                        {\r
+                            "id": "200203",\r
+                            "name": "Nanjing West Road Street"\r
                         }\r
                     ]\r
-                }]\r
-            }\r
-        ]\r
+                }\r
+            ]\r
+        }]\r
     }\r
-}
\ No newline at end of file
+]
\ No newline at end of file