• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Java FormEntryModel类代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了Java中org.javarosa.form.api.FormEntryModel的典型用法代码示例。如果您正苦于以下问题:Java FormEntryModel类的具体用法?Java FormEntryModel怎么用?Java FormEntryModel使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。



FormEntryModel类属于org.javarosa.form.api包,在下文中一共展示了FormEntryModel类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Java代码示例。

示例1: FormInstanceValidator

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public FormInstanceValidator(InputStream formInput, InputStream instanceInput) throws Exception {
		theForm = XFormUtils.getFormFromInputStream(formInput);
		
		savedModel = XFormParser.restoreDataModel(instanceInput, null);
        TreeElement templateRoot = theForm.getInstance().getRoot().deepCopy(true);

        //sanity check instance names before loading
        if (!savedModel.getRoot().getName().equals(templateRoot.getName()) || savedModel.getRoot().getMult() != 0) {
			System.out.println("Instance model name does not match xform instance name.");
			System.out.println("Instance: " + savedModel.getName() + " Xform: " + templateRoot.getName());
			System.exit(1);
        }
        
        model = new FormEntryModel(theForm);
        controller = new FormEntryController(model);

        
        //Populate XForm Model 
//        TreeReference tr = TreeReference.rootRef();
//        tr.add(templateRoot.getName(), TreeReference.INDEX_UNBOUND);
//        templateRoot.populate(savedRoot, f);
//
//        f.getInstance().setRoot(templateRoot);
	}
 
开发者ID:medic,项目名称:javarosa,代码行数:25,代码来源:FormInstanceValidator.java


示例2: init

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public void init(){
	String xf_name = FORM_NAME; 			
	FileInputStream is;
	try {
		is = new FileInputStream(xf_name);
	} catch (FileNotFoundException e) {
		System.err.println("Error: the file '" + xf_name
				+ "' could not be found!");
		throw new RuntimeException("Error: the file '" + xf_name
				+ "' could not be found!");
	}
	
	// Parse the form
	xform = XFormUtils.getFormFromInputStream(is);
	
	femodel = new FormEntryModel(xform);
	fec = new FormEntryController(femodel);
	
	if( xform == null ) {
		System.out.println("\n\n==================================\nERROR: XForm has failed validation!!");
	} else {
	}
}
 
开发者ID:medic,项目名称:javarosa,代码行数:24,代码来源:FormParseInit.java


示例3: countUnansweredQuestions

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
/**
 * @param countRequiredOnly
 *            if true count only the questions that are unanswered and also
 *            required
 * @return number of unanswered questions
 */
public static int countUnansweredQuestions(FormEntryModel model, boolean countRequiredOnly) {
    //ctsims - Made this list only count relevant questions
    int counter = 0;

    for(FormIndex index = model.incrementIndex(FormIndex.createBeginningOfFormIndex());!index.isEndOfFormIndex();index = model.incrementIndex(index)) {
        if(!model.isIndexRelevant(index)) {
            continue;
        }

        if(model.getEvent(index) == FormEntryController.EVENT_QUESTION) {
            FormEntryPrompt prompt = model.getQuestionPrompt(index);
            if(prompt.getAnswerValue() == null) {
                if(!countRequiredOnly || prompt.isRequired()) {
                    counter++;
                }
            }
        }
    }

    return counter;
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:28,代码来源:FormSummaryController.java


示例4: countQuestionsToIndex

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
/**
 * @param model Form entry model to test index against
 * @return number of unanswered questions
 */

public static int countQuestionsToIndex(FormEntryModel model, FormIndex last) {
    //ctsims - Made this list only count relevant questions
    int counter = 0;

    for(FormIndex index = model.incrementIndex(FormIndex.createBeginningOfFormIndex());!index.equals(last);index = model.incrementIndex(index)) {
        if(!model.isIndexRelevant(index)) {
            continue;
        }

        if(model.getEvent(index) == FormEntryController.EVENT_QUESTION) {
            counter++;
        }
    }

    return counter;
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:22,代码来源:FormSummaryController.java


示例5: getWidget

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
/**
 * NOTE: Only applicable for Questions right now, not any other kind of IFormElement
 * @param questionIndex
 * @param form
 * @param initViewState
 * @return
 */
public ChatterboxWidget getWidget (FormIndex questionIndex, FormEntryModel model, int initViewState) {
    IWidgetStyle collapsedStyle = null;
    IWidgetStyleEditable expandedStyle = null;

    FormEntryPrompt prompt = model.getQuestionPrompt(questionIndex);

    int controlType = prompt.getControlType();
    int dataType = prompt.getDataType();

    String appearanceAttr = prompt.getAppearanceHint();

    collapsedStyle = new CollapsedWidget();
    ((CollapsedWidget)collapsedStyle).setSeekable(this.readOnly);

    expandedStyle = widgetFactory.getWidget(controlType,dataType,appearanceAttr);

    if (collapsedStyle == null || expandedStyle == null) {
        throw new IllegalStateException("No appropriate widget to render question");
    }

    expandedStyle.registerMultimediaController(mediaController);
    ChatterboxWidget widget = new ChatterboxWidget(cbox, prompt, initViewState, collapsedStyle, expandedStyle);
    prompt.register(widget);
    return widget;
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:33,代码来源:ChatterboxWidgetFactory.java


示例6: getRepeatJunctureWidget

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public ChatterboxWidget getRepeatJunctureWidget (FormIndex index, FormEntryModel model, Chatterbox cbox) {
    FormEntryCaption capt = model.getCaptionPrompt(index);
    Vector<String> choices = capt.getRepetitionsText();
    FormEntryCaption.RepeatOptions repopt = capt.getRepeatOptions();

    FakedFormEntryPrompt prompt = new FakedFormEntryPrompt(repopt.header, Constants.CONTROL_SELECT_ONE, Constants.DATATYPE_TEXT);
    for (int i = 0; i < choices.size(); i++) {
        prompt.addSelectChoice(new SelectChoice(null, choices.elementAt(i), "rep" + i, false));
    }

    if (repopt.add != null) {
        prompt.addSelectChoice(new SelectChoice(null, repopt.add, "new", false));
    }
    if (repopt.delete != null) {
        prompt.addSelectChoice(new SelectChoice(null, repopt.delete, "del", false));
    }
    prompt.addSelectChoice(new SelectChoice(null, repopt.done, "done", false));

    return new ChatterboxWidget(cbox, prompt, ChatterboxWidget.VIEW_EXPANDED, new CollapsedWidget(), new SelectOneEntryWidget(ChoiceGroup.EXCLUSIVE));
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:21,代码来源:ChatterboxWidgetFactory.java


示例7: setup

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public FormEntryController setup(InstanceInitializationFactory factory) {
    form.setEvaluationContext(getEC());

    form.initialize(true, factory, preferredLocale);

    if(recording) {
        session = new Session();
        currentStep = new Step();
    } else {
        currentStep = session.getSteps().elementAt(0);
    }

    FormEntryModel fem = new FormEntryModel(form);
    FormEntryController fec = FormEntryController.buildRecordingController(fem);

    return fec;
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:18,代码来源:XFormEnvironment.java


示例8: FormInstanceValidator

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public FormInstanceValidator(InputStream formInput, InputStream instanceInput) throws Exception {
        theForm = XFormUtils.getFormFromInputStream(formInput);

        savedModel = XFormParser.restoreDataModel(instanceInput, null);
        TreeElement templateRoot = theForm.getInstance().getRoot().deepCopy(true);

        //sanity check instance names before loading
        if (!savedModel.getRoot().getName().equals(templateRoot.getName()) || savedModel.getRoot().getMult() != 0) {
            System.out.println("Instance model name does not match xform instance name.");
            System.out.println("Instance: " + savedModel.getName() + " Xform: " + templateRoot.getName());
            System.exit(1);
        }

        model = new FormEntryModel(theForm);
        controller = new FormEntryController(model);


        //Populate XForm Model
//        TreeReference tr = TreeReference.rootRef();
//        tr.add(templateRoot.getName(), TreeReference.INDEX_UNBOUND);
//        templateRoot.populate(savedRoot, f);
//
//        f.getInstance().setRoot(templateRoot);
    }
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:25,代码来源:FormInstanceValidator.java


示例9: isXFormValid

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
protected StringBuilder isXFormValid(File xformFile) throws ParserConfigurationException, SAXException, IOException
{
	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	dBuilder.parse(xformFile);

	byte[] xformRawData = Files.readAllBytes(xformFile.toPath());
       ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xformRawData);
       FormDef formDef = XFormUtils.getFormFromInputStream(byteArrayInputStream);
       FormEntryModel formEntryModel = new FormEntryModel(formDef);
       StringBuilder fieldErrors = new StringBuilder();
       inspectFields(formEntryModel, formDef, fieldErrors);
	return fieldErrors;
}
 
开发者ID:benetech,项目名称:Secure-App-Generator,代码行数:15,代码来源:ObtainXFormController.java


示例10: validateUserAnswersOneAtATime

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public int validateUserAnswersOneAtATime() throws Exception {
    FormDef formDef = XFormUtils.getFormFromInputStream(new ByteArrayInputStream(getFormModel().getBytes("UTF-8")));
    FormEntryModel formEntryModel = new FormEntryModel(formDef);
    FormEntryController formEntryController = new FormEntryController(formEntryModel);
    TreeElement modelRootElement = formEntryController.getModel().getForm().getInstance().getRoot().deepCopy(true);
    TreeElement instanceRootElement = XFormParser.restoreDataModel(getFormInstance().getBytes("UTF-8"), null).getRoot();

    populateDataModel(modelRootElement);
    modelRootElement.populate(instanceRootElement, formEntryController.getModel().getForm());
    populateFormEntryControllerModel(formEntryController, modelRootElement);
    fixLanguageIusses(formEntryController);

    return createFieldSpecsFromXForms(formEntryController);
}
 
开发者ID:benetech,项目名称:Secure-App-Generator,代码行数:15,代码来源:OdkFormInstanceValidator.java


示例11: listQuestions

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private static void listQuestions (FormDef f, int indent, StringBuilder sb) {
		//using fec to walk through form (instead of old recursive algorithm)
		FormEntryModel femodel = new FormEntryModel(f);
		FormEntryController fec = new FormEntryController(femodel);
		fec.jumpToIndex(FormIndex.createBeginningOfFormIndex());
		IFormElement fe;
		do{
			fe = femodel.getCaptionPrompt().getFormElement();
			if(fe instanceof QuestionDef){
				listQuestion(f,(QuestionDef)fe,fec,indent,sb);
			}else if(fe instanceof GroupDef){
				if (listGroup(f, (GroupDef)fe, indent, sb)) {
					indent += 1;
				}
			}

		}while(fec.stepToNextEvent()!=fec.EVENT_END_OF_FORM);

		//Old Recursive Algorithm
//		if (fe instanceof QuestionDef) {
//			listQuestion(f, (QuestionDef)fe, indent, sb);
//		} else {
//			if (fe instanceof GroupDef) {
//				if (listGroup(f, (GroupDef)fe, indent, sb)) {
//					indent += 1;
//				}
//			}
//
//			for (int i = 0; i < fe.getChildren().size(); i++) {
//				listQuestions(f, fe.getChild(i), indent, sb);
//			}
//		}

	}
 
开发者ID:medic,项目名称:javarosa,代码行数:35,代码来源:FormOverview.java


示例12: listQuestion

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private static void listQuestion (FormDef f, QuestionDef q,FormEntryController fec, int indent, StringBuilder sb) {
	FormEntryModel femodel = fec.getModel();
	TreeElement instanceNode = getInstanceNode(f.getInstance(), q.getBind());
	String caption = "";
	FormEntryPrompt fep = femodel.getQuestionPrompt();
	caption = fep.getLongText();

	int type = instanceNode.getDataType();

	if (q.getControlType() != Constants.CONTROL_TRIGGER) {
		println(sb, indent, "Question: \"" + caption + "\"");
		println(sb, indent + 1, "Type: " + printType(type));
	} else {
		println(sb, indent, "Info: \"" + caption + "\"");
	}

	if (q.getControlType() == Constants.CONTROL_SELECT_ONE || q.getControlType() == Constants.CONTROL_SELECT_MULTI) {
		printChoices(f,q,fec, indent + 1, sb);
	}

	printProperty("relevant", f, instanceNode, indent + 1, sb);

	printProperty("required", f, instanceNode, indent + 1, sb);

	printProperty("readonly", f, instanceNode, indent + 1, sb);

	String defaultValue = printDefault(instanceNode);
	if (defaultValue != null) {
		println(sb, indent + 1, "Default: " + defaultValue);
	}

	if (instanceNode.getConstraint() != null) {
		println(sb, indent + 1, "Constraint: " + printCondition(instanceNode.getConstraint().constraint));
	}

	println(sb);
}
 
开发者ID:medic,项目名称:javarosa,代码行数:38,代码来源:FormOverview.java


示例13: printChoices

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private static void printChoices (FormDef f,QuestionDef q,FormEntryController fec,int indent, StringBuilder sb) {
		FormEntryModel femodel = fec.getModel();

		println(sb, indent, "Choices: " + q.getNumChoices());
//		for (int i = 0; i < q.getNumChoices(); i++) {
		for (SelectChoice choice : q.getChoices()){
			println(sb, indent + 1, "\"" + femodel.getQuestionPrompt().getSelectChoiceText(choice) + "\"");
		}
	}
 
开发者ID:medic,项目名称:javarosa,代码行数:10,代码来源:FormOverview.java


示例14: listGroup

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private static boolean listGroup (FormDef f, GroupDef g, int indent, StringBuilder sb) {
	FormEntryModel femodel = new FormEntryModel(f);
	boolean repeat = g.getRepeat();
	String caption = ExtUtil.nullIfEmpty(femodel.getCaptionPrompt().getLongText());
	TreeElement instanceNode = getInstanceNode(f.getInstance(), g.getBind());

	String relevant = printConditionalProperty("relevant", f, instanceNode);
	String readonly = printConditionalProperty("readonly", f, instanceNode);

	if (repeat || caption != null || (relevant != null || readonly != null)) {
		println(sb, indent, (repeat ? "Repeat" : "Group") + ":" + (caption != null ? " \"" + caption + "\"" : ""));

		if (relevant != null) {
			println(sb, indent + 1, relevant);
		}

		if (readonly != null) {
			println(sb, indent + 1, readonly);
		}

		println(sb);

		return true;
	} else {
		return false;
	}
}
 
开发者ID:medic,项目名称:javarosa,代码行数:28,代码来源:FormOverview.java


示例15: FormSummaryView

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public FormSummaryView(FormEntryModel model) {
    //#style View_All_Form
    super("Form Overview", List.IMPLICIT);
    this.model = model;
    createView();

    addCommand(CMD_EXIT);

    // TODO: handle readonly
    if (true) {
        addCommand(CMD_SAVE_EXIT);
    }
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:14,代码来源:FormSummaryView.java


示例16: putQuestion

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private void putQuestion (FormIndex questionIndex, boolean expanded, int qType) {
        ChatterboxWidget cw = null;

        if (!questionIndex.isInForm())
            return;

        if (expanded && qType != Q_NORMAL) {
            if (FormEntryModel.REPEAT_STRUCTURE_NON_LINEAR == model.getRepeatStructure()) {
                if (qType == Q_REPEAT_JUNCTURE) {
                    //TODO: make rollback work
//                    if (!forward && uncommittedRepeats.contains(questionIndex)) {
//                        controller.deleteRepeat(model.getForm().descendIntoRepeat(questionIndex, model.getRepetitions().size() - 1));
//                    }
                    uncommittedRepeats.removeElement(questionIndex);

                    cw = widgetFactory.getRepeatJunctureWidget(questionIndex, model, this);
                } else if (qType == Q_REPEAT_DELETE) {
                    cw = widgetFactory.getRepeatDeleteWidget(questionIndex, model, this);
                }
            } else {
                cw = widgetFactory.getNewRepeatWidget(questionIndex, model, this);
            }
            activeIsInterstitial = true;
        } else if (model.getForm().explodeIndex(questionIndex).lastElement() instanceof GroupDef) {
            //do nothing
        } else if (model.isIndexRelevant(questionIndex)) { //FIXME relevancy check
            cw = widgetFactory.getWidget(questionIndex, model,
                                          expanded ? ChatterboxWidget.VIEW_EXPANDED
                                                   : ChatterboxWidget.VIEW_COLLAPSED);
        }

        if (cw != null) {
            putFrame(cw, questionIndex);
        }
    }
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:36,代码来源:Chatterbox.java


示例17: getNewRepeatWidget

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public ChatterboxWidget getNewRepeatWidget (FormIndex index, FormEntryModel model, Chatterbox cbox) {
    //GroupDef repeat = (GroupDef)f.explodeIndex(index).lastElement();

    //damn linked lists...
    FormIndex end = index;
    while (!end.isTerminal()) {
        end = end.getNextLevel();
    }
    int multiplicity = end.getInstanceIndex();

    FormEntryCaption p = model.getCaptionPrompt(index);

    String label; //decide what text form to use.

    label = p.getLongText();
    if(label == null){
        label = p.getShortText();
    }

    String labelInner = (label == null || label.length() == 0 ? Localization.get("repeat.repitition") : label);

    String promptLabel = Localization.get((multiplicity > 0 ? "repeat.message.multiple" : "repeat.message.single"), new String[] {labelInner});

    FakedFormEntryPrompt prompt = new FakedFormEntryPrompt(promptLabel,
                                        Constants.CONTROL_SELECT_ONE, Constants.DATATYPE_TEXT);
    prompt.addSelectChoice(new SelectChoice(null,Localization.get("yes"), "y", false));
    prompt.addSelectChoice(new SelectChoice(null,Localization.get("no"), "n", false));

    return new ChatterboxWidget(cbox, prompt, ChatterboxWidget.VIEW_EXPANDED, new CollapsedWidget(), new SelectOneEntryWidget(ChoiceGroup.EXCLUSIVE));
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:31,代码来源:ChatterboxWidgetFactory.java


示例18: getRepeatDeleteWidget

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
public ChatterboxWidget getRepeatDeleteWidget (FormIndex index, FormEntryModel model, Chatterbox cbox) {
    FormEntryCaption capt = model.getCaptionPrompt(index);
    Vector<String> choices = capt.getRepetitionsText();

    FakedFormEntryPrompt prompt = new FakedFormEntryPrompt(capt.getRepeatOptions().delete_header, Constants.CONTROL_SELECT_ONE, Constants.DATATYPE_TEXT);
    for (int i = 0; i < choices.size(); i++) {
        prompt.addSelectChoice(new SelectChoice(null, choices.elementAt(i), "del" + i, false));
    }

    return new ChatterboxWidget(cbox, prompt, ChatterboxWidget.VIEW_EXPANDED, new CollapsedWidget(), new SelectOneEntryWidget(ChoiceGroup.EXCLUSIVE));
}
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:12,代码来源:ChatterboxWidgetFactory.java


示例19: getController

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
protected JrFormEntryController getController() {

        int formID = 1;

        Vector<IPreloadHandler> preloaders = JRFormTestUtil.getPreloaders();
        FormDefFetcher fetcher = new FormDefFetcher(new RMSRetreivalMethod(formID), preloaders, null, new InstanceInitializationFactory());
        FormDef form = fetcher.getFormDef();

        JrFormEntryController controller =  new JrFormEntryController(new JrFormEntryModel(form, false, FormEntryModel.REPEAT_STRUCTURE_NON_LINEAR));
        //controller.setView(new SingleQuestionView(controller));
        controller.setView(new Chatterbox("Chatterbox", controller));
        return controller;
    }
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:14,代码来源:JRFormTestState.java


示例20: listQuestions

import org.javarosa.form.api.FormEntryModel; //导入依赖的package包/类
private static void listQuestions (FormDef f, int indent, StringBuffer sb) {
        //using fec to walk through form (instead of old recursive algorithm)
        FormEntryModel femodel = new FormEntryModel(f);
        FormEntryController fec = new FormEntryController(femodel);
        fec.jumpToIndex(FormIndex.createBeginningOfFormIndex());
        IFormElement fe;
        do{
            fe = femodel.getCaptionPrompt().getFormElement();
            if(fe instanceof QuestionDef){
                listQuestion(f,(QuestionDef)fe,fec,indent,sb);
            }else if(fe instanceof GroupDef){
                if (listGroup(f, (GroupDef)fe, indent, sb)) {
                    indent += 1;
                }
            }

        }while(fec.stepToNextEvent()!=FormEntryController.EVENT_END_OF_FORM);

        //Old Recursive Algorithm
//        if (fe instanceof QuestionDef) {
//            listQuestion(f, (QuestionDef)fe, indent, sb);
//        } else {
//            if (fe instanceof GroupDef) {
//                if (listGroup(f, (GroupDef)fe, indent, sb)) {
//                    indent += 1;
//                }
//            }
//
//            for (int i = 0; i < fe.getChildren().size(); i++) {
//                listQuestions(f, fe.getChild(i), indent, sb);
//            }
//        }

    }
 
开发者ID:dimagi,项目名称:commcare-j2me,代码行数:35,代码来源:FormOverview.java



注:本文中的org.javarosa.form.api.FormEntryModel类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Java ActionFilterChain类代码示例发布时间:2022-05-22
下一篇:
Java MuteInfo类代码示例发布时间:2022-05-22
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap