主頁 > 軟體設計 > Spring Boot開發之使用JustAuth組件實作第三方登錄(QQ、微博等)

Spring Boot開發之使用JustAuth組件實作第三方登錄(QQ、微博等)

2021-04-02 11:24:24 軟體設計

在我們的專案開發中,使用第三方登錄(如QQ登錄、微信登錄等)可以更加方便、輕松地實作用戶登錄,

在以往的開發程序中,如果要使專案實作第三方登錄功能,一般程序是閱讀官網的開發檔案,并下載其JDK(或者依賴pom),然后進行開發實作,

但是,如果網站要實作多個第三方平臺的登錄功能,則需要很高的學習成本

所以,就有開發者實作了一款基于Spring Boot的開箱即用的整合第三方登錄的開源組件:JustAuth

該插件的網址:https://justauth.wiki

本文將基于Spring Boot,使用JustAuth組件實作第三方快捷登錄,并獲取用戶的uid,

1. 插件簡介

首先給出幾個鏈接:

  • 組件的幫助檔案:https://justauth.wiki
  • 組件的GitHub:https://github.com/justauth/JustAuth
  • 組件的Gitee組織:https://gitee.com/justauth/

在組件的各個網址,都可以看到關于該組件的自述:

小而全而美的第三方登錄開源組件,目前已支持Github、Gitee、微博、釘釘、百度、Coding、騰訊云開發者平臺、OSChina、支付寶、QQ、微信、淘寶、Google、Facebook、抖音、領英、小米、微軟、今日頭條、Teambition、StackOverflow、Pinterest、人人、華為、企業微信、酷家樂、Gitlab、美團、餓了么和推特等第三方平臺的授權登錄, Login, so easy!

可以看出,此組件支持的第三方登錄平臺,是非常全的,

下面,以QQ微博為例,測驗Spring Boot上使用該組件完成第三方登錄快速開發,

  • 建議參考組件的幫助檔案,均有詳細說明,
  • 或者直接參考官方的demo:https://github.com/justauth/JustAuth-demo
  • 開發之前,需要前往QQ開放平臺微博開放平臺申請應用,并獲取 appidAPP secret ,設定callback url,參考:
    • https://blog.csdn.net/cxh_1231/article/details/114984731
    • https://blog.csdn.net/cxh_1231/article/details/115068413

2. 專案創建與導包

關于Spring Boot專案如何創建,可參考以下幾篇文章:

  • Idea創建Spring Boot專案
  • Spring Boot 常用配置
  • Spring Boot整合Thymeleaf

只看前兩個就可以了,

創建完成專案之后,在pom.xml檔案中,匯入依賴:

        <!--JustAuth-->
        <dependency>
            <groupId>me.zhyd.oauth</groupId>
            <artifactId>JustAuth</artifactId>
            <version>1.15.9</version>
        </dependency>
        <!--http請求相關-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-http</artifactId>
            <version>5.3.9</version>
        </dependency>
        <!--匯入lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

這里匯入了4個依賴,說明如下:

第一個是JustAuth組件必須的,版本就默認使用幫助檔案中的最新版,如下圖所示,

image-20210324110815800

第二個是http請求的實作組件,這是因為JustAuth從 v1.14.0開始不會默認集成hutool-http,需要單獨添加;

第三個是lombok,即自動生成模型的setget,因為專案中授權登錄成功后,回傳的用戶資訊模型,使用了@Getter@Setter注解,添加此組件,方便獲取用戶的單個資訊(如uuid、nickname等),

image-20210324145321900

第四個是阿里巴巴的fastjson 組件,因為在回傳的結果中,有些資訊是封裝成 JSON格式 的,需要使用該組件來轉換成 map鍵值對 ,從而獲取對我們有用的資訊,

image-20210324145458266

3. QQ登錄實作

1、 新建一個名為 PluginController 的控制類,用來實作第三方插件的登錄回呼功能,

package com.demo.controller;

import org.springframework.web.bind.annotation.*;

/**
 * Info:登錄組件測驗
 *
 * @author: 拾年之璐
 * @date: 2021-03-15 0015 19:27
 */
@RestController
@RequestMapping(value = "/plugin")
public class PluginController {
    
}

2、創建一個AuthRequest介面的實作類,用于生成登錄鏈接登錄并獲取用戶資訊

    /**
     * 授權介面類
     *
     * @return 各種請求的結果
     */
    private AuthRequest getQQAuthRequest() {
        return new AuthQqRequest(AuthConfig.builder()
                .clientId("APPID")
                .clientSecret("Your APP Secret")
                .redirectUri("http://XXX.com/plugin/qqlogin/callback")
                .unionId(true) //如果獲取用戶的UnionID,則設定為true
                .build());
    }

3、生成登錄鏈接跳轉至登錄頁面

    /**
     * 跳轉至登錄頁面
     *
     * @param response 頁面跳轉
     * @throws IOException
     */
    @RequestMapping("/qqlogin")
    public void qqlogin(HttpServletResponse response) throws IOException {
        //獲取物件
        AuthRequest authRequest = getQQAuthRequest();
        //列印生成的鏈接
        System.out.println("生成登錄鏈接:" + authRequest.authorize("yourState"));
        //頁面跳轉,其中state引數可自定義
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

這時,控制臺可以列印出生成的登錄URL

image-20210324145749836

瀏覽器訪問http://XXX.com/plugin/qqlogin,即可跳轉至此登錄頁面

image-20210324145949261

4、回呼頁面plugin/qqlogin/callback獲取回傳的code,并通過回傳的code獲取當前登錄用戶的資訊

如下:

   /**
     * QQ登錄成功后回傳到此頁
     *
     * @param callback 登錄用戶的資訊
     * @return
     */
    @RequestMapping("/qqlogin/callback")
    public Object qqloginCallback(AuthCallback callback) {
        AuthRequest authRequest = getQQAuthRequest();
        // 列印回傳的授權資訊(QQ登錄為code,通過code獲取用戶資訊)
        System.out.println(callback.getCode());

        //根據回傳的引數,執行登錄請求(獲取用戶資訊)
        AuthResponse<AuthUser> authResponse = authRequest.login(callback);

        // 將JSON包回傳到前端頁面顯示
        return authResponse;
    }

上面的圖,點擊登錄后,即可跳轉至回呼頁面,顯示出所有的JSON資料,如下圖所示:

image-20210324150515950

我們對該JSON資料進行分析:

  • 回傳的code是2000,表示獲取資料成功(其他代碼,可以在https://justauth.wiki/quickstart/error_code.html查看);
  • 回傳的data資料,包含所有有用的資訊,如用戶IDuuid、用戶昵稱username、頭像avatar、性別gender等等;
  • data下的token,包含所有的獲取token重繪token過期時間等資訊;
  • data下rawUserInfo,是第三方平臺回傳的原始用戶資訊
  • 關于回傳的JSON資料的每個子段的詳細含義,都可以在模型AuthUser中查看,

5、后臺獲取指定資訊

上面可以獲取所有的用戶資訊,但這些資訊,我們并不能這樣使用,而是篩選有用的資訊,然后保存到自己的資料庫,

所以下面這個完整示例,演示如何獲取上述JSON中的指定資訊,

  /**
     * QQ登錄成功后回傳到此頁
     *
     * @param callback 登錄用戶的資訊
     * @return
     */
    @RequestMapping("/qqlogin/callback")
    public Object qqloginCallback(AuthCallback callback) {
        //獲取實體
        AuthRequest authRequest = getQQAuthRequest();
        // 列印回傳的授權資訊(QQ登錄為code,通過code獲取用戶資訊)
        System.out.println(callback.getCode());
        //根據回傳的引數,執行登錄請求(獲取用戶資訊)
        AuthResponse<AuthUser> authResponse = authRequest.login(callback);

        //列印授權回傳代碼(2000 表示成功,可以用來判斷用戶登錄成功與否)
        System.out.println("狀態碼:"+authResponse.getCode());

        //列印用戶的昵稱、ID、頭像等基本資訊
        System.out.println("用戶的UnionID:" + authResponse.getData().getUuid());
        System.out.println("用戶的昵稱:" + authResponse.getData().getNickname());
        System.out.println("用戶的頭像:" + authResponse.getData().getAvatar());

        //列印用戶的Token中的資訊
        System.out.println("access_token:" + authResponse.getData().getToken().getAccessToken());
        System.out.println("用戶的OpenId:" + authResponse.getData().getToken().getOpenId());

        // 列印更加詳細的資訊(第三方平臺回傳的原始用戶資訊)
        //getInnerMap():將JSONObject轉換成Map鍵值對
        System.out.println("用戶的城市:" + authResponse.getData().getRawUserInfo().getInnerMap().get("city"));
        System.out.println("用戶的年份:" + authResponse.getData().getRawUserInfo().getInnerMap().get("year"));

        // 將JSON包回傳到前端頁面顯示
        return authResponse;
    }

其實這段代碼,和JSON資料,是一一對應的,如下圖所示:

image-20210324152254531

列印結果:

image-20210324152337935

4. 微博登錄實作

有了上面QQ登錄的詳細分析,微博登錄也是類似的,這里速戰速決,

1、創建授權請求類

    /**
     * 生成微博授權登錄的類getWbAuthRequest
     *
     * @return
     */
    private AuthRequest getWbAuthRequest() {
        return new AuthWeiboRequest(AuthConfig.builder()
                .clientId("appid")
                .clientSecret("app secret")
                .redirectUri("http://xxx.com/plugin/sinalogin/callback")
                .build());
    }

2、生成并跳轉登錄鏈接

   /**
     * 微博登錄頁面,生成登錄鏈接
     *
     * @param response 頁面跳轉
     * @throws IOException
     */
    @RequestMapping("/wblogin")
    public void wblogin(HttpServletResponse response) throws IOException {
        //生成物件
        AuthRequest authRequest = getWbAuthRequest();
        //生成鏈接并回傳,其中state可以自定義,可以用來實作第四方登錄
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

結果:

image-20210324153313077

3、回呼頁面獲取資訊,以及回傳JSON資料

    /**
     * 回呼頁面,獲取登錄用戶新
     *
     * @param callback 詳細JSON資訊
     * @return
     */
    @RequestMapping("/sinalogin/callback")
    public Object wbloginCallback(AuthCallback callback) {
        //生成物件
        AuthRequest authRequest = getWbAuthRequest();
        //獲取登錄后回傳的用戶資訊結果
        AuthResponse<AuthUser> authResponse = authRequest.login(callback);

        //列印授權回傳代碼(2000 表示成功,可以用來判斷用戶登錄成功與否)
        System.out.println("狀態碼:" + authResponse.getCode());

        //列印用戶的昵稱、ID、頭像等基本資訊
        System.out.println("用戶的UnionID:" + authResponse.getData().getUuid());
        System.out.println("用戶的昵稱:" + authResponse.getData().getNickname());
        System.out.println("用戶的頭像:" + authResponse.getData().getAvatar());

        //列印用戶的Token中的資訊
        System.out.println("access_token:" + authResponse.getData().getToken().getAccessToken());
        System.out.println("用戶的OpenId:" + authResponse.getData().getToken().getOpenId());

        // 列印更加詳細的資訊(第三方平臺回傳的原始用戶資訊)
        System.out.println("用戶的城市:" + authResponse.getData().getRawUserInfo().getInnerMap().get("city"));
        System.out.println("用戶的年份:" + authResponse.getData().getRawUserInfo().getInnerMap().get("year"));
        //回傳JSON資訊
        return authResponse;
    }

結果:

image-20210324153839118

5. 完整Controller原始碼

package com.demo.controller;

import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthQqRequest;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.request.AuthWeiboRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Info:登錄組件測驗
 *
 * @author: 拾年之璐
 * @date: 2021-03-22 0022 19:31
 */
@RestController
@RequestMapping(value = "/plugin")
public class PluginController {

    /**
     * QQ登錄request類
     *
     * @return 鏈接
     */
    private AuthRequest getQQAuthRequest() {
        return new AuthQqRequest(AuthConfig.builder()
                .clientId("appid")
                .clientSecret("appsecret")
                .redirectUri("http://xxx.com/plugin/qqlogin/callback")
                .unionId(true)
                .build());
    }

    /**
     * 跳轉至登錄頁面
     *
     * @param response 頁面跳轉
     * @throws IOException
     */
    @RequestMapping("/qqlogin")
    public void qqlogin(HttpServletResponse response) throws IOException {
        //獲取實體
        AuthRequest authRequest = getQQAuthRequest();
        //列印生成的鏈接
        System.out.println("生成登錄鏈接:" + authRequest.authorize("yourState"));
        System.out.println();
        //頁面跳轉,其中state引數可自定義
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

    /**
     * QQ登錄成功后回傳到此頁
     *
     * @param callback 登錄用戶的資訊
     * @return
     */
    @RequestMapping("/qqlogin/callback")
    public Object qqloginCallback(AuthCallback callback) {
        //獲取實體
        AuthRequest authRequest = getQQAuthRequest();
        // 列印回傳的授權資訊(QQ登錄為code,通過code獲取用戶資訊)
        System.out.println(callback.getCode());
        //根據回傳的引數,執行登錄請求(獲取用戶資訊)
        AuthResponse<AuthUser> authResponse = authRequest.login(callback);

        //列印授權回傳代碼(2000 表示成功,可以用來判斷用戶登錄成功與否)
        System.out.println("狀態碼:" + authResponse.getCode());

        //列印用戶的昵稱、ID、頭像等基本資訊
        System.out.println("用戶的UnionID:" + authResponse.getData().getUuid());
        System.out.println("用戶的昵稱:" + authResponse.getData().getNickname());
        System.out.println("用戶的頭像:" + authResponse.getData().getAvatar());

        //列印用戶的Token中的資訊
        System.out.println("access_token:" + authResponse.getData().getToken().getAccessToken());
        System.out.println("用戶的OpenId:" + authResponse.getData().getToken().getOpenId());

        // 列印更加詳細的資訊(第三方平臺回傳的原始用戶資訊)
        System.out.println("用戶的城市:" + authResponse.getData().getRawUserInfo().getInnerMap().get("city"));
        System.out.println("用戶的年份:" + authResponse.getData().getRawUserInfo().getInnerMap().get("year"));

        // 將JSON包回傳到前端頁面顯示
        return authResponse;
    }

    /**
     * 生成微博授權登錄的類getWbAuthRequest
     *
     * @return
     */
    private AuthRequest getWbAuthRequest() {
        return new AuthWeiboRequest(AuthConfig.builder()
                .clientId("appid")
                .clientSecret("appsecret")
                .redirectUri("http://xxx.com/plugin/sinalogin/callback")
                .build());
    }

    /**
     * 微博登錄頁面,生成登錄鏈接
     *
     * @param response 頁面跳轉
     * @throws IOException
     */
    @RequestMapping("/wblogin")
    public void wblogin(HttpServletResponse response) throws IOException {
        //生成物件
        AuthRequest authRequest = getWbAuthRequest();
        //生成鏈接并回傳,其中state可以自定義,可以用來實作第四方登錄
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

    /**
     * 回呼頁面,獲取登錄用戶新
     *
     * @param callback 詳細JSON資訊
     * @return
     */
    @RequestMapping("/sinalogin/callback")
    public Object wbloginCallback(AuthCallback callback) {
        //生成物件
        AuthRequest authRequest = getWbAuthRequest();
        //獲取登錄后回傳的用戶資訊結果
        AuthResponse<AuthUser> authResponse = authRequest.login(callback);

        //列印授權回傳代碼(2000 表示成功,可以用來判斷用戶登錄成功與否)
        System.out.println("狀態碼:" + authResponse.getCode());

        //列印用戶的昵稱、ID、頭像等基本資訊
        System.out.println("用戶的UnionID:" + authResponse.getData().getUuid());
        System.out.println("用戶的昵稱:" + authResponse.getData().getNickname());
        System.out.println("用戶的頭像:" + authResponse.getData().getAvatar());

        //列印用戶的Token中的資訊
        System.out.println("access_token:" + authResponse.getData().getToken().getAccessToken());
        System.out.println("用戶的OpenId:" + authResponse.getData().getToken().getOpenId());

        // 列印更加詳細的資訊(第三方平臺回傳的原始用戶資訊)
        System.out.println("用戶的城市:" + authResponse.getData().getRawUserInfo().getInnerMap().get("city"));
        System.out.println("用戶的年份:" + authResponse.getData().getRawUserInfo().getInnerMap().get("year"));
        //回傳JSON資訊
        return authResponse;
    }

    /**
    * 銷毀
    */
    @RequestMapping("/revoke/{token}")
    public Object revokeAuth(@PathVariable("token") String token) throws IOException {
        AuthRequest authRequest = getWbAuthRequest();
        return authRequest.revoke(AuthToken.builder().accessToken(token).build());
    }

}

當然,還有其他各個平臺,如:

image-20210324153959885

每個平臺的授權登錄實作方式大同小異,此處不再贅述,

參考資料:

  1. https://justauth.wiki/quickstart/explain.html
  2. https://justauth.wiki/oauth/qq.html
  3. https://justauth.wiki/oauth/weibo.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271605.html

標籤:其他

上一篇:記:2020.3.31

下一篇:二本的我三戰面試官,從容應對HR,看我如何通過社招識訓今日頭條Java工程師Offer!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more