重庆做学校网站公司最好的优化公司
2025/12/29 3:11:38 网站建设 项目流程
重庆做学校网站公司,最好的优化公司,视频网站前台怎么做,怎么做网站的图片集光 - 智能笔记应用 #x1f4f1; 应用简介 集光是一款专为HarmonyOS生态设计的智能笔记应用#xff0c;提供安全、高效、美观的笔记管理体验。应用集成了华为账号服务#xff0c;支持多种笔记编辑功能#xff0c;让您的创意和想法得到完美记录。 ✨ 核心特性 #x…集光 - 智能笔记应用 应用简介集光是一款专为HarmonyOS生态设计的智能笔记应用提供安全、高效、美观的笔记管理体验。应用集成了华为账号服务支持多种笔记编辑功能让您的创意和想法得到完美记录。✨ 核心特性 安全可靠生物识别解锁支持指纹、面部识别等生物认证手势密码自定义手势密码保护隐私内容应用锁为整个应用提供额外的安全保护 强大编辑富文本编辑支持文字样式、颜色、大小等格式设置多媒体支持插入图片、截图丰富笔记内容智能排版自动优化文本布局提升阅读体验️ 智能管理分类管理创建、编辑、删除笔记分类搜索功能快速定位所需笔记内容多种视图列表视图和卡片视图自由切换排序方式按创建时间、修改时间灵活排序 个性化体验夜间模式护眼模式适合夜间使用主题切换支持明暗主题自动切换多选操作批量管理笔记提高效率️ 技术架构模块化设计集光 ├── 主应用模块 (product/phone) ├── 公共组件 (components) │ ├── 应用密码设置 (secretlock) │ ├── 富文本编辑器 (richeditor) │ ├── 用户登录 (login) │ ├── 意见反馈 (feed_back) │ └── 应用更新检测 (check_app_update) └── 公共工具 (common) ├── 数据源管理 (datasource) └── 工具类库 (utils)核心技术HarmonyOS 5.0原生HarmonyOS应用开发ArkTS现代化的应用开发语言Stage模型新一代应用开发模型 快速开始环境要求DevEco Studio 5.0.3 Release 及以上HarmonyOS SDK 5.0.3 Release 及以上支持设备华为手机包括双折叠和阔折叠系统版本HarmonyOS 5.0.3(15) 及以上安装配置克隆项目gitclone[项目地址]cdJiGaung配置华为账号服务在AppGallery Connect创建应用配置Client ID到product/phone/src/main/module.json5申请quickLoginMobilePhone权限应用签名进行手工签名配置添加证书公钥指纹运行应用连接调试设备选择Run Run ‘phone’“或Run Debug ‘phone’” 主要功能首页功能笔记展示支持列表和卡片两种展示模式分类管理创建、编辑、删除笔记分类搜索笔记快速查找笔记内容多选操作长按多选批量管理排序功能按时间排序方便查找笔记编辑富文本编辑支持文字格式、颜色、大小设置图片插入支持本地图片和截图插入撤销重做操作历史记录支持撤销重做内容分享支持笔记内容分享到其他应用自动保存实时保存防止内容丢失个人中心用户信息华为账号一键登录头像昵称管理回收站删除笔记恢复彻底删除功能隐私设置生物识别、手势密码等安全设置应用设置夜间模式、通知设置、版本检测意见反馈问题反馈帮助改进应用 开发指南组件使用如需单独使用某个组件请参考对应组件的使用指导组件描述使用指导secretlock应用密码设置使用指导richeditor富文本编辑器使用指导login用户登录使用指导feed_back意见反馈使用指导自定义开发修改AppScope/app.json5中的bundleName调整AppScope/resources/base/element/string.json中的应用名称根据需要修改主题色彩和样式 系统设计与实现说明本节面向希望深入学习和二开的开发者按“从需求到实现”的顺序介绍集光的整体架构、核心业务流程以及关键模块的实现思路。1. 整体架构概览UIAbility 入口层EntryAbility.ets作为应用入口负责初始化主题控制器ThemeController同步系统深浅色模式初始化窗口尺寸写入AppStorage供 UI 自适配含折叠屏断点适配WindowUtil.registerBreakPoint初始化数据库调用DatabaseManager.instance.initDatabase()创建和迁移数据表配置状态栏、导航栏、通知授权等系统级能力。页面与导航层MainPage.ets作为主页面使用Tabs Navigation构建四个核心 TabPictureView图片集NotesView笔记集本项目核心ToDoView待办集MineView我的通过NavPathStack实现页面栈导航如从NotesView跳转到EditNotes。业务页面层NotesView.ets笔记列表页负责分类筛选、多选操作、置顶、排序等EditNotes.ets笔记编辑页集成富文本编辑器、背景色、分享/复制等能力其它如EditCategory.ets、SearchPage.ets等负责辅助业务。组件与服务层公共组件在components/下richeditor富文本编辑器组件与相关数据模型secretlock手势锁、应用锁逻辑login华为账号登录feed_back意见反馈check_app_update检查应用更新。公共工具在common/datasource数据库访问、实体与服务NoteService/CategoryService等utilsGlobalInfoModel、AppUtil、WindowUtil等工具与全局状态。数据存储层使用ohos.data.relationalStore构建notes.dbDatabaseManager.ets负责数据库初始化、迁移和默认数据插入。整体上可理解为UIAbility入口 → MainPageTab 容器 → 各业务页面Notes / EditNotes 等 → 业务服务层NoteService / CategoryService → DatabaseManagerRdbStore2. 数据模型与数据库设计数据库通过DatabaseManager管理使用 RDB 存储数据数据库配置名称notes.db安全级别SecurityLevel.S1主要表结构categories表分类id TEXT PRIMARY KEY分类 ID含特殊 ID-1 全部笔记-2 未分类笔记name TEXT分类名称totalCount INTEGER该分类下笔记数量用于快速展示计数。notes表笔记id TEXT PRIMARY KEY笔记 IDtitle TEXT标题categoryId TEXT所属分类 IDcontent TEXT纯文本内容styledContent TEXT富文本内容通过StyleSerializer序列化的 JSON 字符串description TEXT用于卡片预览的摘要createTime / updateTime TEXT创建/更新时间isPinned INTEGER是否置顶backgroundColor TEXT笔记卡片/详情背景颜色importance INTEGER重要度等级isDeleted INTEGER是否进入回收站。自动迁移逻辑DatabaseManager.migrateDatabase()使用PRAGMA table_info(notes)查询列信息若缺少某个列如isPinned/backgroundColor/importance/styledContent/isDeleted则通过ALTER TABLE动态新增这样既支持老版本平滑升级又避免手工 SQL 迁移出错。默认分类初始化initDefaultCategories()保证若不存在id -1则插入“全部笔记”若不存在id -2则插入“未分类笔记”。关键实现示例节选自DatabaseManager.etsexportclassDatabaseManager{privatestatic_instance:DatabaseManager;privaterdbStore:relationalStore.RdbStore|nullnull;privatereadonlySTORE_CONFIG:relationalStore.StoreConfig{name:notes.db,securityLevel:relationalStore.SecurityLevel.S1};asyncinitDatabase():Promisevoid{constcontextgetContext(this);this.rdbStoreawaitrelationalStore.getRdbStore(context,this.STORE_CONFIG);awaitthis.createTables();awaitthis.migrateDatabase();}privateasynccreateTables():Promisevoid{if(!this.rdbStore)return;constcategoryTableSqlCREATE TABLE IF NOT EXISTS categories ( id TEXT PRIMARY KEY, name TEXT NOT NULL, totalCount INTEGER DEFAULT 0 );constnoteTableSqlCREATE TABLE IF NOT EXISTS notes ( id TEXT PRIMARY KEY, title TEXT, categoryId TEXT, content TEXT, styledContent TEXT, description TEXT, createTime TEXT, updateTime TEXT, isPinned INTEGER DEFAULT 0, backgroundColor TEXT DEFAULT #fefefe, importance INTEGER DEFAULT 0, isDeleted INTEGER DEFAULT 0, FOREIGN KEY (categoryId) REFERENCES categories (id) );awaitthis.rdbStore.executeSql(categoryTableSql);awaitthis.rdbStore.executeSql(noteTableSql);awaitthis.migrateDatabase();awaitthis.initDefaultCategories();}privateasyncmigrateDatabase():Promisevoid{if(!this.rdbStore)return;constresultSetawaitthis.rdbStore.querySql(PRAGMA table_info(notes));lethasIsPinnedColumnfalse;// 省略其它列检查...if(resultSetresultSet.rowCount0){while(awaitresultSet.goToNextRow()){constcolumnNameawaitresultSet.getString(1);if(columnNameisPinned){hasIsPinnedColumntrue;}// 根据实际名称检查 backgroundColor / importance / styledContent / isDeleted 等}}if(!hasIsPinnedColumn){awaitthis.rdbStore.executeSql(ALTER TABLE notes ADD COLUMN isPinned INTEGER DEFAULT 0);}// 同理为其它字段做 ALTER TABLE}privateasyncinitDefaultCategories():Promisevoid{if(!this.rdbStore)return;constallNotesCountResultawaitthis.rdbStore.querySql(SELECT COUNT(*) as count FROM categories WHERE id ?,[-1]);// 若不存在“全部笔记”则插入默认分类// ...}}3. 首页与笔记列表NotesView实现思路3.1 MainPageTab 容器使用TabsTabContent实现四个子页面图片集、笔记集、待办集、我的自定义tabBarBuilder绘制底部图标和文字通过curIndex控制当前选中 Tab使用GlobalInfoModel与各页面共享刷新方法例如当切换到“笔记集”Tab 时调用globalInfo.refreshNotesView()强制 NotesView 刷新数据当切换到“图片集”Tab 时调用globalInfo.refreshPictureView()刷新图片数据。这种设计的好处是Tab 之间无需强耦合统一通过GlobalInfoModel进行“跨页面刷新”通信。3.2 NotesView笔记列表核心逻辑NotesView.ets是笔记模块的核心列表页面主要职责业务服务依赖NoteService提供笔记增删改查CategoryService管理分类与计数SortController管理排序字段与顺序NoteSearchController管理搜索关键字与结果SelectedController管理多选状态SettingController应用设置相关如通知授权。本地状态管理Local noteList: Note[]当前列表中的笔记Local dataList: LazyDataSourceNote用于懒加载/瀑布流展示的数据源Local categoryList: ArrayCategory分类列表Local showListType: SHOW_METHOD_ENUM列表/卡片等展示方式。生命周期逻辑aboutToAppear重置多选状态selectedController.recoverInitState()若开启手势锁则跳转至DrawLock页面重置搜索关键字获取默认分类getFirstCategory()根据当前分类、排序、搜索条件获取笔记noteService.getNoteList(...)初始化所有笔记的选中状态noteService.initSelectedState()遍历所有分类并统计每个分类的笔记数量refreshAllCategoryNoteCounts调用updateDataList()同步noteList到dataList将refreshNotesView方法挂到GlobalInfoModel供外部刷新调用。刷新逻辑refreshData重新读取当前分类下笔记并更新noteList若不在多选模式重置选中状态调用forceRefreshUI()清空并重建dataList通过notifyDataChange触发 UI 刷新重新统计分类计数保证分类弹窗中的数量与实际一致。多选与置顶等交互通过SelectedController记录选中 ID 集合与计数长按进入多选模式handleLangPress“全选”、“取消全选”、批量删除/移动/置顶都基于selectedIds实现。关键实现示例MainPageTab 切换与跨页面刷新节选自MainPage.etsEntry ComponentV2 struct MainPage{Local curIndex:number0;Provider(appPathStack)appPathStack:NavPathStacknewNavPathStack();Local globalInfo:GlobalInfoModelAppStorageV2.connectGlobalInfoModel(GlobalInfoModel,()newGlobalInfoModel())!;build(){Navigation(this.appPathStack){Column(){Tabs({barPosition:BarPosition.End,index:this.curIndex}){TabContent(){PictureView();}.tabBar(this.tabBarBuilder(0));TabContent(){NotesView();}.tabBar(this.tabBarBuilder(1));TabContent(){ToDoView();}.tabBar(this.tabBarBuilder(2));TabContent(){MineView();}.tabBar(this.tabBarBuilder(3));}.onChange((index:number){this.curIndexindex;if(index1this.globalInfo.refreshNotesView){setTimeout(()this.globalInfo.refreshNotesViewthis.globalInfo.refreshNotesView(),100);}if(index0this.globalInfo.refreshPictureView){setTimeout(()this.globalInfo.refreshPictureViewthis.globalInfo.refreshPictureView(),100);}})}}}}NotesView初始化与刷新逻辑节选自NotesView.etsComponentV2exportstruct NotesView{noteService:NoteServiceNoteService.instance;categoryService:CategoryServiceCategoryService.instance;// ... 省略其它依赖Local noteList:Note[][];Local dataList:LazyDataSourceNotenewLazyDataSource();asyncaboutToAppear():Promisevoid{this.selectedController.recoverInitState();if(this.secretLock.gesture){constparams:Recordstring,Object{fromEntrance:true,appPathStack:this.appPathStack};this.appPathStack.pushPathByName(DrawLock,params);}this.noteSearchController.searchKeyword;this.currentCategoryawaitthis.categoryService.getFirstCategory();this.noteListawaitthis.noteService.getNoteList(this.currentCategory.id,this.sortController.sortBy,this.noteSearchController.searchKeyword);this.noteService.initSelectedState();constallNotesawaitthis.noteService.getNoteList(-1);constcategoryNotesMapnewMapstring,Note[]();for(constcategoryofawaitthis.categoryService.getCategoryList()){if(category.id!-1){constcategoryNotesawaitthis.noteService.getNoteList(category.id);categoryNotesMap.set(category.id,categoryNotes);}}awaitthis.categoryService.refreshAllCategoryNoteCounts(allNotes,categoryNotesMap);this.categoryListawaitthis.categoryService.getCategoryList();this.updateDataList();this.updateNoteCount();this.syncSelectedState();this.globalInfo.refreshNotesViewthis.refreshData.bind(this);}asyncrefreshData():Promisevoid{this.noteListawaitthis.noteService.getNoteList(this.currentCategory.id,this.sortController.sortBy,this.noteSearchController.searchKeyword);if(!this.selectedController.isCtrl){this.noteService.initSelectedState();}this.forceRefreshUI();this.updateNoteCount();this.syncSelectedState();}privateforceRefreshUI():void{this.dataList.clear();this.dataList.notifyDataChange(0);setTimeout((){this.noteList.forEach((item:Note)this.dataList.pushData(item));this.dataList.notifyDataChange(0);},0);}}4. 笔记编辑EditNotes 富文本编辑器实现思路4.1 富文本编辑器组件富文本编辑器封装在components/richeditor中对外通过Index.ets提供RichEditorController编辑器控制器负责光标、选区、历史记录撤销/重做和当前样式状态RichEditorArea真正的富文本输入区域组件Note/LazyDataSourceNote等数据模型StyleSerializer负责将样式加粗、斜体、下划线、阴影、对齐方式等序列化到字符串并在读取时反序列化回枚举和结构体。样式持久化编辑器内部维护MutableStyledString记录每段文本的样式保存时将MutableStyledString通过StyleSerializer转为 JSON 字符串存入notes.styledContent读取时反序列化回MutableStyledString然后调用RichEditorController.restoreStateFromStyledString恢复光标位置、当前样式按钮状态等。4.2 EditNotes 页面结构EditNotes.ets是笔记编辑的核心页面关键成员包括核心依赖RichEditorController单例控制器跨页面持有编辑状态SnapShotController用于对当前笔记区域截图分享NoteService保存/更新笔记数据ThemeController感知深浅色模式GlobalInfoModel用于在保存笔记后通知NotesView刷新数据。本地状态Local currentNote: Note当前正在编辑的笔记对象Local noteTitle: string标题输入内容Local selectedBackgroundColor: string当前笔记背景色Local lightModeColors[] / darkModeColors[]深浅色模式下可选背景色列表Local isEditNote: boolean标记是“新建”还是“编辑已有笔记”。键盘与主题适配aboutToAppear中将KeyboardAvoidMode设置为RESIZE_WITH_CARET避免软键盘遮挡输入区域根据ThemeController.currentColorMode设置默认背景色启动定时器轮询主题变化若系统从浅色切到深色会自动切换一组更适合阅读的背景色。工具栏与更多操作toolBar()中提供撤销/重做/保存 等基础操作moreFunctionMenu()中提供分享通过SnapShotController.onceSnapshot()截图当前笔记区域复制通过UnifiedData SystemPasteboard将富文本转为纯文本复制到系统剪贴板。保存流程简化版用户点击工具栏中的“保存”图标调用saveNote()将编辑器中的内容序列化为content/styledContent/description若为新笔记生成id与createTime并插入数据库若为编辑已有笔记更新数据库记录包括description确保列表卡片实时更新摘要保存成功后关闭键盘与编辑状态controller.stopEditing()将RichEditorController.showMoreFunction设置为true显示更多功能菜单通知NotesView刷新列表结束编辑状态并返回。关键实现示例节选自EditNotes.etsComponentV2 struct EditNotes{richEditorController:RichEditorControllerRichEditorController.instance;noteService:NoteServiceNoteService.instance;Local currentNote:NotenewNote(newMutableStyledString());Local noteTitle:string;Local isEditNote:booleanfalse;Local selectedBackgroundColor:string#fefefe;asyncsaveNote():Promiseboolean{letstyledStringthis.richEditorController.controller.getStyledString();letcontentstyledString.getString();// 新建且内容和标题都为空时不保存if(contentthis.noteTitle){returnthis.isEditNote?false:true;}if(this.isEditNote){this.currentNote.updateContent(styledString,this.noteTitle,undefined,this.selectedBackgroundColor);awaitthis.noteService.updateNote(this.currentNote);}else{this.currentNote.titlethis.noteTitle;this.currentNote.styledStringstyledString;this.currentNote.descriptionstyledString.getString();this.currentNote.backgroundColorthis.selectedBackgroundColor;awaitthis.noteService.addNote(this.currentNote);this.isEditNotetrue;}if(this.globalInfothis.globalInfo.refreshNotesView){this.globalInfo.refreshNotesView();}returntrue;}build(){NavDestination(){Column(){RichEditorArea({noteTitle:this.currentNote.title,noteContent:this.currentNote.styledString,snapShotController:this.snapShotController,titleChange:(title:string){this.noteTitletitle;}})}.backgroundColor(this.selectedBackgroundColor);}.menus(this.toolBar());}}5. 安全与隐私SecretLock 等SecretLock组件负责应用级安全手势密码解锁在进入NotesView时如果检测到已设置手势密码则通过appPathStack.pushPathByName(DrawLock, params)先进入手势解锁页面解锁成功后才允许继续访问笔记内容。生物识别解锁指纹/人脸也可以与secretlock联动在应用启动或从后台回到前台时进行校验。6. 典型业务流程串联6.1 应用启动 → 显示主页系统启动EntryAbilityonCreate中初始化主题、数据库onWindowStageCreate中注册折叠屏断点设置状态栏/导航栏属性windowStage.loadContent(pages/MainPage)加载MainPageMainPage构建 Tabs默认显示第一个 Tab图片集用户可切换到“笔记集”。6.2 进入笔记列表 NotesView用户点击“笔记集”TabcurIndex 1NotesView.aboutToAppear执行若开启手势锁则跳转到手势解锁页面加载当前分类下的笔记列表同步分类计数初始化dataList触发 UI 渲染将refreshNotesView注册到全局便于其它页面保存后刷新列表。6.3 新建 / 编辑笔记在NotesView点击“新建笔记”或笔记卡片导航到EditNotesEditNotes.aboutToAppear配置键盘避让、主题模式、背景色等用户使用富文本工具栏编辑内容加粗、斜体、下划线、阴影、对齐方式等点击“保存”将样式序列化为styledContent写入/更新notes表中的记录通知NotesView刷新列表结束编辑状态并返回。7. 二开与扩展建议如果你希望在本项目基础上做二次开发可以参考以下思路增加字段在notes表中新增字段例如标签、提醒时间等在DatabaseManager.migrateDatabase()中按现有模式检测并ALTER TABLE保持向后兼容在Note模型与NoteService中补充对应字段的读写逻辑。扩展富文本能力在richeditor组件中增加新的样式例如高亮、引用块等更新StyleSerializer的序列化/反序列化逻辑在EditNotes的工具栏中增加对应的按钮和交互。增加云同步/多端能力在NoteService层增加与云端的同步逻辑基于华为云或自建服务建议保持本地 RDB 为“真源”云端做备份与协同避免弱网络导致编辑卡顿。自定义安全策略扩展secretlock支持更多解锁策略如时间锁、地理位置锁等在EntryAbility.onForeground/NotesView.aboutToAppear中按需插入校验逻辑。通过阅读本节并结合对应的源码文件EntryAbility.ets、MainPage.ets、NotesView.ets、EditNotes.ets、DatabaseManager.ets、components/richeditor等你可以较为系统地掌握集光项目的整体设计思路并在此基础上快速完成功能扩展或二次开发。 开源协议本项目采用 Apache 2.0 开源协议欢迎贡献代码和提出建议。集光- 让记录更智能让创意更闪耀 ✨

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询