鸿蒙NEXT开发-学生管理系统小案例(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

目录

1. 基本介绍

2. 案例设计图

2.1 app应用

2.2 登录页

2.3 首页

2.4 添加/编辑页面

3. 项目结构

4. 案例实现源码

4.1 首先创建一个工程,然后将一些图片资源放在资源下面

2. 将AppScope下面的信息修改

3. 修改module.json5文件

4. 创建models目录,创建Student.ets文件

5. 创建conponents目录,,然后新增如下两个组件

6. 创建params目录,新增PageRouterParam.ets文件

7. 创建utils目录,新增RdbUtil.ets文件

8. 在pages目录下面新增三个页面

9. 修改EntryAbility.ets文件

4. 学习地址


1. 基本介绍

本案例涉及到多个鸿蒙相关技术知识点:

1、布局

2、配置文件

3、组件的封装和使用

4、路由的使用

5、应用数据持久化-关系型数据库的使用

鸿蒙学习交流

qq群号:767465523

2. 案例设计图

2.1 app应用

2.2 登录页

2.3 首页

2.4 添加/编辑页面

3. 项目结构

4. 案例实现源码

注意源码地址:

study_manage: 基于鸿蒙NEXT API12稳定版实现的一款学生管理系统项目案例。本案例涉及到多个鸿蒙相关技术知识点:1、布局2、配置文件3、组件的封装和使用4、路由的使用5、应用数据持久化-关系型数据库的使用

4.1 首先创建一个工程,然后将一些图片资源放在资源下面

icon.png

login.png

login_background.png

system.png

title.png

4.2 将AppScope下面的信息修改

4.3 修改module.json5文件

4.4 创建models目录,创建Student.ets文件

/**
 * 学生信息
 */
export default interface  Student {
  /**
   * 学生id
   */
  id: number
  /**
   * 学生名称
   */
  username: string
  /**
   * 年龄
   */
  age: number
  /**
   * 爱好
   */
  like: string
}

4.5 创建conponents目录,,然后新增如下两个组件

/**
 * 学生列表组件
 */
import Student from '../models/Student'
import { promptAction, router } from '@kit.ArkUI'
import PageRouterParam from '../params/PageRouterParam'
import RdbUtil from '../utils/RdbUtil'
import { BusinessError } from '@kit.BasicServicesKit'


@Component
  export default struct StudentListComponent {
    @Link
    studentList: Student[]

    // 删除数据
    remove(id: number) {
      RdbUtil.deleteById(id)
        .then((param) => {
          console.log('remove student data success:' + param)
          promptAction.showToast({
            message: '删除数据成功'
          })
          router.replaceUrl({ url: 'pages/Index' })
        }).catch((err: BusinessError) => {
          console.log('remove student data fail:' + err)
          promptAction.showToast({
            message: '删除数据失败'
          })
        })
    }

    build() {
      Column() {
        // 数据标题
        Row() {
          Text('编号')
            .TextStyle()
          Text('姓名')
            .TextStyle()
          Text('年龄')
            .TextStyle()
          Text('爱好')
            .TextStyle()
          Text('操作')
            .TextStyle()
            .width('25%')

        }
        .width('100%')
          .height(50)
          .justifyContent(FlexAlign.SpaceAround)
          .margin({ left: 20 })

        // 学生数据
        List({ space: 20 }) {
          ForEach(this.studentList, (item: Student) => {
            ListItem() {
              Row() {
                Text(item.id.toString())
                  .TextStyle()
                Text(item.username)
                  .TextStyle()
                Text(item.age.toString())
                  .TextStyle()
                Text(item.like)
                  .TextStyle()

                Text('编辑')
                  .TextStyle()
                  .fontColor(Color.Blue)
                  .onClick(() => {
                    router.pushUrl({
                      url: 'pages/Register',
                      params: new PageRouterParam('欢迎来到编辑学生界面', '确认修改', item.id)
                    })
                  })

                Text('删除')
                  .TextStyle()
                  .fontColor(Color.Red)
                  .margin({ right: 10 })
                  .onClick(() => {
                    // 删除弹窗
                    AlertDialog.show(
                      {
                        title: '删除学生信息', // 标题
                        message: '是否需要删除所选学生信息?', // 内容
                        autoCancel: false, // 点击遮障层时,是否关闭弹窗。
                        alignment: DialogAlignment.Bottom, // 弹窗在竖直方向的对齐方式
                        offset: { dx: 0, dy: -20 }, // 弹窗相对alignment位置的偏移量
                        primaryButton: {
                          value: '取消',
                          action: () => {
                            console.info('Callback when the first button is clicked');
                          }
                        },
                        secondaryButton: {
                          value: '删除',
                          fontColor: '#D94838',
                          action: () => {
                            // 删除学生信息
                            this.remove(item.id)

                          }
                          },
                      cancel: () => { // 点击遮障层关闭dialog时的回调
                        console.info('Closed callbacks');
                      }
                    }
                  )

                })
            }
            .width('100%')
            .height(50)
            .justifyContent(FlexAlign.SpaceAround)
            .margin({ left: 20 })
            .backgroundColor(Color.White)
            .borderRadius(20)

          }
        }, (item: Student) => item.id.toString())
      }
    }.height('500')
  }
}

@Extend(Text)
function TextStyle() {
  .lineHeight(20)
  .fontWeight(400)
  .fontSize(15)
}

4.6 创建params目录,新增PageRouterParam.ets文件

/**
 * 页面路由参数
 */
export default class PageRouterParam {
  registerName: string = ''
  buttonName: string = ''
  studentId: number = 0

  constructor(registerName: string, buttonName: string, studentId: number) {
    this.registerName = registerName
    this.buttonName = buttonName
    this.studentId = studentId
  }
}

4.7 创建utils目录,新增RdbUtil.ets文件

import relationalStore from '@ohos.data.relationalStore';
import Student from '../models/Student';
import { BusinessError } from '@ohos.base';

/**
 * 关系型数据库工具类
 */
export default class RdbUtil {
  /**
   * 数据库对象
   */
  private static rdbStore: relationalStore.RdbStore;

  static setStore(store: relationalStore.RdbStore) {
    RdbUtil.rdbStore = store;
  }

  static getStore(): relationalStore.RdbStore {
    return RdbUtil.rdbStore;
  }

  /**
   * 执行sql
   * @param sql
   * @returns
   */
  static executeSql(sql: string): Promise<void> {
    return RdbUtil.getStore().executeSql(sql);
  }

  /**
   * 插入数据
   * @param tableName
   * @param data
   * @returns
   */
  static insert(tableName: string, data: relationalStore.ValuesBucket): Promise<number> {
    return RdbUtil.getStore().insert(tableName, data);
  }

  /**
   * 查询数据
   * @returns
   */
  static queryAll(): Promise<Array<Student>> {
    let predicates = new relationalStore.RdbPredicates('STUDENT');
    return new Promise<Array<Student>>((resolve, reject) => {
      RdbUtil.getStore().query(predicates).then((result) => {
        let students = new Array<Student>();
        while (result.goToNextRow()) {
          students.push({
            id: result.getLong(0),
            username: result.getString(1),
            age: result.getLong(2),
            like: result.getString(3)
          });
        }
        resolve(students);
      }).catch((error: BusinessError) => {
        reject(error)
      })
    })
  }

  /**
   * 删除
   * @param id
   * @returns
   */
  static deleteById(id: number) {
    let predicates = new relationalStore.RdbPredicates('STUDENT');
    predicates.equalTo('ID', id)
    return RdbUtil.getStore().delete(predicates);
  }

  /**
   * 更新
   * @param id
   * @param data
   * @returns
   */
  static updateById(id: number, data: relationalStore.ValuesBucket) {
    let predicates = new relationalStore.RdbPredicates('STUDENT');
    predicates.equalTo('ID', id)
    return RdbUtil.getStore().update(data, predicates);
  }
}

4.8 在pages目录下面新增三个页面

import StudentListComponent from '../components/StudentListComponent'
import Student from '../models/Student'
import { promptAction, router } from '@kit.ArkUI'
import PageRouterParam from '../params/PageRouterParam'
import TitleComponent from '../components/TitileComponent'
import RdbUtil from '../utils/RdbUtil'
import { BusinessError } from '@kit.BasicServicesKit'

@Entry
  @Component
  struct Index {
    // 学生数组数据
    @State studentList: Student[] = []

    /**
    * 查询数据
    */
    onPageShow() {
      // 从关系型数据库中获取
      this.studentList = []
      RdbUtil.queryAll()
        .then((students: Array<Student>) => {
          this.studentList = students
          promptAction.showToast({ message: '获取学生信息成功' })
        }).catch((error: BusinessError) => {
          promptAction.showToast({
            message: ' 获取学生信息失败 '
          })
        })
    }

    build() {
      Column() {

        // 标题组件
        TitleComponent()

        Row() {
          // 学生数据
          Text('学生数据')
            .TextIndexStyle()

          // 添加
          Text('添加')
            .fontColor(Color.Blue)
            .TextIndexStyle()
            .onClick(() => {
              router.pushUrl({ url: 'pages/Register', params: new PageRouterParam('欢迎来到添加学生界面', '注册', 0) })
            })
        }.width('80%')
          .height(40)
          .justifyContent(FlexAlign.SpaceBetween)

        // 学生成绩展示
        StudentListComponent({ studentList: this.studentList })

      }
      .height('100%')
        .width('100%')
        .backgroundImage($r('app.media.login_background'))
        .backgroundImageSize({ width: '100%', height: '100%' })
    }
  }

@Extend(Text)
  function TextIndexStyle() {
    .lineHeight(20)
      .fontWeight(400)
      .fontSize(15)
  }
import { promptAction, router } from '@kit.ArkUI';

@Entry
  @Component
  struct Login {
    @State account: string = 'admin';
    @State password: string = '123456';

    /**
   * 登录
   */
    login() {
      // 校验账号密码是否符合要求
      if (this.account === 'admin' || this.password === '123456') {
        promptAction.showToast({ message: '登录成功' })
        router.pushUrl({
          url: 'pages/Index'
        })
      } else {
        promptAction.showToast({ message: '登录失败' })
        router.pushUrl({
          url: 'pages/login'
        })
      }

    }

    build() {
      Column() {
        Column() {
          // 登录图片
          Image($r('app.media.login'))
            .width(100)
            .height(100)
            .margin({ top: 200 })

          // 学生管理系统
          Text('学生管理系统')
            .padding(20)
            .fontSize(20)
            .fontWeight(600)

          // 输入账号密码
          TextInput({ text: this.account, placeholder: '请输入账号' })
            .TextInputLoginStyle()
            .onChange((value) => {
              this.account = value
            })


          // 请输入密码
          TextInput({ text: this.password, placeholder: '请输入密码' })
            .TextInputLoginStyle()
            .type(InputType.Password)
            .onChange((value) => {
              this.password = value

            })

          // 登录
          Button('登录', { stateEffect: true })
            .fontColor(Color.White)
            .width(300)
            .height(40)
            .type(ButtonType.Normal)
            .onClick(() => {
              this.login()
            })


        }
      }
      .height('100%')
        .width('100%')
        .backgroundImage($r('app.media.login_background'))
        .backgroundImageSize({ width: '100%', height: '100%' })
    }
  }

@Extend(TextInput)
  function TextInputLoginStyle() {
    .placeholderFont({ size: 15 })
      .width(300)
      .height(40)
      .margin({ bottom: 10 })
      .borderRadius(0)
  }

import { promptAction, router } from '@kit.ArkUI'
import TitleComponent from '../components/TitileComponent'
import PageRouterParam from '../params/PageRouterParam'
import { relationalStore } from '@kit.ArkData'
import RdbUtil from '../utils/RdbUtil'
import { BusinessError } from '@kit.BasicServicesKit'

@Entry
  @Component
  struct Register {
    @State username: string = ''
    @State age: number = 0
    @State like: string = ''
    @State registerName: string = '欢迎来到添加学生界面'
    @State buttonName: string = '注册'
    @State studentId: number = 0

    aboutToAppear() {
      // 获取路由参数
      const param = router.getParams() as PageRouterParam
      this.registerName = param.registerName
      this.buttonName = param.buttonName
      this.studentId = param.studentId
    }

    register() {
      // 校验参数
      if (!this.username || !this.age || !this.like) {
        promptAction.showToast({
          message: this.buttonName + '失败,请填写学生信息'
        })
        return
      }
      if (this.studentId === 0) {
        // 注册
        const valueBucket: relationalStore.ValuesBucket = {
          'USERNAME': this.username,
          'AGE': this.age,
          'LIKE': this.like
        };
        RdbUtil.insert('STUDENT', valueBucket)
          .then((data) => {
            console.log('insert data success:' + JSON.stringify(data))
            promptAction.showToast({
              message: '注册成功'
            })
          }).catch((error: BusinessError) => {
            console.log('insert data fail:' + error)
            promptAction.showToast({
              message: '注册失败 '
            })
          })
      } else {
        // 修改
        const valueBucket: relationalStore.ValuesBucket = {
          'USERNAME': this.username,
          'AGE': this.age,
          'LIKE': this.like
        };
        RdbUtil.updateById(this.studentId, valueBucket)
          .then((data) => {
            console.log('update student success:' + JSON.stringify(data))
            promptAction.showToast({
              message: '修改成功'
            })
          }).catch((err: BusinessError) => {
            console.log('update student fail:' + err)
            promptAction.showToast({
              message: ' 修改失败 '
            })
          })
      }
      // 跳转到首页
      router.replaceUrl({ url: 'pages/Index' })
    }

    build() {
      Column() {
        // 欢迎页面
        TitleComponent({ name: this.registerName })

        // 注册功能
        TextInput({ placeholder: '请输入学生名称' })
          .TextInputRegisterStyle()
          .onChange((value) => {
            this.username = value
          })

        TextInput({ placeholder: '请输入学生年龄' })
          .TextInputRegisterStyle()
          .onChange((value) => {
            this.age = Number(value)
          })

        TextInput({ placeholder: '请输入学生爱好' })
          .TextInputRegisterStyle()
          .onChange((value) => {
            this.like = value
          })

        Button(this.buttonName)
          .width(300)
          .type(ButtonType.Normal)
          .stateEffect(true)
          .onClick(() => {
            // 注册或者修改
            this.register()
          })


      }
      .height('100%')
        .width('100%')
        .backgroundImage($r('app.media.login_background'))
    .backgroundImageSize({ width: '100%', height: '100%' })
  }
}

@Extend(TextInput)
function TextInputRegisterStyle() {
  .placeholderFont({ size: 15 })
  .width(300)
  .height(40)
  .margin({ bottom: 10 })
  .borderRadius(0)
}

4.9 修改EntryAbility.ets文件

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { promptAction, window } from '@kit.ArkUI';
import { relationalStore } from '@kit.ArkData';
import RdbUtil from '../utils/RdbUtil';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    // 创建数据库
    const STORE_CONFIG: relationalStore.StoreConfig = {
      name: 'study_manage.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S3, // 数据库安全级别
      encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
      customDir: 'customDir/subCustomDir', // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
      isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。
    };
    relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info(`Succeeded in getting RdbStore.`);
      //保存store, 方便后面我们对数据库的操作
      RdbUtil.setStore(store)
      // 创建学生表
      const SQL_CREATE_TABLE =
        'CREATE TABLE IF NOT EXISTS STUDENT (ID INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT NOT NULL, AGE INTEGER,LIKE TEXT NOT NULL)'; // 建表Sql语句
      RdbUtil.executeSql(SQL_CREATE_TABLE)
        .then(() => {
          console.log('success create table')
        }).catch((err: BusinessError) => {
          console.log('fail create table')
        })

    })

    windowStage.loadContent('pages/Login', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

5. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开发!视频陆续更新中!_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

keepalived + nginx 实现网站高可用性(HA)

keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用软件包括&a…

Javase——正则表达式

正则表达式的相关使用 public static void main(String[] args) {//校验QQ号 System.out.println("3602222222".matches("[1-9][0-9]{4,}"));// 校验18位身份证号 System.out.println("11050220240830901X".matches("^([0-9]){7,18}…

数据结构与算法 - 基础

本文首发于 个人博客 程序 数据结构 算法 其实很多同学知道数据结构与算法很重要&#xff0c;但是却不明觉厉。 这里我们看一个简单的题&#xff1a; 对自然数从1到100的求和 最简单的设计无非是&#xff1a; void addNum () { int total 0; for (int i 1; i < 1…

【React 轮子】文本溢出后显示展开/收起按钮

/** hooks* 用于文本展示时判断是否展示 展开/收起按钮 &#xff08;包含监听 文本变化/页面尺寸变换&#xff09;* param { string } text 需要展示的文本* param { number } maxLength 文本最大展示行数* param { number } lineHeight 文本行高 (单位 px) */ import React, …

交通工具图像分割系统:全面扶持小白

交通工具图像分割系统源码&#xff06;数据集分享 [yolov8-seg-vanillanet&#xff06;yolov8-seg-C2f-Parc等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global A…

pta题目

1.查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 AC: select distinct(pd.maker) --去重查询 from product pd where pd.type in (个人电脑, 便携式电脑) --题目上要求的&#xff0c;至少一个&#xff0c;in是从里面选择 and --这里也是model其实相…

windows下用CMake构建使用protobuf的应用,编译使用VS2022

最近构建一个使用protobuf的应用&#xff0c;踩了不少坑&#xff0c;在此记录一下 一、编译protobuf protobuf只提供源码&#xff0c;没有编译好的库文件给使用造成一定的障碍&#xff08;差评&#xff09;。所以c应用中使用protobuf的第一步是用cmake对protobuf进行构建。 1.…

计组-主存的分类和编址,随机存取(RAM)和只读(ROM)存储器

随机和只读存储器这2类是有着不同的功能的 像我们的内存就属于随机存取存储器&#xff08;RAM&#xff09;&#xff0c;其特点就是当内存一旦断电时&#xff0c;内存里面的所有数据都将被清除掉&#xff0c;无法保存下来&#xff0c;即一断电信息就会丢失 而ROM在断电后是可以…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…

一次线程池使用错误导致的问题

记录一次服务线程数量异常问题的排查过程 背景 通过监控发现一个服务的线程数异常多 同期CPU 内存 网络连接都没有什么异常。 排查 第一个反应就是查看线程栈 "pool-2493-thread-3" #3718833 prio5 os_prio0 tid0x00007f1610041000 nid0x38bff6 waiting on con…

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…

java毕业设计之基于Bootstrap的常州地方旅游管理系统的设计与实现(springboot)

项目简介 基于Bootstrap的常州地方旅游管理系统的设计与实现有下功能&#xff1a; 基于Bootstrap的常州地方旅游管理系统的设计与实现的主要使用者分为用户功能模块和管理员功能模块两大部分&#xff0c;用户可查看景点信息、景点资讯等&#xff0c;注册登录后可进行景点订票…

面试经典 150 题:189、383

189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…

mysql--多表查询

一、联合查询 作用&#xff1a;合并结果集就是把两个select语句的查询结果合并到一起&#xff01; 合并结果集有两种方式&#xff1a; UNION&#xff1a;合并并去除重复记录&#xff0c;例如&#xff1a;SELECT * FROM t1 UNION SELECT * FROM t2&#xff1b; UNION ALL&a…

什么是严肃游戏,严肃游戏本地化的特点是什么?

“严肃游戏”是一种交互式数字体验&#xff0c;不仅用于娱乐&#xff0c;还用于教育、培训或解决问题。与主要关注乐趣和参与度的传统游戏不同&#xff0c;严肃游戏的目标不仅仅是娱乐&#xff0c;比如教授特定技能、模拟现实生活场景或提高对重要问题的认识。它们用于医疗保健…

ADI常规SHARC音频处理器性能对比

1、 ADSP-2156x:是基于SHARC+ DSP架构的单核32位/40位/64位浮点处理器,不仅具有灵活的音频连接性和性能可扩展性,还提供多个引脚兼容版本(400MHz至1GHz)和多种片内存储器选项,数据手册链接:https://www.analog.com/media/en/technical-documentation/data-sheets/adsp-2…

springboot 整合 抖音 移动应用 授权

后端开发&#xff0c;因为没有JavaSDK&#xff0c;maven依赖&#xff0c;用到的是API接口去调用 抖音API开发文档 开发前先申请好移动应用&#xff0c;抖音控制台-移动应用 之后还需要开通所有能开通的能力 拿到应用的 clientKey 和 clientSecret&#xff0c;就可以进入开发了 …

Python 三维图表绘制指南

Python 三维图表绘制指南 在数据可视化中&#xff0c;三维图表可以更直观地展示数据之间的关系&#xff0c;尤其是当数据具有多个维度时。Python 提供了多个库来绘制三维图表&#xff0c;其中最常用的就是 Matplotlib。本文将介绍如何使用 Matplotlib 绘制三维图表&#xff0c…

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…