91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

再見(jiàn)了shiro

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-01-15 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


前言

作為一名后臺(tái)開(kāi)發(fā)人員,權(quán)限這個(gè)名詞應(yīng)該算是特別熟悉的了。就算是java里的類(lèi)也有 public、private 等“權(quán)限”之分。之前項(xiàng)目里一直使用shiro作為權(quán)限管理的框架。說(shuō)實(shí)話(huà),shiro的確挺強(qiáng)大的,但是它也有很多不好的地方。shiro默認(rèn)的登錄地址還是login.jsp,前后端分離模式使用shiro還要重寫(xiě)好多類(lèi);手機(jī)端存儲(chǔ)用戶(hù)信息、保持登錄狀態(tài)等等,對(duì)shiro來(lái)說(shuō)也是一個(gè)難題。

在分布式項(xiàng)目里,比如電商項(xiàng)目,其實(shí)不太需要明確的權(quán)限劃分,說(shuō)白了,我認(rèn)為沒(méi)必要做太麻煩的權(quán)限管理,一切從簡(jiǎn)。何況shiro對(duì)于springCloud等各種分布式框架來(lái)說(shuō),簡(jiǎn)直就是“災(zāi)難”。每個(gè)子系統(tǒng)里都要寫(xiě)點(diǎn)shiro的東西,慢慢的,越來(lái)越惡心。zuul網(wǎng)關(guān)就在這里大顯身手了,控制用戶(hù)的登錄,鑒定用戶(hù)的權(quán)限等等。zuul網(wǎng)關(guān)控制用戶(hù)登錄,鑒權(quán)以后再詳說(shuō)。以上拙見(jiàn)。

然后最近我發(fā)現(xiàn)了另一個(gè)權(quán)限框架jcasbin,雖然網(wǎng)上還沒(méi)有很多關(guān)于博客,但是我看了一會(huì)就可以使用了。

順手貼上github地址:https://github.com/casbin/jcasbin

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

一、準(zhǔn)備

基于springboot1.5.10,但是和springboot關(guān)系不太大,所以版本可以忽略,用你熟悉的springboot版本就行。

1、mavan倉(cāng)庫(kù)引入


org.casbin
jcasbin
1.1.0


org.casbin
jdbc-adapter
1.1.0

2、配置文件

jcasbin把用戶(hù)的角色、權(quán)限信息(訪(fǎng)問(wèn)路徑)放置在配置文件里,然后通過(guò)輸入流讀取配置文件。主要有兩個(gè)配置文件:model.confpolicy.csv。簡(jiǎn)單的使用GitHub里都講了,在此就不再贅述了。

其實(shí)也可以讀取數(shù)據(jù)庫(kù)的角色權(quán)限配置。所以我們可以把關(guān)于數(shù)據(jù)庫(kù)的信息提取出來(lái),可以進(jìn)行動(dòng)態(tài)設(shè)置。

@Configuration
@ConfigurationProperties(prefix="org.jcasbin")
publicclassEnforcerConfigProperties{

privateStringurl;

privateStringdriverClassName;

privateStringusername;

privateStringpassword;

privateStringmodelPath;

publicStringgetUrl(){
returnurl;
}

publicvoidsetUrl(Stringurl){
this.url=url;
}

publicStringgetDriverClassName(){
returndriverClassName;
}

publicvoidsetDriverClassName(StringdriverClassName){
this.driverClassName=driverClassName;
}

publicStringgetUsername(){
returnusername;
}

publicvoidsetUsername(Stringusername){
this.username=username;
}

publicStringgetPassword(){
returnpassword;
}

publicvoidsetPassword(Stringpassword){
this.password=password;
}

publicStringgetModelPath(){
returnmodelPath;
}

publicvoidsetModelPath(StringmodelPath){
this.modelPath=modelPath;
}

@Override
publicStringtoString(){
return"EnforcerConfigProperties[url="+url+",driverClassName="+driverClassName+",username="
+username+",password="+password+",modelPath="+modelPath+"]";
}

}

這樣我們就可以在application.properties里進(jìn)行相關(guān)配置了。model.conf是固定的文件,之間復(fù)制過(guò)來(lái)放在新建的和src同級(jí)的文件夾下即可。policy.csv的內(nèi)容是可以從數(shù)據(jù)庫(kù)讀取的。

org.jcasbin.url=jdbc//localhost:3306/casbin?useSSL=false
org.jcasbin.driver-class-name=com.mysql.jdbc.Driver
org.jcasbin.username=root
org.jcasbin.password=root
org.jcasbin.model-path=conf/authz_model.conf

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

二、讀取權(quán)限信息進(jìn)行初始化

我們要對(duì)Enforcer這個(gè)類(lèi)初始化,加載配置文件里的信息。所以我們寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)InitializingBean,在容器加載的時(shí)候就初始化這個(gè)類(lèi),方便后續(xù)的使用。

@Component
publicclassEnforcerFactoryimplementsInitializingBean{

privatestaticEnforcerenforcer;

@Autowired
privateEnforcerConfigPropertiesenforcerConfigProperties;
privatestaticEnforcerConfigPropertiesconfig;

@Override
publicvoidafterPropertiesSet()throwsException{
config=enforcerConfigProperties;
//從數(shù)據(jù)庫(kù)讀取策略
JDBCAdapterjdbcAdapter=newJDBCAdapter(config.getDriverClassName(),config.getUrl(),config.getUsername(),
config.getPassword(),true);
enforcer=newEnforcer(config.getModelPath(),jdbcAdapter);
enforcer.loadPolicy();//LoadthepolicyfromDB.
}

/**
*添加權(quán)限
*@parampolicy
*@return
*/
publicstaticbooleanaddPolicy(Policypolicy){
booleanaddPolicy=enforcer.addPolicy(policy.getSub(),policy.getObj(),policy.getAct());
enforcer.savePolicy();

returnaddPolicy;
}

/**
*刪除權(quán)限
*@parampolicy
*@return
*/
publicstaticbooleanremovePolicy(Policypolicy){
booleanremovePolicy=enforcer.removePolicy(policy.getSub(),policy.getObj(),policy.getAct());
enforcer.savePolicy();

returnremovePolicy;
}

publicstaticEnforcergetEnforcer(){
returnenforcer;
}


}

在這個(gè)類(lèi)里,我們注入寫(xiě)好的配置類(lèi),然后轉(zhuǎn)為靜態(tài)的,在afterPropertiesSet方法里實(shí)例化Enforcer并加載policy(策略,角色權(quán)限/url對(duì)應(yīng)關(guān)系)。

同時(shí)又寫(xiě)了兩個(gè)方法,用來(lái)添加和刪除policy,Policy是自定的一個(gè)類(lèi),對(duì)官方使用的集合/數(shù)組進(jìn)行了封裝。

publicclassPolicy{
/**想要訪(fǎng)問(wèn)資源的用戶(hù)或者角色*/
privateStringsub;

/**將要訪(fǎng)問(wèn)的資源,可以使用*作為通配符,例如/user/**/
privateStringobj;

/**用戶(hù)對(duì)資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用*作為通配符*/
privateStringact;

publicPolicy(){
super();
}

/**
*
*@paramsub想要訪(fǎng)問(wèn)資源的用戶(hù)或者角色
*@paramobj將要訪(fǎng)問(wèn)的資源,可以使用*作為通配符,例如/user/*
*@paramact用戶(hù)對(duì)資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用*作為通配符
*/
publicPolicy(Stringsub,Stringobj,Stringact){
super();
this.sub=sub;
this.obj=obj;
this.act=act;
}

publicStringgetSub(){
returnsub;
}

publicvoidsetSub(Stringsub){
this.sub=sub;
}

publicStringgetObj(){
returnobj;
}

publicvoidsetObj(Stringobj){
this.obj=obj;
}

publicStringgetAct(){
returnact;
}

publicvoidsetAct(Stringact){
this.act=act;
}

@Override
publicStringtoString(){
return"Policy[sub="+sub+",obj="+obj+",act="+act+"]";
}

}

三、使用

1、權(quán)限控制

jcasbin的權(quán)限控制非常簡(jiǎn)單,自定義一個(gè)過(guò)濾器,if判斷就可以搞定,沒(méi)錯(cuò),就這么簡(jiǎn)單。

@WebFilter(urlPatterns="/*",filterName="JCasbinAuthzFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)//執(zhí)行順序,最高級(jí)別最先執(zhí)行,int從小到大
publicclassJCasbinAuthzFilterimplementsFilter{

privatestaticfinalLoggerlog=LoggerFactory.getLogger(JCasbinAuthzFilter.class);

privatestaticEnforcerenforcer;

@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}

@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainchain)
throwsIOException,ServletException{
HttpServletRequestrequest=(HttpServletRequest)servletRequest;
HttpServletResponseresponse=(HttpServletResponse)servletResponse;

Stringuser=request.getParameter("username");
Stringpath=request.getRequestURI();
Stringmethod=request.getMethod();

enforcer=EnforcerFactory.getEnforcer();
if(path.contains("anon")){
chain.doFilter(request,response);
}elseif(enforcer.enforce(user,path,method)){
chain.doFilter(request,response);
}else{
log.info("無(wú)權(quán)訪(fǎng)問(wèn)");
Mapresult=newHashMap();
result.put("code",1001);
result.put("msg","用戶(hù)權(quán)限不足");
result.put("data",null);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.getWriter().write(JSONObject.toJSONString(result,SerializerFeature.WriteMapNullValue));
}

}

@Override
publicvoiddestroy(){

}

}

主要是用enforcer.enforce(user, path, method)這個(gè)方法對(duì)用戶(hù)、訪(fǎng)問(wèn)資源、方式進(jìn)行匹配。這里的邏輯可以根據(jù)自己的業(yè)務(wù)來(lái)實(shí)現(xiàn)。在這個(gè)過(guò)濾器之前還可以添加一個(gè)判斷用戶(hù)是否登錄的過(guò)濾器。

2、添加刪除權(quán)限

對(duì)于權(quán)限的操作,直接調(diào)用上面寫(xiě)好的EnforcerFactory里對(duì)應(yīng)的方法即可。并且,可以達(dá)到同步的效果。就是不用重啟服務(wù)器或者其他任何操作,添加或刪除用戶(hù)權(quán)限后,用戶(hù)對(duì)應(yīng)的訪(fǎng)問(wèn)就會(huì)收到影響。

@PutMapping("/anon/role/per")
publicResultBOaddPer(){

EnforcerFactory.addPolicy(newPolicy("alice","/user/list","*"));

returnResultTool.success();
}

@DeleteMapping("/anon/role/per")
publicResultBOdeletePer(){

EnforcerFactory.removePolicy(newPolicy("alice","/user/list","*"));

returnResultTool.success();
}

		

寫(xiě)在后面的話(huà)

其實(shí)可以把jcasbin和SpringCloud的zuul結(jié)合來(lái)實(shí)現(xiàn)用戶(hù)的統(tǒng)一登錄和權(quán)限控制。自定義一個(gè)過(guò)濾器繼承ZuulFilter即可,其他地方基本沒(méi)啥區(qū)別。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    18422
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15935
  • 過(guò)濾器
    +關(guān)注

    關(guān)注

    1

    文章

    444

    瀏覽量

    20964

原文標(biāo)題:再見(jiàn)了 shiro

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    為什么會(huì)有TCP/IP協(xié)議?

    ,計(jì)算機(jī)只是單兵作戰(zhàn)并不會(huì)發(fā)揮太大的作用。 只有把它們聯(lián)合起來(lái),電腦才會(huì)發(fā)揮出它最大的潛力。于是人們就想方設(shè)法的用電線(xiàn)把電腦連接到了一起。 但是簡(jiǎn)單的連到一起是遠(yuǎn)遠(yuǎn)不夠的,就好像語(yǔ)言不同的兩個(gè)人互相見(jiàn)了
    發(fā)表于 12-03 06:28

    KiCon Asia 2025 完美落幕,相約明年再見(jiàn)!

    “ ?3 天緊湊的活動(dòng)完美落幕!一場(chǎng)培訓(xùn),16個(gè)主題演講。更重要的是,來(lái)自全球各地的喜歡 KiCad 的小伙伴們可以聚在一起,互相交流,暢所欲言。? ” ? 未能現(xiàn)場(chǎng)參加的小伙伴可以?huà)叽a查看現(xiàn)場(chǎng)的照片: 演講的視頻和 PPT 整理后會(huì)在公眾號(hào)分享。 讓我們一起回顧下會(huì)議的過(guò)程... 11月13日 培訓(xùn) 這次培訓(xùn)比去年更精彩,Seth 同學(xué)分享了很多在文檔上找不到的技巧,帶大家完整設(shè)計(jì)了一個(gè) USB 電路。相信所有的小伙伴都受益匪淺。 11月14~15日 主題演講 1. Ki
    的頭像 發(fā)表于 11-16 11:20 ?428次閱讀
    KiCon Asia 2025 完美落幕,相約明年<b class='flag-5'>再見(jiàn)</b>!

    安達(dá)發(fā)|用APS自動(dòng)排程,對(duì)玻璃加工“拖期”說(shuō)再見(jiàn)

    在競(jìng)爭(zhēng)日益激烈的制造業(yè)環(huán)境中,玻璃加工行業(yè)正面臨著前所未有的挑戰(zhàn)。多品種、小批量、短交期的訂單模式已成為常態(tài),從原片切割、磨邊、鉆孔,到鋼化、鍍膜、絲印等復(fù)雜工藝,生產(chǎn)環(huán)節(jié)環(huán)環(huán)相扣,任何一個(gè)環(huán)節(jié)的延遲都可能引發(fā)連鎖反應(yīng),導(dǎo)致訂單交付延誤、庫(kù)存積壓、生產(chǎn)成本飆升。如何打破生產(chǎn)計(jì)劃與調(diào)度的瓶頸? APS自動(dòng)排程 系統(tǒng)的引入,正成為玻璃加工企業(yè)邁向智能化、數(shù)字化管理,贏得市場(chǎng)競(jìng)爭(zhēng)力的關(guān)鍵一步。 玻璃加工行業(yè)傳統(tǒng)排
    的頭像 發(fā)表于 11-10 11:10 ?326次閱讀
    安達(dá)發(fā)|用APS自動(dòng)排程,對(duì)玻璃加工“拖期”說(shuō)<b class='flag-5'>再見(jiàn)</b>

    科技如塵,攜光共舞。有光的地方,就有效率的舞步

    ;到"釷"的歷史性跨越。這釷基熔鹽堆,猶如沉睡后覺(jué)醒的雄獅,無(wú)聲卻有力,以高溫熔鹽為冷卻劑,無(wú)需巨大壓力容器,也不用大量水冷卻。這正如那黑暗中的炬火,照見(jiàn)了中國(guó)科技自主創(chuàng)新的道路。西
    的頭像 發(fā)表于 11-04 11:59 ?504次閱讀
    科技如塵,攜光共舞。有光的地方,就有效率的舞步

    東軟集團(tuán)受邀出席第三屆亞洲愿景論壇

    近日,第三屆亞洲愿景論壇(Asia New Vision Forum)在新加坡召開(kāi)。期間,新加坡副總理兼貿(mào)工部長(zhǎng)顏金勇(Gan Kim Yong)出席論壇并會(huì)見(jiàn)了東軟集團(tuán)總裁蓋龍佳等企業(yè)代表,就亞洲經(jīng)濟(jì)的發(fā)展趨勢(shì)和挑戰(zhàn)、亞洲企業(yè)在新加坡的投資與發(fā)展等話(huà)題進(jìn)行交流。
    的頭像 發(fā)表于 09-16 14:36 ?933次閱讀

    臺(tái)式電腦盤(pán)符不見(jiàn)了#

    前段時(shí)間電腦運(yùn)行速度突然變得特別慢,小毛病不斷,后來(lái)CDE盤(pán)盤(pán)符也不見(jiàn)了,于是就重裝了系統(tǒng),剛好了兩天,今天一開(kāi)電腦就發(fā)現(xiàn)CDE盤(pán)符上有感嘆號(hào),于是做了磁盤(pán)檢查,完了說(shuō)要重啟電腦,結(jié)果重啟完電腦這幾個(gè)盤(pán)符又不見(jiàn)了,該怎么辦?
    發(fā)表于 08-28 20:50

    廣西壯族自治區(qū)領(lǐng)導(dǎo)蒞臨有方科技參觀交流

    近日,廣西壯族自治區(qū)黨委書(shū)記、自治區(qū)人大常委會(huì)主任陳剛在南寧會(huì)見(jiàn)了深圳市有方科技股份有限公司董事長(zhǎng)兼總經(jīng)理王慷一行。雙方圍繞深化城市物聯(lián)感知體系建設(shè)、AI硬件終端、場(chǎng)景AI解決方案、延伸具身人形機(jī)器人產(chǎn)業(yè)鏈等方面的議題進(jìn)行了交流。
    的頭像 發(fā)表于 08-12 11:42 ?1031次閱讀

    西班牙政府考察團(tuán)點(diǎn)贊德賽西威智能工廠

    近日,德賽西威成為西班牙媒體關(guān)注的焦點(diǎn),該國(guó)政府高級(jí)官員接連組團(tuán)式現(xiàn)場(chǎng)視察并會(huì)見(jiàn)了德賽西威執(zhí)行副總裁凌劍輝,盛贊德賽西威位于西班牙安達(dá)盧西亞州利納雷斯市的智能工廠項(xiàng)目,高度肯定了該項(xiàng)目對(duì)推動(dòng)當(dāng)?shù)亟?jīng)濟(jì)、提升就業(yè),乃至西班牙汽車(chē)產(chǎn)業(yè)發(fā)展的重要意義。
    的頭像 發(fā)表于 07-09 14:59 ?1155次閱讀

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中?

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中,看見(jiàn)了官方推出的移植文檔,但是不知道是否支持此芯片
    發(fā)表于 07-08 06:48

    精彩回顧 | TOSUN同星2025歐洲汽車(chē)測(cè)試展圓滿(mǎn)落幕,期待下次再見(jiàn)!

    5月20-22日,全球汽車(chē)測(cè)試技術(shù)盛會(huì)——?dú)W洲汽車(chē)測(cè)試展(EuropeanAutomotiveTestingExpo2025)在德國(guó)圓滿(mǎn)落幕。作為汽車(chē)電子基礎(chǔ)工具鏈領(lǐng)域領(lǐng)先企業(yè),TOSUN同星攜多領(lǐng)域測(cè)試解決方案及最新發(fā)布產(chǎn)品矩陣重磅亮相,吸引了眾多國(guó)際客戶(hù)與行業(yè)專(zhuān)家的高度關(guān)注?,F(xiàn)場(chǎng)直擊ExhibitionSite展會(huì)期間,TOSUN同星展臺(tái)吸引了來(lái)自來(lái)自歐
    的頭像 發(fā)表于 05-23 20:06 ?708次閱讀
    精彩回顧 | TOSUN同星2025歐洲汽車(chē)測(cè)試展圓滿(mǎn)落幕,期待下次<b class='flag-5'>再見(jiàn)</b>!

    巴西總統(tǒng)盧拉會(huì)見(jiàn)長(zhǎng)城汽車(chē)

    近日,在華訪(fǎng)問(wèn)的巴西總統(tǒng)盧拉會(huì)見(jiàn)了長(zhǎng)城汽車(chē)董事長(zhǎng)魏建軍。作為汽車(chē)產(chǎn)業(yè)的代表,魏建軍就在巴西投資布局項(xiàng)目的最新成果以及合規(guī)、誠(chéng)信的經(jīng)營(yíng)理念與盧拉總統(tǒng)進(jìn)行了深入交流,盧拉總統(tǒng)對(duì)此給予了高度贊賞和支持。會(huì)談期間,雙方還就長(zhǎng)城汽車(chē)在巴西的進(jìn)一步發(fā)展達(dá)成共識(shí)。
    的頭像 發(fā)表于 05-16 15:51 ?715次閱讀

    云知聲積極推動(dòng)廈門(mén)人工智能產(chǎn)業(yè)發(fā)展

    近日,廈門(mén)市市長(zhǎng)伍斌在市政府會(huì)見(jiàn)了云知聲創(chuàng)始人、CEO黃偉一行。雙方就深化合作、共促?gòu)B門(mén)人工智能產(chǎn)業(yè)發(fā)展進(jìn)行交流。
    的頭像 發(fā)表于 04-22 16:19 ?730次閱讀

    單片機(jī)編程關(guān)鍵字之volatile

    volatile 修飾的變量是說(shuō)這變量可能會(huì)被意想不到地改變。通常對(duì)于程序員而言,單片機(jī) 中用的就算常見(jiàn)了volatile 是易變的,不穩(wěn)定的意思。其實(shí)對(duì)于很多人來(lái)說(shuō),根本沒(méi)見(jiàn)過(guò)這個(gè)關(guān)鍵字,不 知道
    發(fā)表于 04-02 13:47 ?2次下載

    機(jī)器人的眼眸中,vivo看見(jiàn)了怎樣的未來(lái)?

    從手機(jī)到機(jī)器人/MR,vivo對(duì)下一代交互的升維思考
    的頭像 發(fā)表于 03-27 09:24 ?2430次閱讀
    機(jī)器人的眼眸中,vivo看<b class='flag-5'>見(jiàn)了</b>怎樣的未來(lái)?