wordpress建网站缺点/宁波企业seo外包

wordpress建网站缺点,宁波企业seo外包,一个网站绑定多个域名 卖域名,怎么建立自己的销售平台目录: 1、三层架构项目结构1.0、三层架构简介1.1、 common层(主要放一些公共的资源等)1.2、 features层(主要模块定义的组件以及图片等静态资源)1.3、 products层(主要放主页面层和一些主要的资源&#xff…

目录:

    • 1、三层架构项目结构
      • 1.0、三层架构简介
      • 1.1、 common层(主要放一些公共的资源等)
      • 1.2、 features层(主要模块定义的组件以及图片等静态资源)
      • 1.3、 products层(主要放主页面层和一些主要的资源,内部快速入门,课程学习,知识地图等都是模块放在features层)
      • 1.4、MVVM模式
    • 2、products主页面
      • Index.ets
    • 3、快速入门模块
      • QuickStartPage.ets
      • Banner.ets
      • bufferToString.ets
      • BannerClass.ets
      • EnablementView.ets
      • TutorialView.ets
      • ArticleClass.ets
      • ArticleDetailPage.ets
    • 4、课程学习模块
      • CourseLearning.ets
    • 5、知识地图模块
      • KnowledgeMap.ets
      • NavBarItem.ets
      • KnowledgeMapContent.ets

1、三层架构项目结构

在这里插入图片描述
这里新建三个文件夹不是模块,来构建鸿蒙项目的三层架构。

1.0、三层架构简介

在这里插入图片描述

1.1、 common层(主要放一些公共的资源等)

在这里插入图片描述

1.2、 features层(主要模块定义的组件以及图片等静态资源)

在这里插入图片描述

1.3、 products层(主要放主页面层和一些主要的资源,内部快速入门,课程学习,知识地图等都是模块放在features层)

在这里插入图片描述

1.4、MVVM模式

在这里插入图片描述
在这里插入图片描述

2、products主页面

这里放置的都是一些跟主页面相关的以及入口文件等。

在这里插入图片描述

Index.ets

import { CourseLearning } from '@ohos/learning';
import { KnowledgeMap } from '@ohos/map';
import { QuickStartPage } from '@ohos/quickstart';@Entry
@Component
struct Index {@State currentIndex: number = 0;private tabsController: TabsController = new TabsController();@BuildertabBarBuilder(title: string, targetIndex: number, selectedIcon: Resource, unselectIcon: Resource) {Column() {Image(this.currentIndex === targetIndex ? selectedIcon : unselectIcon).width(24).height(24)Text(title).fontFamily('HarmonyHeiTi-Medium').fontSize(10).fontColor(this.currentIndex === targetIndex ? '#0A59F7' : 'rgba(0,0,0,0.60)').textAlign(TextAlign.Center).lineHeight(14).fontWeight(500)}.width('100%').height('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).onClick(() => {this.currentIndex = targetIndex;this.tabsController.changeIndex(targetIndex);})}build() {//控制导航栏方向。根据设计图,导航页签栏位于应用界面的底部,我们可以通过Tabs组件的barPosition参数进行设置,当设置barPosition为BarPosition.End时,页签栏会位于应用界面的下方进行显示Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {TabContent() {QuickStartPage()}.tabBar(this.tabBarBuilder('快速入门', 0, $r('app.media.ic_01_on'), $r('app.media.ic_01_off')))TabContent() {CourseLearning()}.tabBar(this.tabBarBuilder('课程学习', 1, $r('app.media.ic_02_on'), $r('app.media.ic_02_off')))TabContent() {KnowledgeMap()}.tabBar(this.tabBarBuilder('知识地图', 2, $r('app.media.ic_03_on'), $r('app.media.ic_03_off')))}.vertical(false).divider({strokeWidth: 0.5,color: '#0D182431'}).scrollable(false).backgroundColor('#F1F3F5').padding({ top: 36, bottom: 28 })}
}

以前导出模块都是在各模块index.ets文件下导出,现在是products依赖feature模块,在oh-package.json5中如下配置即可引入相关依赖。

在这里插入图片描述
在module.json5中进行权限配置(这里其他模块需要的权限都在products中的这个配置文件中配置即可)。

在这里插入图片描述

3、快速入门模块

在这里插入图片描述

QuickStartPage.ets

import { TutorialView } from '../view/TutorialView';
import { ArticleClass } from '../model/ArticleClass'
import { ArticleDetailPage } from './ArticleDetailPage';
import { Banner } from '../view/Banner';
import { EnablementView } from '../view/EnablementView';
import { BannerDetailPage } from './BannerDetailPage';
import { BannerClass } from '../model/BannerClass';@Component
export struct QuickStartPage {@State message: string = '快速入门';@Provide('articlePathStack') articlePathStack: NavPathStack = new NavPathStack();@BuilderquickStartRouter(name: string, param?: ArticleClass | BannerClass) {if (name === 'articleDetail') {ArticleDetailPage()} else if (name === 'bannerDetailPage') {BannerDetailPage()}}build() {Navigation(this.articlePathStack) {Column() {Text(this.message).fontSize(24).fontWeight(700).width('100%').textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily('HarmonyHeiTi-Bold').lineHeight(33)//此处采用Scroll作为外层容器,是由于其内部内容很有可能会超过屏幕高度,为保证内容显示,可以采用Scroll组件来进行滚动显示。scrollBar设置为BarState.Off,表示关闭滚动时的滚动条显示Scroll() {Column() {//轮播图广告组件Banner()//赋能组件EnablementView()//入门教程TutorialView()}}.layoutWeight(1).scrollBar(BarState.Off).align(Alignment.TopStart)}.width('100%').height('100%').backgroundColor('#F1F3F5')}.navDestination(this.quickStartRouter).hideTitleBar(true).mode(NavigationMode.Stack)}
}

Banner.ets

import { BannerClass } from '../model/BannerClass';
import { bufferToString } from '../util/BufferUtil';@Component
export struct Banner {//相信大家还记得,完成了Navigation导航首页的内容开发,接下来就要切到Navigation非首页里进行操作,首先,我们在Banner文件中使用@Consume拿到路由栈,这样才能使用相关的功能@Consume('articlePathStack') articlePathStack: NavPathStack;@State bannerList: BannerClass[] = [];aboutToAppear(): void {//在组件初始化时就加载数据this.getBannerDataFromJSON()}//在Banner中,定义一个方法getBannerDataFromJson,并通过ResourceManager获取当前工程目录下rawfile中的json文件内容。//转换内容需要两个步骤://1、将获取的buffer内容转换为字符串//2、将字符串转换为页面数据结构//因为预览器并不支持获取rawfile目录下的文件,所以无法成功获取到保存在rawfile目录下的json文件里的内容。请用真机/模拟器测试,预览器仅支持简单页面的预览getBannerDataFromJSON() {getContext(this).resourceManager.getRawFileContent('BannerData.json').then(value => {this.bannerList = JSON.parse(bufferToString(value)) as BannerClass[];})}clickToDetailPage(item: BannerClass) {//让我们为每个Banner的图片添加一个点击事件,当点击Banner时,使用路由栈提供的pushPathByName方法,并提供url作为路由参数this.articlePathStack.pushPathByName('bannerDetailPage', item);}build() {//Swiper组件作为容器可以使轮播图具有轮播的效果Swiper() {ForEach(this.bannerList, (item: BannerClass) => {//$r("字符串类型的")Image($r(item.imageSrc)).objectFit(ImageFit.Contain) //保持宽高比进行缩小或者放大.width('100%').borderRadius(16).padding({ top: 11, left: 16, right: 16 }).onClick(() => {this.clickToDetailPage(item)})}, (item: BannerClass) => item.id)}//autoPlay控制是否自动轮播子组件,loop属性控制是否循环播放,indicator属性自定义导航点的位置和样式.autoPlay(true).loop(true).indicator(new DotIndicator().color('#1a000000').selectedColor('#0A59F7'))}
}

bufferToString.ets

import { util } from '@kit.ArkTS';
//由于ResourceManager获取到的是Uint8Array类型的内容,所以需要将对应的内容转换为字符串,并将字符串解析为对应的数据结构。考虑到其他的文件也会使用这个公共方法,可以新建一个util文件夹,并创建一个BufferUtil文件,实现这个字符串转换方法
export function bufferToString(buffer: Uint8Array): string {let textDecoder = util.TextDecoder.create('utf-8', {ignoreBOM: true});let resultPut = textDecoder.decodeToString(buffer);return resultPut;
}

BannerClass.ets

export class BannerClass {id: string = '';imageSrc: string = '';url: string = ''constructor(id: string, imageSrc: string, url: string) {this.id = idthis.imageSrc = imageSrc;this.url = url;}
}

EnablementView.ets

import { ArticleClass } from '../model/ArticleClass';
import { bufferToString } from '../util/BufferUtil';@Component
export struct EnablementView {@State enablementList: ArticleClass[] = [];@Consume('articlePathStack') articlePathStack: NavPathStack;aboutToAppear(): void {----------this.getEnablementDataFromJSON()}getEnablementDataFromJSON() {getContext(this).resourceManager.getRawFileContent('EnablementData.json').then(value => {this.enablementList = JSON.parse(bufferToString(value)) as ArticleClass[];})}build() {Column() {Text('赋能套件').fontColor('#182431').fontSize(16).fontWeight(500).fontFamily('HarmonyHeiTi-medium').textAlign(TextAlign.Start).padding({ left: 16, right: 16 }).width('100%')Grid() {ForEach(this.enablementList, (item: ArticleClass) => {GridItem() {EnablementItem({ enablementItem: item }).onClick(() => {this.articlePathStack.pushPathByName('articleDetail', item)})}}, (item: ArticleClass) => item.id)}.rowsTemplate('1fr').columnsGap(8).scrollBar(BarState.Off).height(169).padding({ top: 2, left: 16, right: 16 })}.margin({ top: 18 })}
}@Component
export struct EnablementItem {@Prop enablementItem: ArticleClass;build() {Column() {Image($r(this.enablementItem.imageSrc)).width('100%')//设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界.objectFit(ImageFit.Cover).height(96).borderRadius({topLeft: 16,topRight: 16})Text(this.enablementItem.title).height(19).width('100%').fontSize(14).textAlign(TextAlign.Start)//textOverFlow属性设置文本超长时的显示方式,在这里我们设置它的值为Ellipsis,表示超长时使用省略号替代.textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(1).fontWeight(400).padding({ left: 12, right: 12 }).margin({ top: 8 })Text(this.enablementItem.brief).height(32).width('100%').fontSize(12).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(2).fontWeight(400).fontColor('rgba(0, 0, 0, 0.6)').padding({ left: 12, right: 12 }).margin({ top: 2 })}.width(160).height(169).borderRadius(16).backgroundColor(Color.White)}
}

TutorialView.ets

import { bufferToString } from '../util/BufferUtil';
import { ArticleClass } from '../model/ArticleClass';@Component
export struct TutorialView {@State tutorialList: ArticleClass[] = [];@Consume('articlePathStack') articlePathStack: NavPathStack;aboutToAppear(): void {this.getTutorialDataFromJSON()}getTutorialDataFromJSON() {getContext(this).resourceManager.getRawFileContent('TutorialData.json').then(value => {this.tutorialList = JSON.parse(bufferToString(value)) as ArticleClass[];})}build() {Column() {Text('入门教程').fontColor('#182431').fontSize(16).fontWeight(500).fontFamily('HarmonyHeiTi-medium').textAlign(TextAlign.Start).padding({ left: 16, right: 16 }).width('100%')List({ space: 12 }) {ForEach(this.tutorialList, (item: ArticleClass) => {ListItem() {TutorialItem({ tutorialItem: item }).onClick(() => {this.articlePathStack.pushPathByName('articleDetail', item)})}}, (item: ArticleClass) => item.id)}.scrollBar(BarState.Off).padding({ left: 16, right: 16 })}.margin({ top: 18 }).alignItems(HorizontalAlign.Start)}
}@Component
export struct TutorialItem {@Prop tutorialItem: ArticleClass;build() {Row() {Column() {Text(this.tutorialItem.title).height(19).width('100%').fontSize(14).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(1).fontWeight(400).margin({ top: 4 })Text(this.tutorialItem.brief).height(32).width('100%').fontSize(12).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(2).fontWeight(400).fontColor('rgba(0, 0, 0, 0.6)').margin({ top: 5 })}.height('100%')//设置layoutWeight属性,取值为1,表示它们在任意尺寸的设备下自适应占满剩余空间.layoutWeight(1).alignItems(HorizontalAlign.Start).margin({ right: 12 })Image($r(this.tutorialItem.imageSrc)).objectFit(ImageFit.Cover).height(64).width(108).borderRadius(16)}.width('100%').height(88).borderRadius(16).backgroundColor(Color.White).padding(12).alignItems(VerticalAlign.Top)}
}

ArticleClass.ets

export class ArticleClass {id: string = '';imageSrc: string = '';title: string = '';brief: string = '';webUrl: string = '';constructor(id: string, imageSrc: string, title: string, brief: string, webUrl: string) {this.id = id;this.imageSrc = imageSrc;this.title = title;this.brief = brief;this.webUrl = webUrl;}
} 

ArticleDetailPage.ets

import { webview } from '@kit.ArkWeb';
import { ArticleClass } from '../model/ArticleClass'@Component
export struct ArticleDetailPage {@State webviewController: webview.WebviewController = new webview.WebviewController;@Consume('articlePathStack') articlePathStack: NavPathStack;//在其中进行数据结构的定义,该页面在之后会接收到一个ArticleClass类型的数据,由于之后会使用路由栈进行传参所以此处使用@State进行定义@State articleDetail: ArticleClass | null = null;aboutToAppear(): void {this.articleDetail = this.articlePathStack.getParamByName('articleDetail')[0] as ArticleClass;}build() {NavDestination() {Column() {Row() {Row() {Image($r('app.media.ic_back')).width(40).height(40).onClick(() => {//使用路由栈的pop方法来实现页面返回this.articlePathStack.pop()})Row() {Text(this.articleDetail?.title).fontFamily('HarmonyHeiTi-Bold').fontSize(20).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(1).fontWeight(700).margin({ left: 8 })}}.width('80%')}.justifyContent(FlexAlign.SpaceBetween).width('100%').height(56)WebComponent({ articleDetail: this.articleDetail, webviewController: this.webviewController })}.padding({ left: 16, right: 16 }).width('100%').height('100%').justifyContent(FlexAlign.SpaceBetween)}.hideTitleBar(true)}
}@Component
struct WebComponent {@Prop articleDetail: ArticleClass | null;@Prop webviewController: WebviewController;build() {Column() {Web({ src: this.articleDetail?.webUrl, controller: this.webviewController }).darkMode(WebDarkMode.Auto).domStorageAccess(true).zoomAccess(true).fileAccess(true).mixedMode(MixedMode.All).cacheMode(CacheMode.None).javaScriptAccess(true).width('100%').layoutWeight(1)}}
}

4、课程学习模块

在这里插入图片描述

CourseLearning.ets

import { webview } from '@kit.ArkWeb';@Component
export struct CourseLearning {//创建webviewController,开发者后续可以通过该Controller控制Web组件加载的界面private webviewController: webview.WebviewController = new webview.WebviewController();build() {Column() {//加载本地界面,修改Web组件的src属性,使用$rawfile加载刚刚放入rawfile目录下的course_learning资源Web({ src: $rawfile('course_learning/index.html'), controller: this.webviewController })//设置domStorageAccess属性,开启文档对象模型存储接口权限.domStorageAccess(true)}}
}

5、知识地图模块

在这里插入图片描述

KnowledgeMap.ets

import { KnowledgeMapContent, Section } from '../view/KnowledgeMapContent';
import { NavBarItem, NavBarItemType } from '../view/NavBarItem';
import { BusinessError } from '@kit.BasicServicesKit';
import { util } from '@kit.ArkTS';@Component
export struct KnowledgeMap {@State navBarList: NavBarItemType[] = [{ order: '01', title: '准备与学习' },{ order: '02', title: '构建应用' },{ order: '03', title: '应用测试' },{ order: '04', title: '上架' },{ order: '05', title: '运营增长' },{ order: '06', title: '商业变现' },{ order: '07', title: '更多' }];//在KnowledgeMap页面中定义路由栈。我们通过创建NavPathStack实例并定义为@Provide类型的状态变量来进行路由栈的定义。Navigation有属于自己的路由栈,可以用于路由的前进、回退、路由历史记录的保存、路由参数的保存与获取。所以首先我们需要创建一个路由栈。//注意此处采用@Provide的方式进行定义,由于之后会将该路由栈的数据传递给跳转后的后代组件,为了方便后代组件的获取,所以此处采用了@Provide的方式进行定义。@Provide('knowledgeMapPageStack') knowledgeMapPageStack: NavPathStack = new NavPathStack();@State currentNavBarIndex: number = -1;@State sections: Section[] = [];private getSections() {try {getContext(this).resourceManager.getRawFileContent("MapData.json", (error: BusinessError, value: Uint8Array) => {const textDecoder = util.TextDecoder.create("utf-8");const res = textDecoder.decodeWithStream(value, { stream: false });this.sections = JSON.parse(res);});} catch (error) {console.error(`callback getRawFileContent failed, error is ${JSON.stringify(error)}`)}}
//在KnowledgeMap组件内定义getSections函数,使用util类来实现将json文件转化为前端数据。具体实现参考右侧代码。最终将getSections函数放入组件的aboutToAppear生命周期内,创建自定义组件的新实例后可执行getSections函数aboutToAppear(): void {this.getSections();}@BuilderPageMap(name: string) {if (name === 'KnowledgeMapContent') {KnowledgeMapContent({ section: this.sections[this.currentNavBarIndex] });}}build() {//绑定路由栈到Navigation组件Navigation(this.knowledgeMapPageStack) {Scroll() {Column() {Text('知识地图').fontFamily('HarmonyHeiTi-Bold').fontSize(24).fontColor(Color.Black).textAlign(TextAlign.Start).lineHeight(33).fontWeight(700).width('100%')Image($r("app.media.knowledge_map_banner")).width('100%').borderRadius(16).margin({ top: 19, bottom: 8 })Text('通过循序渐进的学习路径,无经验和有经验的开发者都可以轻松掌握ArkTS语言声明式开发范式,体验更简洁、更友好的HarmonyOS应用开发旅程。').fontFamily('HarmonyHeiTi').fontSize('14vp').fontColor('rgba(0,0,0,0.60)').fontWeight(400).textAlign(TextAlign.Start)List({ space: 12 }) {ForEach(this.navBarList, (item: NavBarItemType, index: number) => {ListItem() {NavBarItem({ navBarItem: item, currentNavBarIndex: this.currentNavBarIndex })}.width('100%')}, (item: NavBarItemType): string => item.title)}.width('100%').margin({ top: 24 })}.padding({top: 12,right: 16,bottom: 12,left: 16})}.backgroundColor('#F1F3F5').align(Alignment.TopStart)//此处添加constraintSize并设置minHeight为100%,可以解决当内容条数不足时,Scroll组件滚动时会出现空白区域的错误效果.constraintSize({ minHeight: '100%' }).scrollable(ScrollDirection.Vertical).scrollBar(BarState.Auto).scrollBarColor(Color.Gray)//edgeEffect用于设置边缘滑动效果,设置为EdgeEffect.Spring表示设置为弹性物理动效。该效果滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹.edgeEffect(EdgeEffect.Spring)}//控制导航栏显示模式。可以通过Navigation的mode属性控制导航栏的显示模式,该属性支持以下的取值://将mode属性为NavigationMode.Auto,为自适应模式,即当设备宽度大于520vp时,Navigation组件采用分栏模式,反之采用单页面模式。//将mode属性设置为NavigationMode.Stack,Navigation组件即可设置为单页面显示模式。//将mode属性设置为NavigationMode.Split,Navigation组件即可设置为分栏显示模式。//结合之前的效果图,在手机设备上为单页面显示模式,所以我们设置mode属性并传入NavigationMode.Stack参数。.mode(NavigationMode.Stack).hideTitleBar(true)//关联NavDestination组件与Navigation组件。我们需要关联NavDestination组件与Navigation组件,才能在Navigation组件中使用页面名称的方式来进行组件路由。具体的关联方式为使用Navigation的navDestination属性,该属性支持传入一个自定义构建函数,我们可以使用之前定义的PageMap来作为参数传入。.navDestination(this.PageMap).navBarWidth(288)}
}

NavBarItem.ets

export interface NavBarItemType {order: string,title: string
}@Component
export struct NavBarItem {@Consume('knowledgeMapPageStack') knowledgeMapPageStack: NavPathStack;//由于此处只需要单向的从外部获得参数并进行渲染,后续将改为@Prop;@State是双向的@Prop navBarItem: NavBarItemType;@Link currentNavBarIndex: number;build() {Row() {Text(this.navBarItem.order).margin({ right: 6 }).fontFamily('HarmonyHeiTi-Bold').fontSize(21).fontColor('#182431').textAlign(TextAlign.Start).lineHeight(22).fontWeight(700)Text(this.navBarItem.title).fontFamily('HarmonyHeiTi-Medium').fontSize(16).fontColor('#182431').textAlign(TextAlign.Start).lineHeight(22).fontWeight(500)Blank()Image($r('app.media.ic_arrow')).width(12).height(24)}.width('100%').height(48).borderRadius(16).alignItems(VerticalAlign.Center).padding({ left: 12, right: 12 }).backgroundColor(this.currentNavBarIndex === Number(this.navBarItem.order) - 1 ?'#1A0A59F7' :Color.Transparent).onClick(() => {const index = Number(this.navBarItem.order) - 1;this.currentNavBarIndex = index;//实现路由跳转。通过自定义导航条的点击事件实现路由Navigation组件的跳转。首先通过@Consume获取到祖代组件传递过来的路由栈数据,然后使用该路由栈实现路由的跳转,Navigation支持的跳转方式主要有两种,分别为push的方式与replace的方式。//pushPath()/pushPathByName():根据传入的参数将参数对应的NavDestination页面信息入栈。//replacePath()/replacePathByName():将当前页面栈栈顶退出,再根据传入参数将对应的NavDestination页面信息入栈。//现在给NavBar加上点击事件用于路由跳转,根据需求,此处采用replacePath的方式,该方法需要传入一个NavPathInfo类型的对象,可以包含路由的页面名称,携带的参数等信息,此处只需要用到路由名称。this.knowledgeMapPageStack.replacePath({ name: 'KnowledgeMapContent' });})}
}

在这里插入图片描述

KnowledgeMapContent.ets

interface KnowledgeBaseItem {type: string,title: string
}interface Material {subtitle: string,knowledgeBase: KnowledgeBaseItem[]
}export interface Section {title: string,brief: string,materials: Material[]
}
//定义类型与图标的映射。此时图标已经放入media目录下,我们需要考虑如何设计来映射type与图标。可以使用Record类型来进行映射,也可以使用Map进行映射,此处采用Record类型
const TypeMapIcon: Record<string, string> = {'指南': 'app.media.ic_guide','准备': 'app.media.ic_prepare','学习与获取证书': 'app.media.ic_medals','视频教程': 'app.media.ic_video',
}@Component
export struct KnowledgeMapContent {@Prop section: Section;scroller: Scroller = new Scroller();@BuilderKnowledgeBlockLine(knowledgeBaseItem: KnowledgeBaseItem) {Row() {Image($r(TypeMapIcon[knowledgeBaseItem.type])).width(20).height(20)Column() {Text(knowledgeBaseItem.title).fontFamily('HarmonyHeiTi-Medium').fontSize(16).fontWeight(500)Text(knowledgeBaseItem.type).fontFamily('HarmonyHeiTi').fontSize(14).fontWeight(400)}//Column组件容器的alignItems属性默认为HorizontalAlign.Center。这里我们要实现起始端对齐的效果,因此这里的属性参数设定为HorizontalAlign.Start.alignItems(HorizontalAlign.Start).margin({ left: 18 })Blank()Image($r('app.media.ic_arrow')).width(12).height(24)}.width('100%').height(64).alignItems(VerticalAlign.Center)}@BuilderKnowledgeBlock(material: Material) {Column() {Text(material.subtitle).fontFamily('HarmonyHeiTi-Medium').fontSize(14).fontWeight(500).margin({ bottom: 8 })List({ space: 12 }) {ForEach(material.knowledgeBase, (item: KnowledgeBaseItem, index: number) => {this.KnowledgeBlockLine(item)}, (item: KnowledgeBaseItem, index: number) => item.title + index)}.backgroundColor(Color.White).borderRadius(16).padding({ left: 12, right: 12 }).divider({strokeWidth: 0.5,startMargin: 38,endMargin: 0,color: '#F2F2F2'})}.width('100%').margin({ top: 28 }).alignItems(HorizontalAlign.Start)}build() {NavDestination() {Scroll(this.scroller) {Column() {Text(this.section?.title).fontFamily('HarmonyHeiTi-Bold').fontSize(20).fontWeight(700).fontColor(Color.Black)Text(this.section?.brief).fontFamily('HarmonyHeiTi').fontSize(12).fontColor('rgba(0,0,0,0.60)').textAlign(TextAlign.JUSTIFY).fontWeight(400).margin({ top: 12 })ForEach(this.section?.materials, (material: Material) => {this.KnowledgeBlock(material)}, (material: Material, index: number) => material.subtitle + index)}.padding({left: 24,top: 12,right: 24,bottom: 12}).alignItems(HorizontalAlign.Start)}.align(Alignment.TopStart).constraintSize({ minHeight: '100%' }).edgeEffect(EdgeEffect.Spring).scrollable(ScrollDirection.Vertical).scrollBar(BarState.Auto).backgroundColor('#F1F3F5')}//在组件路由导航中,内容区都需要使用NavDestination组件进行包裹,否则会导致点击后内容区为白屏,所以需要在features/map/src/main/ets/view/KnowledgeMapContent.ets文件中build函数内最外层添加一层NavDestination组件,同样的,在数据驱动UI更新小节中我们已经自定义了标题栏,可以关闭NavDestination默认的标题栏(hideTitleBar)。.hideTitleBar(true)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETL中的实用功能以及数据集成方式

在企业数字化转型的进程中&#xff0c;数据集成扮演着至关重要的角色。它不仅是实现信息流动和系统协同的关键步骤&#xff0c;更是提升企业运营效率和决策能力的核心驱动力。ETL&#xff08;Extract&#xff0c;Transform&#xff0c;Load&#xff09;作为数据集成的重要工具&…

基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等

基于SpringbootTypst的PDF生成方案&#xff0c;适用于报告打印/标签打印/二维码打印等。 仅提供后端实现 Typst2pdf-for-report/label/QR code github 环境 JDK11linux/windows/mac 应用场景 适用于定制化的报告模板/标签/条码/二维码等信息的pdf生成方案。通过浏览器的p…

简述下npm,cnpm,yarn和pnpm的区别,以及跟在后面的-g,--save, --save-dev代表着什么

文章目录 前言一、npm&#xff0c;cnpm&#xff0c;yarn和pnpm的基本介绍和特点1.npm (Node Package Manager)2. Yarn3. cnpm (China npm)4. pnpm 二、简述npm和pnpm 的存储方式和依赖数1.存储方式2.依赖树 三、两者依赖树的差异导致结果的对比四、简单说说-g&#xff0c;--sav…

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…

如何搭建一个安全经济适用的TRS交易平台?

TRS&#xff08;总收益互换&#xff09;一种多方参与的投资方式&#xff0c;也是绝对收益互换&#xff08;total return swap&#xff09;的一种形式。 它是一种衍生合约&#xff0c;是一种金融衍生品的合约&#xff0c;是指交易双方在协议期间将参照资产的总收益转移给信用保…

SpringMVC(四)Restful软件架构风格

目录 ​编辑 API接口设计的架构风格 一 Dao层实现&#xff08;处理数据库&#xff09; 二 Sercice层实现&#xff08;处理业务逻辑&#xff09; 三 Controller层&#xff08;处理http请求&#xff09; 四 补充知识点 1 PathVariable - 路径变量 2 CrossOrigin(Origins …

Docker搭建MySQL主从服务器

一、在主机上创建MySQL配置文件——my.cnf master服务器配置文件路径&#xff1a;/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服务器配置文件路径&#xff1a; /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服务配置文件内容 …

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl属性为true (我这项目创…

Linux中安装Git

安装Git 安装git&#xff0c;我们可以使用yum指令在线安装&#xff0c;这里&#xff0c;我们先对yum做一个简单介绍。 执行下面命令 #查看可用的git安装包 yum list git #安装git yum install -y git 查看git安装包 安装git 验证是否安装成功 安装完毕之后&#xff0c;我们…

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…

Linux上的`i2c-tools`工具集的详细介绍;并利用它操作IMX6ULL的I2C控制器进而控制芯片AP3216C读取光照值和距离值

IC-Tools 工具集介绍 i2c-tools 是 Linux 下用于 IC 设备调试 的用户空间工具集(你也可以把它看成是一个库&#xff0c;类似于之前自己用过的触摸屏库tslib库、FreeType矢量字符库)&#xff0c;它提供了一系列命令行工具&#xff0c;可以扫描、读取、写入 IC 设备&#xff0c;…

Windows 部署 RuoYi 前后端分离项目

目录 ruoyi-vue部署 ruoyi源码类型 若依官方地址 RuoYi-Vue 前后端分离版 环境 工具 windows开发环境 jdk安装 (安装位置默认) 双击点击安装 步骤 耐心等待加载完毕&#xff0c;路径默认 等待安装完成即可 快速打开文件资源管理器 进入高级系统设置 系统属性&#…

《C语言中的ASCII码表:解锁字符与数字的桥梁》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、什么是ASCII码表&#xff1f;二、ASCII码表的结构1. 控制字符&#xff08;0-31 和 127&#xff09;2. 可打印字符&#xff08;32-126&#xff09; 三、完…

一、初始 Linux

文章目录 一、操作系统概述二、Linux 初识1. Linux 的组成2. Linux 发行版 三、远程链接 Linux 系统1. 四、WSL (windows subsystem for linux)1. 什么是 WSL2. 如何下载 WSL3. 安装不同的 Linux 发行版4. 启动停止使用指定发行版5. 卸载与备份6. 文件共享7. 命令混用8. 用 vsc…

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0&#xff0c;其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用&#xff1a;系数 A、B、C 构成的向量 (…

C/C++蓝桥杯算法真题打卡(Day6)

一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一&#xff1a;算法代码&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;方便编程 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用…

如何在 GoLand 中设置默认项目文件夹

在使用 GoLand 进行开发时&#xff0c;设置一个默认的项目文件夹可以大大提高工作效率。默认项目文件夹会在你打开或新建项目时自动预选&#xff0c;避免每次都需要手动导航到目标目录。本文将详细介绍如何在 GoLand 中设置默认项目文件夹。 步骤一&#xff1a;打开系统设置 …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

Java基础与集合

参考 Java基础知识详解&#xff1a;从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 基础知识 java概述 什么是java&#xff1f; java是一种面向对象的编程语言 java特点 面向对象&#xff08;继承&#…

【R语言】二项分布,正态分布,极大似然估计实现

二项分布 生成二项分布概率 s <- 0:60 prob <- dbinom(s, size 60, prob 1/6)s <- 0:60&#xff1a;生成 0 到 60 之间的整数&#xff0c;表示可能的成功次数。 dbinom(s, size 60, prob 1/6)dbinom(x, size, prob) 计算二项分布的概率质量函数&#xff08;PMF…