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

news2024/11/23 19:33:18

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙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

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

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

相关文章

《潜行者2切尔诺贝利之心》游戏引擎介绍

潜行者2切尔诺贝利之心是基于虚幻5引擎&#xff0c;所以画面效果大家不必担心。游戏目前已经跳票了很久&#xff0c;预计发售时间是2024 年 11 月 21 日&#xff0c;这次应该不会再跳票。 潜行者2切尔诺贝利之心是虚幻5吗 答&#xff1a;是虚幻5。 潜行者官方推特之前回复了…

WPF+MVVM案例实战(十八)- 自定义字体图标按钮的封装与实现(ABD类)

文章目录 1、案例效果1、按钮分类2、ABD类按钮实现描述1.文件创建与代码实现2、样式引用与控件封装3、按钮案例演示1、页面实现与文件创建2、运行效果如下3、总结4、源代码获取1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总结以下大概的按钮种类,…

在Vue和OpenLayers中使用移动传感器实现飞机航线飞行模拟

项目实现的核心代码 项目概述 该项目的目标是使用Vue.js作为前端框架&#xff0c;结合OpenLayers用于地图显示&#xff0c;实时获取来自手机传感器的数据&#xff08;如经纬度、高度、速度&#xff09;来模拟飞机在地图上的飞行轨迹。整体架构如下&#xff1a; Vue.js 用于构建…

C语言-详细讲解-洛谷P1075 [NOIP2012 普及组] 质因数分解

1.题目要求 2.题目解析 解题点在于如何分解质因数&#xff0c;这里介绍一下短除法。&#xff08;虽然解决这个问题可以不用短除法&#xff09; 3.代码实现 贴一下自己的代码 #include <stdio.h> #include <math.h>int main() {int n, i;scanf("%d",…

基于springboot的音乐网站的设计与实现(源码+lw+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…

Golang | Leetcode Golang题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; type point struct{x, y int }var dirs []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func updateMatrix(mat [][]int) [][]int {var m, n len(mat), len(mat[0])var res make([][]int, m)var visited make([][]bool, m)var queue []poin…

前端介绍|基础入门-html+css+js

文章目录 本课程有什么&#xff1f;前端是什么&#xff1f;1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么&#xff1f; 本套课程是零基础入门保姆级课程&#xff0c;课程主要内容包含&#xff1a; HTML…

自动驾驶---“火热的”时空联合规划

1 背景 早期的不少规划算法都是横纵分离的&#xff08;比如Apollo&#xff09;&#xff0c;先求解path之后&#xff0c;依赖path的结果再进行speed的求解。这种横纵解耦的规划方式具有以下特点&#xff1a; 相对较为简单&#xff0c;计算量通常较小&#xff0c;容易实现实时性…

龙蜥副理事长张东:加速推进 AI+OS 深度融合,打造最 AI 的服务器操作系统

AI 原生时代&#xff0c;操作系统厂商要全面优先拥抱 AI&#xff0c;深度融合 AI 能力&#xff0c;发挥关键生态位作用&#xff0c;做好上游芯片与下游 AI 应用开发商之间的纽带&#xff0c;打造最 AI 的服务器操作系统&#xff0c;实现 AI 能力的快速价值转化。 AI 原生趋势下…

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议&#xff0c;但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的…

【金融风控】相关业务介绍及代码详解

金融风控相关业务介绍 【了解】项目整体介绍 1.风控业务和风控报表</span> 零售金融产品 相关的指标 风控建模流程 ​ #2.特征工程 特征构造 特征筛选 ​ 3.评分卡模型构建 逻辑回归 集成学习 XGBoost LightGBM 模型评估 ​ #4.样本不均衡问题/异常点检测 【了解】今日…

了解数据库设计中的反规范化

反规范化是指通过增加冗余数据来提高数据库的读取效率。也就是说,反规范化通过在表中增加冗余字段来减少数据库中的表连接,以提高查询速度。规范化和反规范化是关系型数据库设计中的两个重要方面,它们分别代表了数据组织方式上的两个不同方向。规范化是为了减少数据冗余和提…

Perforce《2024游戏技术现状报告》Part2:游戏引擎、版本控制、IDE及项目管理等多种开发工具的应用分析

游戏开发者一直处于创新前沿。他们的实践、工具和技术受到各行各业的广泛关注&#xff0c;正在改变着组织进行数字创作的方式。 近期&#xff0c;Perforce发布了《2024游戏技术现状报告》&#xff0c;通过收集来自游戏、媒体与娱乐、汽车和制造业等高增长行业的从业者、管理人…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

通过 SSH 连接远程 Ubuntu 服务器

目录 安装 SSH 服务器允许 SSH 通过防火墙远程 SSH 连接&#xff08;选&#xff09;重启向日葵 安装 SSH 服务器 更新软件包列表 sudo apt update安装 OpenSSH 服务器 sudo apt install openssh-server检查 SSH 服务器状态 sudo systemctl status ssh如果 SSH 服务器正在运…

http请求响应详解

http介绍 http协议&#xff1a; Http”协议称为是“超文本传输协议”&#xff08;HTTP-Hypertext transfer protocol&#xff09;。它定义了浏览器怎么向万维网服务器请求万维网文档&#xff0c;以及服务器怎么样把文档传送给浏览器。 https协议&#xff1a; 传统的HTTP协议…

使用 OpenCV 实现图像的透视变换

概述 在计算机视觉领域&#xff0c;经常需要对图像进行各种几何变换&#xff0c;如旋转、缩放和平移等。其中&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种非常重要的变换方式&#xff0c;它能够模拟三维空间中的视角变化&#xff0c;例如从…

Oracle视频基础1.4.4练习

1.4.4 [dbs] 删干净上次创建的bbk ll rm -f *dbf ll rm -f spfilebbk.ora clear ll创建bbk的pfile&#xff0c;准备对应的目录 ll strings spfilewilson.ora | more strings spfilewilson.ora > initbbk.ora :%s/wilson/bbk :%s/*\.//g :wq ll vi initbbk.ora####### 创…

【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;程序猿的春天 获取Cookie 使用 Servlet 获取Cookie&#xff1a; Spring MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;也是在 Servlet 的基础上实现的 RestController RequestMapping…