基于AppGallery Connect云数据库实现的课程表项目。
软件要求
DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。
HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。
项目结构解读
- common: CourseCommon 有关课程表的常量
- database: Yun 云数据库设置信息和方法
- entryability: EntryAbility 应用入口
- entrybackupability: EntryBackupAbility 应用数据备份和恢复的一个扩展功能。
- model: CourseDatamodel 课程表单实例
- pages: Index 主页面; MeetingDetail 预约界面;
- utils: Colors 生成不同的颜色
- view: AddDialog 添加课程弹窗组件; ClassDetailLayout 课程具体信息组件; ClassTestLayout 考试具体信息组件; ScheduleLayout 课程表组件; StatusLayout 课程表添加、修改和删除按钮组件; UpdateDialog 修改课程弹窗组件;
- viewModel: Course 课程表逻辑类; YunCourseSchedules 课程表实体类;
云数据库设置
https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-sdk-integration-harmonyosts-0000001626112738
- 确认应用包名和AGC云平台的包名一致
- “存储区名称”为“test”。
- 添加YunCourseSchedules对象范例
- 按照要求设置脚色权限注:一样平常开发中不推荐对所有人授予upsert和delete权限,此处仅用于跳过认证登录步骤演示云数据库添加和删除数据,将所有人均授予upsert和delete权限。
- 下载app-schema.json、YunCourseSchedules.js和agconnect-services.json文件并且放到对应位置YunCourseSchedules放到entry/ets/viewModel目录下
app-schema.json放到entry/ets目录下
agconnect-services.json放到AppScope/resources/rawfile目录下(rawfile文件须要创建)
- 在entry下的oh-package.json5文件里面添加SDK依赖。
- 在Entryability中的onCreate里面初始化SDK
- 确保你的存储区和对象范例与你在AGC云平台上面创建的存储区和对象范例保持一致
按照具体教程和部分教程讲解,实现自己的云数据库。
应用权限
- 网络权限(在entry/src/main/module.json5文件里面添加)
部分代码展示解读:
Course
- position(coursesData:YunCourseSchedules[][]){
- let x=13
- let position:YunCourseSchedules[]=[]
- let allposition:YunCourseSchedules[][]=[]
- let exactnum:number[]=[] //精确每个课是第几节开始上的
- let num:number[]=[]
- let selectweekcourseLessons :number[][] = [] //每个星期所有课程是第几节课上课
- let courseDuration:number[]=[]//课程时长
- for (let index = 0; index < 7; index++) {
- for (let y = 0; y < coursesData[index].length; y++) {
- x-=coursesData[index][y].courseDuration
- num.push(coursesData[index][y].courseLessons)
- exactnum.push(coursesData[index][y].courseLessons)
- courseDuration.push(coursesData[index][y].courseDuration)
- }
- selectweekcourseLessons.push(num)
- console.log(TAG+JSON.stringify(CourseCommon.TABLEWEEK[index])+" 剩余空数量" + JSON.stringify(x));
- console.log(TAG+JSON.stringify(CourseCommon.TABLEWEEK[index])+" 第几节开始上:" + JSON.stringify(exactnum));
- console.log(TAG+JSON.stringify(CourseCommon.TABLEWEEK[index])+" 课程时长:" + JSON.stringify(courseDuration));
- // 精确课程位置
- let s=0
- for (let y = 0; y < exactnum.length; y++){
- if (exactnum[y]+courseDuration[y]>=exactnum[y+1]){
- exactnum[y+1]=exactnum[y]+1-s
- }
- if (exactnum[y]+courseDuration[y]<exactnum[y+1]){
- exactnum[y+1]=exactnum[y+1]-courseDuration[y]+1-s
- }
- s=courseDuration[y]+s-1 //去掉之前的课程时长
- }
- for (let z = 0; z < x+exactnum.length; z++) {
- position.push(new YunCourseSchedules())
- }
- for(let z = 0;z<exactnum.length;z++){
- position[exactnum[z]-1]=coursesData[index][z]
- }
- console.log(TAG,"position:" + JSON.stringify(position));
- allposition.push(position) //所有课程位置
- // 重置相关变量为下一天做准备
- position=[]
- exactnum=[]
- num=[]
- courseDuration=[]
- x=13
- }
- CourseDatamodel.getContext().setSelectWeekCourseLessons(selectweekcourseLessons)
- console.log( "ScheduleLayout"+JSON.stringify(selectweekcourseLessons));
- return allposition
- }
复制代码 这段代码是Course里面定义的一个名为position的函数,它重要的功能是基于传入的课程数据(二维数组形式,按星期维度构造)来确定每门课程在每天中的具体位置安排,同时还会纪录一些和课程相关的信息,比如每门课程在星期几是从第几节课开始上、课程时长等,并终极返回所有课程位置信息的二维数组。
Yun
- async addorupdate(className:string,teacher:string,place:string,people:number,courseDuration:number,content:string,classroomtype:number,id:number): Promise<boolean>{
- try {
- if (className!=''&&teacher!=''&&place!=''&&content!='') {
- let ison = false
- //判断添加的时长有没有占用其他课程的位置和有没有超出最大时间槽
- for (let index = 0; index <= CourseDatamodel.getContext()
- .getSelectWeekCourseLessons()[CourseDatamodel.getContext().getselectWeek()]
- .length; index++) {
- //判断当前日期为不为空
- if (CourseDatamodel.getContext()
- .getSelectWeekCourseLessons()[CourseDatamodel.getContext().getselectWeek()]
- .length != 0) {
- //排在其中一个课程的前面
- if (CourseDatamodel.getContext().getIndex() < CourseDatamodel.getContext()
- .getSelectWeekCourseLessons()[CourseDatamodel.getContext().getselectWeek()][index]) {
- if (courseDuration + CourseDatamodel.getContext().getIndex() - 1 >= 13 ||
- courseDuration + CourseDatamodel.getContext().getIndex() - 1 >= CourseDatamodel.getContext()
- .getSelectWeekCourseLessons()[CourseDatamodel.getContext().getselectWeek()][index]) {
- ison = false
- break
- } else {
- ison = true
- break
- }
- }
- //排在所有课程后面
- if (index == CourseDatamodel.getContext()
- .getSelectWeekCourseLessons()[CourseDatamodel.getContext().getselectWeek()]
- .length) {
- if (courseDuration + CourseDatamodel.getContext().getIndex() - 1 <= 13) {
- ison = true
- break
- } else {
- ison = false
- break
- }
- }
- } else {
- if (courseDuration + CourseDatamodel.getContext().getIndex() - 1 <= 13) {
- ison = true
- break
- } else {
- ison = false
- break
- }
- }
- }
- if (ison == true) {
- const courseSchedules = new YunCourseSchedules()
- if (id != 0) {
- courseSchedules.setId(id)
- }
- courseSchedules.setClassName(className)
- courseSchedules.setTeacher(teacher)
- courseSchedules.setClassroom(place)
- courseSchedules.setPeople(content)
- courseSchedules.setPeople(people)
- courseSchedules.setCourseDuration(courseDuration)
- courseSchedules.setIntroduction(content)
- courseSchedules.setColor(Colors.creatcolors())
- courseSchedules.setClassroomtype(classroomtype)
- courseSchedules.setWeek(CourseDatamodel.getContext().getWeek())
- courseSchedules.setCourseLessons(CourseDatamodel.getContext().getIndex())
- await this.database.upsert(courseSchedules)
- console.log(this.TAG, "添加数据成功");
- promptAction.showToast({
- message: '添加成功',
- duration: 2000,
- });
- return true
- } else {
- AlertDialog.show({
- title: "警告",
- message: '添加失败,时长过长'
- })
- console.log(this.TAG, "添加数据失败", "原因:时长过长");
- return false
- }
- }else {
- AlertDialog.show({
- title:"警告",
- message:'不能为空'
- })
- console.error(this.TAG,"添加数据失败");
- return false
- }
-
- } catch (e) {
- AlertDialog.show({
- title:"警告",
- message:'添加失败'
- })
- console.error(this.TAG,"添加数据失败","原因:",JSON.stringify(e));
- return false
- }
- }
复制代码 这段代码是Yun里面的一个异步函数,功能重要是向云数据库中添加或更新课程相关的数据。在添加或更新之前,会举行一系列的验证,包括判断各项须要信息是否为空以及要添加课程的时长是否公道(是否会与已有课程辩论、是否超出最大时间限制等),根据验证结果决定是否执行现实的添加或更新操作到云数据库中,并返回相应的成功或失败状态。
结果展示:
主页面:
添加弹窗:
修改弹窗:
删除弹窗:
预约界面:
结语
以上就是云数据库开发课程表项目的开发思路和过程
最后感兴趣的小同伴也可以从gitee仓库中下载源码
https://gitee.com/AaBbBbbbqazxsw/CurriculumProjectDemo
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |