Vulcan Spring 公司是家專業(yè)制造精密特種彈簧的美國企業(yè),成立于1967年,現坐落于紐約西南部的賓州泰爾夫德市,生產的彈簧被用于外太空探測領域,人造衛(wèi)星和火星上的漫游者號等.

Vulcan Spring公司生產的彈簧以精巧,精確和壽命長而聞名,美國通用汽車GM公司、GE公司、摩托羅拉、波音公司、3M、埃默森Emerson公司等世界著名公司都是Vulcan公司的客戶。Vulcan 為客戶定制不同的彈簧。同時,在英國,德國,法國,意大利,中國臺灣、中國香港等國家和地區(qū)也有Vulcan公司的產品,Vulcan的產品 (PullBox等)在沃爾瑪等大型超市應用廣泛.

Vulcan Spring工廠占地面積5600平方米,那里涵蓋了生產彈簧產品所有的生產工序.同時,公司內部還擁有一支設計經驗豐富、專業(yè)技術和制造能力過硬的彈簧設計專家隊伍,能快速提供客戶所需彈簧樣品,為客戶提供新產品設計并改善其現有產品的性能。客戶如有特殊要求,彈簧專家將協(xié)同客戶一起開發(fā)新產品.

Vulcan Spring 產品應用范圍廣,可用于家電產品、動力工具、電動馬達、玩具、工業(yè)設備、辦公設備、“彈出式”陳列架、機械工具、電動設備、電子、外科儀器、X射線和核磁共振設備等諸多領域.

主要產品包括:

Contorque(恒扭力彈簧) ,該產品采用獨到的設計,Contorque彈簧在勢能不變的情況下可旋轉數圈,適于電纜延伸并可替代電池電機或配重。

電機電刷彈簧,為電機換向器電刷受力穩(wěn)固提供了理想手段,可減小電刷磨損,從而提高電機的作業(yè)性能。

Conpower動力彈簧,這種彈簧在比力矩不高的情況下可旋轉很多圈。彈簧由心軸或盒提供旋轉能或借助滑輪或纜線來提供線性運動。Vulcan還制造非預應力動力彈簧。

機械卷筒,該產品能為需要平衡、回收或返回的應用提供動力。在需要長偏轉的應用中,機械卷筒供力穩(wěn)定且壽命期長。

其他定制彈簧,從沖壓片和封槽到線材成形、扭力彈簧、十字扣帶和定制的板簧設計。

Vulcan Spring造價信息

市場價 信息價 詢價
材料名稱 規(guī)格/型號 市場價
(除稅)
工程建議價
(除稅)
行情 品牌 單位 稅率 供應商 報價日期
LED永久信號燈PSD-SCE-TMSPRING PSD-S CE-TM SPRING 查看價格 查看價格

菲尼克斯

13% 長沙市澤菲電氣有限公司
接線端子(PT) 品種:銅接線端子;訂貨號:2018520000;標準包裝:1;規(guī)格型號:CONTACT SPRING SAKS 3 PLATED; 查看價格 查看價格

魏德米勒

13% 北京康耐特自動化技術有限公司
接線端子(PT) 品種:銅接線端子;訂貨號:2018530000;標準包裝:1;規(guī)格型號:CONTACT SPRING; 查看價格 查看價格

魏德米勒

13% 北京康耐特自動化技術有限公司
接線端子(PT) 品種:銅接線端子;訂貨號:4108440000;標準包裝:1;規(guī)格型號:SPRING WASHER SAkg 32; 查看價格 查看價格

魏德米勒

13% 北京康耐特自動化技術有限公司
花片 品種:釉面磚;用途:墻地磚;長度(mm):450;寬度(mm):316;系列:瓷片系列;色類:spring(春天);編碼:LM45602B1 查看價格 查看價格

唯美

13% 上海樂闖實業(yè)有限公司
指紋鎖 ,令您倍享自在無憂生活。魔力鏡面觸摸屏,引領潮流之家:領先全球的獨特鏡面外觀設計,更顯優(yōu)雅高貴,引領潮流時尚。;品種:指紋鎖;材質:外殼:鋁合金;內殼:鋁合金;把手:鋅合金;規(guī)格型號:VULCAN-F;鎖芯材質:不銹鋼 查看價格 查看價格

耶魯

13% 耶魯電子鎖專賣店
材料名稱 規(guī)格/型號 除稅
信息價
含稅
信息價
行情 品牌 單位 稅率 地區(qū)/時間
暫無數據
材料名稱 規(guī)格/需求量 報價數 最新報價
(元)
供應商 報價地區(qū) 最新報價時間
PAM加藥泵 seko- spring系列, 泵頭pvc|1臺 1 查看價格 廣州創(chuàng)量環(huán)保設備有限公司 廣東   2018-01-25
PAC加藥泵 seko- spring系列, 泵頭pvc|1臺 1 查看價格 廣州創(chuàng)量環(huán)保設備有限公司 廣東   2018-01-25
墻紙 圖案:Rindle-Silver Spring 1370mm/1390mm 灰色背景色縱向波浪圖案|1m2 1 查看價格 上海迦樂裝飾材料有限公司    2015-12-04
系統(tǒng)回水循環(huán)水泵SPRINGN32-300:額定功率0.75kw 系統(tǒng)回水循環(huán)水泵SPRING N32-300:額定功率0.75kw|8臺 3 查看價格 成都華寶熱能設備有限公司 四川   2022-06-17
虛擬化與云管平臺-云管平臺 管理平臺兼容主流x86虛擬化平臺,支持KVM、VMware、Hyper-V、Xenserver等.4、云管理平臺支持擴展主流小型機虛擬化平臺,支持PowerVM、HPVM等.5、云管理平臺支持業(yè)界主流的容器技術 Docker 及容器編排引擎 Kubernetes,支持Spring|1套 3 查看價格 北京神州新橋科技有限公司 全國   2022-04-29

Vulcan Spring常見問題

  • spring鍋具怎么樣

    媒體評為鍋具中的奔馳,鍋具中的香奈兒    完美的水封設計,將鍋內水氣留住,維持食物的色澤與鮮美,真正達到無水烹調的極致。五曾復合合金傳熱極佳,熱能能有效均勻的傳達至鍋底到鍋身,...

  • 瑞士鍋具力康和spring哪個更好?

    您好,據我所知瑞士瑞蓮鍋具質量還算是不錯。spring沒用過也不好亂說 鍋產品質量在二線品牌中算是挺好的,質量一點也不比一線中一些品牌差,做工精細,好漂亮的又好用,外觀光可鑒人,手感厚實光滑,很高大上...

  • spring廚具怎么樣?

    spring是中國最大、全球第二的炊具研發(fā)制造商,中國廚房小家電領先品牌。產品的技術都是國內最新的,質量更是有幾十年沉淀的口碑在那里。

Vulcan Spring文獻

【免費下載】Spring框架課程設計指導書 【免費下載】Spring框架課程設計指導書

格式:pdf

大?。?span id="lxf5ldb" class="single-tag-height">82KB

頁數: 6頁

評分: 4.4

Spring 框架 課程設計指導書 長春工業(yè)大學 計算機科學與工程學院 2015 年 7 月 1 一、實驗目的 Spring 是一個開源框架,是為了解決企業(yè)應用程序開發(fā)復雜性而創(chuàng)建的。 框架的主要優(yōu)勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件, 同時為 J2EE 應用程序開發(fā)提供集成的框架。 按照所學的知識,設計開發(fā)一個小型的電子商務類系統(tǒng)。旨在通過完成一 個項目的開發(fā) ,通過實際問題培養(yǎng)學生的動手能力,并且使學生更加深入的理解 和靈活掌握教學內容。通過實驗使學生更加熟練的掌握 Myeclipse 的使用,使 學生更加深入的了解 java web 的開源框架的使用。 二、實驗要求 1、課程設計時間為一周,以 3 人為一小組,每個小組在設計的第一天進 行選題,制訂進度計劃,分配任務,在設計的最后一天整理系統(tǒng)文檔,形成設 計報告。 2、根據課程設計的目的、要求認真準備。不遲到、不早

立即下載
基于Struts 2+JPA+Spring 2架構的IT服務臺系統(tǒng)的設計與實現 基于Struts 2+JPA+Spring 2架構的IT服務臺系統(tǒng)的設計與實現

格式:pdf

大?。?span id="1zp5rrz" class="single-tag-height">82KB

頁數: 5頁

評分: 4.8

在Jave EE應用開發(fā)中,使用優(yōu)秀的框架可以提高系統(tǒng)的開發(fā)效率、更穩(wěn)定的性能、同時有利于后期的維護和更新。通過整合Struts 2、JPA、Spring 2三個框架,構建了一種輕量級Java EE架構。該架構以Spring 2為核心,整合JPA進行持久化訪問;整合Struts 2以MVC模式控制。并利用此架構設計開發(fā)了基于ITIL的IT服務管理中服務臺系統(tǒng)。實踐證明,該架構使得項目開發(fā)簡潔、結構清晰,并具有良好的復用性、擴展性和可維護性。

立即下載

其主要功能有:①控制機械的運動,如內燃機中的閥門彈簧、離合器中的控制彈簧等。②吸收振動和沖擊能量,如汽車、火車車廂下的緩沖彈簧、聯軸器中的吸振彈簧等。③儲存及輸出能量作為動力,如鐘表彈簧、槍械中的彈簧等。④用作測力元件,如測力器、彈簧秤中的彈簧等。彈簧的載荷與變形之比稱為彈簧剛度,剛度越大,則彈簧越硬。

按受力性質,彈簧可分為拉伸彈簧、壓縮彈簧、扭轉彈簧和彎曲彈簧,按形狀可分為螺旋彈簧、碟形彈簧、環(huán)形彈簧、板彈簧、平面蝸卷彈簧以及扭桿彈簧等。普通圓柱螺旋彈簧由于制造簡單,且可根據受載情況制成各種型式,結構簡單,故應用最廣。彈簧的制造材料一般來說應具有高的彈性極限、疲勞極限、沖擊韌性及良好的熱處理性能等,常用的有碳素彈簧鋼、合金彈簧鋼、不銹彈簧鋼以及銅合金、鎳合金和橡膠等。彈簧的制造方法有冷卷法和熱卷法。彈簧絲直徑小于8毫米的一般用冷卷法,大于8毫米的用熱卷法。有些彈簧在制成后還要進行強壓或噴丸處理,可提高彈簧的承載能力。

來源:hengyunabc ,

hengyunabc.github.io/depth-analysis-hibernate-validar-noclassdefounderror/

問題

可重現的Demo代碼:demo.zip

http://hengyunabc.github.io/img/demo.zip

最近排查一個spring boot應用拋出hibernate.validator NoClassDefFoundError的問題,異常信息如下:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl

at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]

at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]

at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]

at org.springframework.boot.autoconfigure.validation.DefaultValidatorConfiguration.defaultValidator(DefaultValidatorConfiguration.java:43) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_112]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_112]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_112]

at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_112]

at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]

... 32 common frames omitted

這個錯誤信息表面上是NoClassDefFoundError,但是實際上ConfigurationImpl這個類是在hibernate-validator-5.3.5.Final.jar里的,不應該出現找不到類的情況。

那為什么應用里拋出這個NoClassDefFoundError ?

有經驗的開發(fā)人員從Could not initialize class 這個信息就可以知道,實際上是一個類在初始化時拋出的異常,比如static的靜態(tài)代碼塊,或者static字段初始化的異常。

誰初始化了 org.hibernate.validator.internal.engine.ConfigurationImpl

但是當我們在HibernateValidator 這個類,創(chuàng)建ConfigurationImpl的代碼塊里打斷點時,發(fā)現有兩個線程觸發(fā)了斷點:

public class HibernateValidator implements ValidationProvider<HibernateValidatorConfiguration> {

@Override

public Configuration<?> createGenericConfiguration(BootstrapState state) {

return new ConfigurationImpl( state );

}

其中一個線程的調用棧是:

Thread [background-preinit] (Class load: ConfigurationImpl)

HibernateValidator.createGenericConfiguration(BootstrapState) line: 33

Validation$GenericBootstrapImpl.configure() line: 276

BackgroundPreinitializer$ValidationInitializer.run() line: 107

BackgroundPreinitializer$1.runSafely(Runnable) line: 59

BackgroundPreinitializer$1.run() line: 52

Thread.run() line: 745

另外一個線程調用棧是:

Thread [main] (Suspended (breakpoint at line 33 in HibernateValidator))

owns: ConcurrentHashMap<K,V> (id=52)

owns: Object (id=53)

HibernateValidator.createGenericConfiguration(BootstrapState) line: 33

Validation$GenericBootstrapImpl.configure() line: 276

MessageInterpolatorFactory.getObject() line: 53

DefaultValidatorConfiguration.defaultValidator() line: 43

NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]

NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62

DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43

Method.invoke(Object, Object...) line: 498

CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition, String, BeanFactory, Object, Method, Object...) line: 162

ConstructorResolver.instantiateUsingFactoryMethod(String, RootBeanDefinition, Object[]) line: 588

DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).instantiateUsingFactoryMethod(String, RootBeanDefinition, Object[]) line: 1173

顯然,這個線程的調用棧是常見的spring的初始化過程。

BackgroundPreinitializer 做了什么

那么重點來看下 BackgroundPreinitializer 線程做了哪些事情:

@Order(LoggingApplicationListener.DEFAULT_ORDER + 1)

public class BackgroundPreinitializer

implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {

@Override

public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {

try {

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

runSafely(new MessageConverterInitializer());

runSafely(new MBeanFactoryInitializer());

runSafely(new ValidationInitializer());

runSafely(new JacksonInitializer());

runSafely(new ConversionServiceInitializer());

}

public void runSafely(Runnable runnable) {

try {

runnable.run();

}

catch (Throwable ex) {

// Ignore

}

}

}, "background-preinit");

thread.start();

}

可以看到BackgroundPreinitializer類是spring boot為了加速應用的初始化,以一個獨立的線程來加載hibernate validator這些組件。

這個 background-preinit 線程會吞掉所有的異常。

顯然ConfigurationImpl 初始化的異常也被吞掉了,那么如何才能獲取到最原始的信息?

獲取到最原始的異常信息

在BackgroundPreinitializer的 run() 函數里打一個斷點(注意是Suspend thread類型, 不是Suspend VM),讓它先不要觸發(fā)ConfigurationImpl的加載,讓spring boot的正常流程去觸發(fā)ConfigurationImpl的加載,就可以知道具體的信息了。

那么打出來的異常信息是:

Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;

at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:19) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]

at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:22) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]

at org.hibernate.validator.internal.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:71) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]

at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]

at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]

at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]

那么可以看出是 org.jboss.logging.Logger 這個類不兼容,少了getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object 這個函數。

那么檢查下應用的依賴,可以發(fā)現org.jboss.logging.Logger 在jboss-common-1.2.1.GA.jar和jboss-logging-3.3.1.Final.jar里都有。

顯然是jboss-common-1.2.1.GA.jar 這個依賴過時了,需要排除掉。

總結異常的發(fā)生流程

應用依賴了jboss-common-1.2.1.GA.jar,它里面的org.jboss.logging.Logger太老 spring boot啟動時,BackgroundPreinitializer里的線程去嘗試加載ConfigurationImpl,然后觸發(fā)了org.jboss.logging.Logger的函數執(zhí)行問題 BackgroundPreinitializer 吃掉了異常信息,jvm把ConfigurationImpl標記為不可用的 spring boot正常的流程去加載ConfigurationImpl,jvm發(fā)現ConfigurationImpl類是不可用,直接拋出NoClassDefFoundError

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl

深入JVM

為什么第二次嘗試加載ConfigurationImpl時,會直接拋出java.lang.NoClassDefFoundError: Could not initialize class ?

下面用一段簡單的代碼來重現這個問題:

try {

org.hibernate.validator.internal.util.Version.touch();

} catch (Throwable e) {

e.printStackTrace();

}

System.in.read();

try {

org.hibernate.validator.internal.util.Version.touch();

} catch (Throwable e) {

e.printStackTrace();

}

使用HSDB來確定類的狀態(tài)

當拋出第一個異常時,嘗試用HSDB來看下這個類的狀態(tài)。

sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB

然后在HSDB console里查找到Version的地址信息

hsdb> class org.hibernate.validator.internal.util.Version

org/hibernate/validator/internal/util/Version @0x00000007c0060218

然后在Inspector查找到這個地址,發(fā)現_init_state是5。

再看下hotspot代碼,可以發(fā)現5對應的定義是initialization_error:

// /hotspot/src/share/vm/oops/instanceKlass.hpp

// See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed deion

// of the class loading & initialization procedure, and the use of the states.

enum ClassState {

allocated, // allocated (but not yet linked)

loaded, // loaded and inserted in class hierarchy (but not linked yet)

linked, // successfully linked/verified (but not initialized yet)

being_initialized, // currently running class initializer

fully_initialized, // initialized (successfull final state)

initialization_error // error happened during initialization

};

JVM規(guī)范里關于Initialization的內容

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.5

從規(guī)范里可以看到初始一個類/接口有12步,比較重要的兩步都用黑體標記出來了:

5: If the Class object for C is in an erroneous state, then initialization is not possible. Release LC and throw a NoClassDefFoundError. 11: Otherwise, the class or interface initialization method must have completed abruptly by throwing some exception E. If the class of E is not Error or one of its subclasses, then create a new instance of the class ExceptionInInitializerError with E as the argument, and use this object in place of E in the following step.

第一次嘗試加載Version類時

當第一次嘗試加載時,hotspot InterpreterRuntime在解析invokestatic指令時,嘗試加載org.hibernate.validator.internal.util.Version類,InstanceKlass的_init_state先是標記為being_initialized,然后當加載失敗時,被標記為initialization_error。

對應Initialization的11步。

// hotspot/src/share/vm/oops/instanceKlass.cpp

// Step 10 and 11

Handle e(THREAD, PENDING_EXCEPTION);

CLEAR_PENDING_EXCEPTION;

// JVMTI has already reported the pending exception

// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError

JvmtiExport::clear_detected_exception((JavaThread*)THREAD);

{

EXCEPTION_MARK;

this_oop->set_initialization_state_and_notify(initialization_error, THREAD);

CLEAR_PENDING_EXCEPTION; // ignore any exception thrown, class initialization error is thrown below

// JVMTI has already reported the pending exception

// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError

JvmtiExport::clear_detected_exception((JavaThread*)THREAD);

}

DTRACE_CLASSINIT_PROBE_WAIT(error, InstanceKlass::cast(this_oop()), -1,wait);

if (e->is_a(SystemDictionary::Error_klass())) {

THROW_OOP(e());

} else {

JavaCallArguments args(e);

THROW_ARG(vmSymbols::java_lang_ExceptionInInitializerError(),

vmSymbols::throwable_void_signature(),

&args);

}

第二次嘗試加載Version類時

當第二次嘗試加載時,檢查InstanceKlass的_init_state是initialization_error,則直接拋出NoClassDefFoundError: Could not initialize class.

對應Initialization的5步。

// hotspot/src/share/vm/oops/instanceKlass.cpp

void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) {

// ...

// Step 5

if (this_oop->is_in_error_state()) {

DTRACE_CLASSINIT_PROBE_WAIT(erroneous, InstanceKlass::cast(this_oop()), -1,wait);

ResourceMark rm(THREAD);

const char* desc = "Could not initialize class ";

const char* className = this_oop->external_name();

size_t msglen = strlen(desc) + strlen(className) + 1;

char* message = NEW_RESOURCE_ARRAY(char, msglen);

if (NULL == message) {

// Out of memory: can't create detailed error message

THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), className);

} else {

jio_snprintf(message, msglen, "%s%s", desc, className);

THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), message);

}

}

總結

彈力測試儀目的

本機專為沙發(fā)彈簧框架和彈簧包而設計的測試儀器,它可滿足以下三種測試要求

This tester is designed for the test of the zig-zag spring assembly and spring pack used in sofa manufacturing , it can perform the following 3 kinds of test requirements

1)耐久性測試 / Durability Tes 可按預設定之壓力條件進行重復按壓測試,周期可預設定,到數自動停止。

The spring undergone a repeated specific force , the test cycles is pre-settable, and the test stop when the set cycle is up.

2)壓縮量程與壓力關系檢測 / Fix stroke test

壓板按預設定行程下壓, 到位停止。在壓力表上讀取該行程的彈簧力.

The presser comes down to a specify stoke, read the force on that stroke from the pressure gauge.

3)特定壓力下彈簧壓縮量檢測 / Fix force test

壓板下壓至設定壓力后停止,顯示屏上顯示該壓力值的壓縮行程長度。

The presser comes down to a specify force, the presser stop and the compression rate (stroke)

will be displayed on the screen.

注:

a) 本機最大壓力 = 80 公斤, 最高按壓行程150 mm。

b) 壓力傳感器精度:0.3% FS

c) 行程精度 : ±0.2 mm

d)電源: 220伏, 功率= 400瓦

Vulcan Spring相關推薦
  • 相關百科
  • 相關知識
  • 相關專欄