AngularJS中ui-router全攻略

来源:http://www.cnblogs.com/darrenji/archive/2016/01/29/5167999.html
-Advertisement-
Play Games

首先是angular-ui-router的基本用法。■ 如何引用依賴angular-ui-router angular.module('app',["ui.router"]) .config(function($stateProvider){ $stateProvider.state(stateNa


 

首先是angular-ui-router的基本用法。

■ 如何引用依賴angular-ui-router

 

angular.module('app',["ui.router"])
    .config(function($stateProvider){
        $stateProvider.state(stateName, stateCofig);
    })

 

■ $stateProvider.state(stateName, stateConfig)

stateName是string類型
stateConfig是object類型

//statConfig可以為空對象
$stateProvider.state("home",{});

//state可以有子父級
$stateProvider.state("home",{});
$stateProvider.state("home.child",{})

//state可以是鏈式的
$stateProvider.state("home",{}).state("about",{}).state("photos",{});

stateConfig包含的欄位:template, templateUrl, templateProvider, controller, controllerProvider, resolve, url, params, views, abstract, onEnter, onExit, reloadOnSearch, data

■ $urlRouteProvider

$urlRouteProvider.when(whenPath, toPath)
$urlRouterProvider.otherwise(path)
$urlRouteProvider.rule(handler)

■ $state.go

$state.go(to, [,toParams],[,options])
形參to是string類型,必須,使用"^"或"."表示相對路徑;
形參toParams可空,類型是對象;
形參options可空,類型是對象,欄位包括:location為bool類型預設true,inherit為bool類型預設true, relative為對象預設$state.$current,notify為bool類型預設為true, reload為bool類型預設為false

$state.go('photos.detail')
$state.go('^')到上一級,比如從photo.detail到photo
$state.go('^.list')到相鄰state,比如從photo.detail到photo.list
$state.go('^.detail.comment')到孫子級state,比如從photo.detail到photo.detial.comment

■ ui-sref

ui-sref='stateName'
ui-sref='stateName({param:value, param:value})'

■ ui-view

==沒有名稱的ui-view

 

<div ui-view></div>

$stateProvider.state("home",{
    template: "<h1>hi</h1>"
})

 

或者這樣配置:

 

$stateProvider.state("home"{
    views: {
        "": {
            template: "<h1>hi</h1>"
        }
    }
})

 

==有名稱的ui-view

 

<div ui-view="main"></div>

$stateProvider.state("home",{
    views: {
        "main" : {
            template: "<h1>hi</h1>"
        }
    }
})

 

==多個ui-view

 

<div ui-view></div>
<div ui-view="data"></div>

$stateProvider.state("home",{
    views: {
        "":{template: "<h1>hi</h1>"},
        "data": {template: "<div>data</div>"}
    }
})

 


■ 項目文件結構

node_modules/
partials/
.....about.html
.....home.html
.....photos.html
app.js
index.html

■ 創建state和view

app.js

var photoGallery = angular.module('photoGallery',["ui.router"]);

photoGallery.config(function($stateProvider, $urlRouterProvider){
    $urlRouterProvider.otherwise('/home');

    $stateProvider
        .state('home',{
            url: '/home',
            templateUrl: 'partials/home.html'
        })
        .state('photos',{
            url: '/photos',
            templateUrl: 'partials/photos.html'
        })
        .state('about',{
            url: '/about',
            templateUrl: 'partials/about.html'
        })
})

 

index.html

<!DOCTYPE html>
<html lang="en" ng-app="photoGallery">
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.css"/>
</head>
<body>

  <h1>Welcome</h1>
  <div ui-view></div>

<script src="node_modules/jquery/dist/jquery.js"></script>

<script src="node_modules/angular/angular.js"></script>
<script src="node_modules/angular-ui-router/release/angular-ui-router.js"></script>
<script src="node_modules/angular-animate/angular-animate.js"></script>

<script src="node_modules/bootstrap/dist/js/bootstrap.js"></script>
<script src="node_modules/angular-bootstrap/ui-bootstrap-tpls.js"></script>

<script src="app.js"></script>
</body>
</html>

 

■ state之間的跳轉

 

index.html

<nav class="navbar navbar-inverse">
<div class="container-fluid">
  <div class="navbar-header">
    <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    <a ui-sref="home" class="navbar-brand">Home</a>
  </div>
  <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
    <ul class="nav navbar-nav">
      <li>
        <a ui-sref="photos">Photos</a>
      </li>
      <li>
        <a ui-sref="about">About</a>
      </li>
    </ul>
  </div>
</div>
</nav>

<div ui-view></div>

 

以上通過ui-sref屬性完成state之間的跳轉。

■ 多個view以及state嵌套

有時候,一個頁面上可能有多個ui-view,比如:

<div ui-view="header"></div>
<div ui-view="body"></div>

假設,以上頁面屬於一個名稱為parent的state中。

我們知道在ui-router中,一個state大致是這樣設置的:

.state('content.photos',{
    url: 'photos',
    views:{
        "body@content":{templateUrl: 'partials/photos.html'}
    }
})

 

所有state下views下的所有鍵值對(類似 "body@content":{templateUrl: 'partials/photos.html'})都被放到一個鍵值集合中。而ui-view的工作原理就是根據自己的屬性值,到這個鍵值集合中去找匹配的鍵,找到就把對應的頁面顯示出來。


點擊header對應的頁面鏈接,可能會跳轉到另外的子頁面出現在<div ui-view="body"></div>這個位置。這時候頁面出現了子父關係,而每個頁面都屬於某個state,這樣state間就出現了子父關係。這些跳轉的子頁面,在路由設置中,可能被稱為parent.son1, parent.son2...這就是state的嵌套。

在現有的文件結構上增加content.html, header.html,文件結構變為:


node_modules/
partials/
.....about.html
.....home.html
.....photos.html
.....content.html
.....header.html
app.js
index.html

content.html 包含了多各ui-view, 一個ui-view和頁頭相關,保持不變;令一個ui-view和會根據頁頭上的點擊呈現不同的內容


<div ui-view="header"></div>
<div ui-view="body"></div>


header.html 把原先indext.html中nav部分放到這裡來

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a ui-sref="content.home" class="navbar-brand">Home</a>
    </div>
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li>
          <a ui-sref="content.photos">Photos</a>
        </li>
        <li>
          <a ui-sref="content.about">About</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

 

index.html 這時變成了這樣

<div ui-view></div>

app.js 路由現在這樣設置

 

var photoGallery = angular.module('photoGallery',["ui.router"]);

photoGallery.config(function($stateProvider, $urlRouterProvider){
    $urlRouterProvider.otherwise('home');

    $stateProvider
        .state('content',{
            url: '/',
            views:{
                "":{templateUrl: 'partials/content.html'},
                "header@content":{templateUrl: 'partials/header.html'},
            }
        })
        .state('content.home',{
            url: 'home',
            views:{
                "body@content":{templateUrl: 'partials/home.html'}
            }
        })
        .state('content.photos',{
            url: 'photos',
            views:{
                "body@content":{templateUrl: 'partials/photos.html'}
            }
        })
        .state('content.about',{
            url:'about',
            views:{
                "body@content":{templateUrl: 'partials/about.html'}
            }
        })
})

 

這時候,頁面是這樣呈現出來的:

→ 來到home這個路由

 

.state('content.home',{
    url: 'home',
    views:{
        "body@content":{templateUrl: 'partials/home.html'}
    }
})

 

以上,告訴我們partials/home.html將會被載入到與"body@content"匹配的ui-view中。暫時對應的ui-view還沒有出現,於是等待。

→ 路由看到index.html上的<div ui-view></div>

 

.state('content',{
    url: '/',
    views:{
        "":{templateUrl: 'partials/content.html'},
        "header@content":{templateUrl: 'partials/header.html'},
    }
})

 

於是,就找到了content這個state下views下的 "":{templateUrl: 'partials/content.html'}這個鍵值對,把partials/content.html顯示出來。

→ 分別載入partials/content.html頁面上的各個部分

看到<div ui-view="header"></div>,就載入如下:

"header@content":{templateUrl: 'partials/header.html'},


看到<div ui-view="body"></div>,先載入 "body@content":{templateUrl: 'partials/home.html'}


→ 點擊header上的鏈接

點擊<a ui-sref="content.photos">Photos</a>,來到:

.state('content.photos',{
    url: 'photos',
    views:{
        "body@content":{templateUrl: 'partials/photos.html'}
    }
})

 

把partials/photos.html顯示到<div ui-view="body"></div>中去。


點擊<div ui-view="body"></div>,來到:

.state('content.about',{
    url:'about',
    views:{
        "body@content":{templateUrl: 'partials/about.html'}
    }
})

 

把partials/about.html顯示到<div ui-view="body"></div>中去。


■ state多級嵌套

以上,在路由設置中,state名稱有content, content.photos有了這樣的一層嵌套。接下來,要實現state的多級嵌套。

在photos.html頁面準備載入一個子頁面,叫做photos-list.html;
與photo-list.html頁面相鄰的還有一個頁面,叫做photo-detail.html;
在photo-detail.html頁面上載入一個子頁面,叫做photos-detail-comment.html;

這樣,頁面有了嵌套關係,state也相應的會有嵌套關係。

現在,文件結構變成:

node_modules/
partials/
.....about.html
.....home.html
.....photos.html
.....content.html
.....header.html
.....photos-list.html
.....photo-detail.html
.....photos-detail-comment.html
app.js
index.html

photos.html 加一個容納子頁面的ui-view

photos
<div ui-view></div>

如何到達這個子頁面呢?修改header中的相關部分如下:

 

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a ui-sref="content.home" class="navbar-brand">Home</a>
    </div>
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li>
          <a ui-sref="content.photos.list">Photos</a>
        </li>
        <li>
          <a ui-sref="content.about">About</a>
        </li>
      </ul>
    </div>
  </div>

 

以上,通過<a ui-sref="content.photos.list">Photos</a>來到photos.html的子頁面photos-list.html.

photos-list.html 通過2種途徑到相鄰頁photo-detail.html

<h1>photos-list</h1>
<ul>
  <li><a ui-sref="^.detail">我通過相對路徑到相鄰的state</a></li>
  <li><a ui-sref="content.photos.detail">我通過絕對路徑到相鄰的state</a></li>
</ul>

 

photo-detail.html 又提供了來到其子頁面photos-detail-comment.html的ui-view

<h1>photo-details</h1>
<a class="btn btn-default" ui-sref=".comment">通過相對路徑去子state</a>
<div ui-view></div>

 

photos-detail-comment.html 則很簡單:
<h1>photos-detail-comment</h1>

app.js state多級嵌套的設置為

var photoGallery = angular.module('photoGallery',["ui.router"]);

photoGallery.config(function($stateProvider, $urlRouterProvider){
    $urlRouterProvider.otherwise('home');

    $stateProvider
        .state('content',{
            url: '/',
            views:{
                "":{templateUrl: 'partials/content.html'},
                "header@content":{templateUrl: 'partials/header.html'},
            }
        })
        .state('content.home',{
            url: 'home',
            views:{
                "body@content":{templateUrl: 'partials/home.html'}
            }
        })
        .state('content.photos',{
            url: 'photos',
            views:{
                "body@content":{templateUrl: 'partials/photos.html'}
            }
        })
        .state('content.photos.list',{
            url: '/list',
            templateUrl: 'partials/photos-list.html'
        })
        .state('content.photos.detail',{
            url: '/detail',
            templateUrl: 'partials/photos-detail.html'
        })
        .state('content.photos.detail.comment',{
            url: '/comment',
            templateUrl: 'partials/photos-detail-comment.html'
        })
        .state('content.about',{
            url:'about',
            views:{
                "body@content":{templateUrl: 'partials/about.html'}
            }
        })
})

 

■ 抽象state

如果一個state,沒有通過鏈接找到它,那就可以把這個state設置為abstract:true,我們把以上的content和content.photos這2個state設置為抽象。

 

.state('content',{
    url: '/',
    abstract: true,
    views:{
        "":{templateUrl: 'partials/content.html'},
        "header@content":{templateUrl: 'partials/header.html'},
    }
})
...


.state('content.photos',{
    url: 'photos',
    abstract: true,
    views:{
        "body@content":{templateUrl: 'partials/photos.html'}
    }
})

 

那麼,當一個state設置為抽象,如果通過ui-sref或路由導航到該state會出現什麼結果呢?

--會導航到預設路由上

$urlRouterProvider.otherwise('home');

 

.state('content.home',{
    url: 'home',
    views:{
        "body@content":{templateUrl: 'partials/home.html'}
    }
})

 

最終把partials/home.html顯示出來。

 

■ 使用控制器

在實際項目中,數據大多從controller中來。

首先在路由中設置state所用到的控制器以及控制器別名。

 

var photoGallery = angular.module('photoGallery',["ui.router"]);

photoGallery.config(function($stateProvider, $urlRouterProvider){
    $urlRouterProvider.otherwise('home');

    $stateProvider
        .state('content',{
            url: '/',
            abstract: true,
            views:{
                "":{templateUrl: 'partials/content.html'},
                "header@content":{templateUrl: 'partials/header.html'},
            }
        })
        .state('content.home',{
            url: 'home',
            views:{
                "body@content":{
                    templateUrl: 'partials/home.html',
                    controller: 'HomeController',
                    controllerAs: 'ctrHome'
                }
            }
        })
        .state('content.photos',{
            url: 'photos',
            abstract: true,
            views:{
                "body@content":{
                    templateUrl: 'partials/photos.html',
                    controller: 'PhotoController',
                    controllerAs: 'ctrPhoto'
                }
            }
        })
        .state('content.photos.list',{
            url: '/list',
            templateUrl: 'partials/photos-list.html',
            controller: "PhotoListController",
            controllerAs: 'ctrPhotoList'
        })
        .state('content.photos.detail',{
            url: '/detail',
            templateUrl: 'partials/photos-detail.html',
            controller: 'PhotoDetailController',
            controllerAs: 'ctrPhotoDetail'
        })
        .state('content.photos.detail.comment',{
            url: '/comment',
            templateUrl: 'partials/photos-detail-comment.html'
        })
        .state('content.about',{
            url:'about',
            views:{
                "body@content":{templateUrl: 'partials/about.html'}
            }
        })
})

 

添加controller.js,該文件用來定義所用到的controller.現在的文件結構為:


asserts/
.....css/
.....images/
..........image1.jpg
..........image2.jpg
..........image3.jpg
..........image4.jpg
node_modules/
partials/
.....about.html
.....home.html
.....photos.html
.....content.html
.....header.html
.....photos-list.html
.....photo-detail.html
.....photos-detail-comment.html
app.js
index.html

controllers.js

photoGallery.controller('HomeController',['$scope', '$state', function($scope, $state){
    this.message = 'Welcome to the Photo Gallery';
}]);

//別名:ctrPhoto
photoGallery.controller('PhotoController',['$scope','$state', function($scope, $state){
    this.photos = [
        { id: 0, title: 'Photo 1', description: 'description for photo 1', imageName: 'image1.jpg', comments:[
            {name: 'user1', comment: 'Nice'},
            { name:'User2', comment:'Very good'}
        ]},
        { id: 1, title: 'Photo 2', description: 'description for photo 2', imageName: 'image2.jpg', comments:[
            { name: 'user2', comment: 'Nice'},
            { name:'User1', comment:'Very good'}
        ]},
        { id: 2, title: 'Photo 3', description: 'description for photo 3', imageName: 'image3.jpg', comments:[
            {name: 'user1', comment: 'Nice'}
        ]},
        { id: 3, title: 'Photo 4', description: 'description for photo 4', imageName: 'image4.jpg', comments:[
            {name: 'user1', comment: 'Nice'},
            { name:'User2', comment:'Very good'},
            { name:'User3', comment:'So so'}
        ]}
    ];

    //給子state下controller中的photos賦值
    this.pullData = function(){
        $scope.$$childTail.ctrPhotoList.photos = this.photos;
    }
}]);

//別名:ctrPhotoList
photoGallery.controller('PhotoListController',['$scope','$state', function($scope, $state){
    this.reading = false;
    this.photos = new Array();

    this.init = function(){
        this.reading = true;
        setTimeout(function(){
            $scope.$apply(function(){
                $scope.ctrPhotoList.getData();
            });
        }, 1500);
    }

    this.getData = function(){

        //調用父state中controller中的方法
        $scope.$parent.ctrPhoto.pullData();

        /*this.photos = $scope.$parent.ctrPhoto.photos;*/
        this.reading = false;

    }
}]);


//別名:ctrPhotoDetail
photoGallery.controller('PhotoDetailController',['$scope', '$state', function($scope,$state){

}]);

 

以上,通過$scope.$$childTail.ctrPhotoList在父state中的controller中拿到子state中的controller;通過$scope.$parent.ctrPhoto在子state中的controller中拿到父state中的controller。

 

photos-list.html

<h1>photos-list</h1>
<div ng-init="ctrPhotoList.init()">
  <div style="margin:auto; width: 40px;" ng-if="ctrPhotoList.reading">
    <i class="fa fa-spinner fa-5x fa-pulse"></i>
  </div>

  <div class="well well-sm" ng-repeat="photo in ctrPhotoList.photos">
    <div class="media">
      <div class="media-left" style="width:15%;">
        <a ui-sref="content.photos.detail">
          <img class="img-responsive img-rounded" src="../asserts/images/{{photo.imageName}}" alt="">
        </a>
      </div>
      <div class="media-body">
        <h4 class="media-heading">{{photo.title}}</h4>
        {{photo.description}}
      </div>
    </div>
  </div>
</div>

 


■ state間如何傳路由參數

在content.photos.detail這個state設置接收一個路由參數。

 

.state('content.photos.detail',{
    url: '/detail/:id',
    templateUrl: 'partials/photos-detail.html',
    controller: 'PhotoDetailController',
    controllerAs: 'ctrPhotoDetail'
})

 

photos-list.html 送出一個路由參數

<h1>photos-list</h1>
<div ng-init="ctrPhotoList.init()">
  <div style="margin:auto; width: 40px;" ng-if="ctrPhotoList.reading">
    <i class="fa fa-spinner fa-5x fa-pulse"></i>
  </div>

  <div class="well well-sm" ng-repeat="photo in ctrPhotoList.photos">
    <div class="media">
      <div class="media-left" style="width:15%;">
        <a ui-sref="content.photos.detail({id:photo.id})">
          <img class="img-responsive img-rounded" src="../asserts/images/{{photo.imageName}}" alt="">
        </a>
      </div>
      <div class="media-body">
        <h4 class="media-heading">{{photo.title}}</h4>
        {{photo.description}}
      </div>
    </div>
  </div>
</div>

以上,通過<a ui-sref="content.photos.detail({id:photo.id})">把路由參數送出。



controller.js PhotoDetailController控制器通過$stateParams獲取路由參數

...
//別名:ctrPhotoDetail
photosGallery.controller('PhotoDetailController', ['$scope', '$state', '$stateParams',
    function($scope, $state, $stateParams){

        var id = null;
        this.photo = null;
        this.init = function(){
            id = parseInt($stateParams.id);
            this.photo = $scope.ctrPhoto.photos[id];
        }

    }
]);

 

photos-detail.html 從以上的PhotoDetailController中獲取數據。

<h1>photo-details</h1>
<a class="btn btn-default" ui-sref=".comment">通過相對路徑去子state</a>
<a ui-sref="content.photos.list" style="margin-left: 15px;">
  <i class="fa fa-arrow-circle-left fa-2x"></i>
</a>

<div ng-init="ctrPhotoDetail.init()">
  <img class="img-responsive img-rounded" ng-src="../assets/images/{{ctrPhotoDetail.photo.imageName}}"
       style="margin:auto; width: 60%;">
  <div class="well well-sm" style="margin:auto; width: 60%; margin-top: 15px;">
    <h4>{{ctrPhotoDetail.photo.title}}</h4>
    <p>{{ctrPhotoDetail.photo.description}}</p>
  </div>

  <div style="margin:auto; width: 80%; margin-bottom: 15px;">
    <button style="margin-top: 10px; width:100%;"
            class="btn btn-default" ui-sref=".comment">Comments</button>
  </div>
</div>


<div ui-view></

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是生成器模式 對複雜對象的創建過程進行抽象,相同的創建步驟,不一樣的創建過程實現,生成不同表示的對象; 例如創建一臺電腦,對其應用生成器模式進行創建: 創建過程是指創建cpu、創建記憶體、創建顯示器三個步驟,所有品牌電腦的創建過程都是一樣的,可以對其抽象出一個抽象建造者角色Builder; 不
  • 這裡說的緩存只是為了提供一些動態的界面沒辦法作靜態化的界面來減少資料庫的訪問壓力,如果能夠做靜態化的話的還是採用nginx來做界面的靜態化,這樣可以承受高併發的訪問能力。 好了,廢話少說直接看實現代碼吧下載地址, 實現機制主要是通過過濾器攔截方案,有兩個地方要註意的 1,Servlet過慮器中使用S
  • RFC一致性 Methods GET: 獲取某個資源,冪等且無副作用。 POST: 創建一個新的資源。 PUT: 替換某個已有的資源。冪等有副作用。 PATCH: 修改某個已有的資源。 DELETE:刪除某個資源。冪等有副作用。 Headers Accept:伺服器需要返回什麼樣的content。
  • 我在監理別的項目時,經常提出這樣的要求,所有的列表都要有排序機制。最近又看到一個數據倉庫項目中所有的維度表都沒有排序欄位。結果報表上所有維度都是按Caption屬性的字母排序。很多維度在用戶那裡都是有業務排序需求的,然而我提出這個問題後,設計者居然說這個不重要,不說了(他們就這水平了)和我沒有關係的
  • 本文講解一種常見的CSV文件標準,設定文件中的行分隔符,列分隔符,如何處理值中的單引號,雙引號,逗號,換行符等。
  • 第1步:分析問題 我這邊的處理方式是根據傳入的數據條數,和需要顯示的頁碼數,自動生成頁碼。舉個例子,如果傳入的參數為{pageSize:10,totalRow:200} 那麼就一共有20頁。 首次生成的頁碼樣式截圖: 第2步:點擊操作 點擊 2 或者下一頁按鈕的樣式截圖: 第3步:生成新頁面 這裡可
  • 當完成一項前端的工作之後,許多人都會忘記該項目的結構與細節。然而代碼並不是馬上就能完全定型,在餘下的時間里還有不斷的維護工作,而這些工作也許不會是你自己完成。所以,結構優良的代碼能很大程度上優化它的可維護性。下麵列出五種提高CSS文件可維護性的方法,也就是一種較好的CSS樣式指南。1.分解你的樣式對
  • http://120.24.90.140:2368/emberru-men-zhi-nan-jiao-cheng-mu-lu/
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...