鸿蒙HarmonyOS4.0开发应用学习笔记

黑马程序员鸿蒙4.0视频学习笔记,供自己回顾使用。

1.安装开发工具DevEco Studio

鸿蒙harmony开发文档指南

DevEco Studio下载地址
鸿蒙开发工具官网
选择或者安装环境
在这里插入图片描述
选择和下载SDK
在这里插入图片描述
在这里插入图片描述
安装总览
请添加图片描述
编辑器界面
在这里插入图片描述

2.TypeScript语法

2.1变量声明

//string 、number、boolean、any、union、Object、Array
let s: string = 'hello world'
const ss: string = 'hello world'//const 代表常量
//any,个人不建议使用,代码量庞大后导致代码逻辑混乱
let a:any = '不确定类型,可能是任意类型'
//union
let u:string|number|boolean = '联合类型,可能是其中一种'
//Object,对象类型
let car = {brand:'问界',Price:199999}
console.log(car.brand)
console.log(car['brand'])
//Array:数组
let cars: Array<string> = ['问界','阿维塔']
let price: number[] = [199999,299999]
console.log(cars[0])
console.log(price[1])

2.2条件控制

//在TypeScript中,空字符串、数字0、null、undefined都被认为是false,其它值则为true
//if-else,写吐了不想写
if(){}else{}
if(){}else if(){}else{}
//switch
let season:string = '冬天'
switch(season){
	case '春天':{
		console.log('你的笑容那么美,恰好与春风撞了个满怀')
		break
	}
	case '夏天':{
		console.log('玫瑰到了花期,我很想你')
		break
	}
	case '秋天':{
		console.log('盛夏欠你的温柔,让秋风徐徐来还。')
		break
	}
	default{
		console.log('情话是学的,但爱你是真的')
		break
	}
}

2.3循环迭代

//for
for(let i = 0;i<100;i++){
	console.log('拥有'+i+'个男(女)模对象')
}
// for-in
let cars: string[] = ['问界','阿维塔']
for(const i in cars){
	console.log(cars[i])
}
//for-of
for(const car of cars){
	console.log(car)
}
//while
let i = 1;
while(i <= 100){
	console.log('拥有'+i+'个男(女)模对象')
	i++;
}

2.4函数

//无返回值
function func1(car:string):void{
	console.log(car)
}
fun1('问界')
//有返回值
function func2(x: number,y:number):number{
	return x+y 
}
let count = func2(1,1)
console.log('1+1=3?'+'1+1='+count)
//简写版,箭头函数
let func3 = (car:string) => {
	console.log(car)
}
func3('阿维塔')
//函数可选参数
function func4(car?:string){
	car = car?car:'哦莫'
	console.log(car)
}
func4()
func4('link')
//函数可选参数,提供默认值
function func5(car:string='哦莫'){
	console.log(car)
}
func5()
func5('link')

2.5类和接口

//定义枚举
enum GamesConsole{
	SWITCH:1999,
	PS5:2999,
	XBOXONE:2999
}
//定义接口,抽象方法接受枚举参数
interface Price{
	//类和对象里的函数不需要加function
	showPS5Price(price:GamesConsole):void
}
//实现接口
class Article implements Price{
	showPS5Price(price:GamesConsole):void{
		console.log('ps5的价格是:'+price)
	}
}
//初始化对象
let p:Price = new Article()
//调用方法,传递枚举参数
p.showPrice(GamesConsole.PS5)
//父类
class Rectangle{
	//成员变量
	private width:number
	private length:number
	//构造函数
	constructor(width:number,length:number){
		this.width=width
		this.length=length
	}
	//成员方法
	public area():number{
		return this.width * this.length
	}
}
//子类
class Square extends Rectangle{
	constructor(side:number){
		//调用父类构造
		super(side,side)
	}
}

let s = new Square(10)
console.log(s.area())

2.6模块开发

通用功能抽取到单独的ts文件,每个文件都是一个模块(module)。
模块可以相互加载,提高代码复用性。

//rectangle.ts
//定义类,通过export导出
export class Rectangle{
	//成员变量
	private width:number
	private length:number
	//构造函数
	constructor(width:number,length:number){
		this.width=width
		this.length=length
	}
}
//定义工具方法,通过export导出
export function area(rec:Rectangle):number{
	return rec.width * rec.length
}
//index.ts
//通过import导入,from后面写文件的地址
import {Rectangle,area} from '../rectangle'

//创建Rectangle对象
let r = new Rectangle(10,10)

//调用area方法
console.log('面积为:'+area(r))

3.快速入门-hello world

create project -> empty ability
在这里插入图片描述
Index.ets文件解读

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            //...处理事件
            if (this.message == 'Hello World') {
 				this.message = '你好 世界'
            }else {
            	this.message = 'Hello World'
            }

          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

在这里插入图片描述

4.ArkUI组件

4.1Image组件

Image:图片显示组件

1.声明Image组件并设置图片源:

Image(src: string|PixelMap|Resource)

① string格式,通常用来加载网络图片,需要申请网络访问权限: ohos.permission.INTERNET

Image('https://xxx . png' )

② PixelMap格式,可以加载像素图,常用在图片编辑中

Image(PixelMapObeject)

③ Resource格式,加载本地图片,推荐使用

Image($r('app.media.mate60'))
Image($rawfile('mate60.png'))

2.添加图片属性

Image($r('app .media.icon'))
	.width(100) //宽度
	.height(120) //高度
	.borderRadius(10) // 边框圆角
	.interpolation(ImageInterpolation.High) // 图片插值

4.2Text组件

Text:文本显示组件
1.声明Text组件并设置文本内容

Text(content?:string|Resource)

①string格式,直接填写文本内容

Text('今天天气很好呀!')

②Resource格式,读取本地资源文件

Text($r('app.string.hello'))

2。添加文本属性

Text('注册账号')
	.lineHeight(32) // 行高
	.fontSize(20) // 字体大小
	.fontColor('#ff1876f8') // 字体颜色
	.fontWeight(FontWeight.Medium) // 字体粗细

4.3TextInput组件

TextInput:文本输入框
1.声明TextInput组件

TextInput( {placeholder?: ResourceStr,text?: ResourceStr})

①placeHoder:输入框无输入时的提示文本

TextInput([placeholder:'请输入账号或手机号'})

②text: 输入框当前的文本内容

TextInput({text: '1234567890'})

2.添加属性和事件

TextInput({text:当前输入文本)
	.width(150) //宽
	.height(30) // 高
	.backgroundColor('#FFF') // 背景色
	.type(InputType.Password)//输入框类型
	.onChange(value=>{
		//value是用户输入的文本内容
	})
名称描述
Normal基本输入模式。支持输入数字、字母、下划线、空格、特殊字符。
Password密码输入模式。支持输入数字、字母、下划线、空格、特殊字符。
Email邮箱地址输入模式。支持数字,字母,下划线,以及@字符。
Number纯数字输入模式。
PhoneNumber9+电话号码输入模式。支持输入数字、+、-、*、#,长度不限。

4.4 Button组件

Button:按钮组件
1.声明Button组件,label是按钮文字:

Button(label?:ResourceStr)

① 文字型按钮

Button('点我')

② 自定义按钮,在Button内嵌套其它组件

Button(){
	Image($r('app.media.search')).width(20).margin(10)
}

2.添加属性和事件

Button('点我')
	.width(100)
	.height(30)
	.type(ButtonType.Normal)//按钮类型
	.onclick(()=>{
		//处理点击事件
	})

4.5 Slider组件

Slider:滑动条组件

Slider(options?:SliderOptions)
Slider({
	min:0,//最小值
	max:100,//最大值
	value:30,//当前值
	step:10,//滑动步长
	style:SliderStyle.OutSet,//Inset
	direction:Axis.Horizontal,//Vertical
	reverse:false//是否反向滑动
})
	.width('90%')
	.showTips(true)//是否展示value百分比提示
	.blockColor('#36D')
	.onChangge(value=>{
		//value就是当前滑块值
	})

4.6 Column和Row

属性方法名说明参数
justifyContent设置子元素在主轴方向的对其格式FlexAlign枚举
alignItems设置子元素在交叉轴方向的对其格式Row容器使用VerticalAlign枚举
alignItems设置子元素在交叉轴方向的对其格式Column容器使用HorizontalAlign枚举
FlexAlign枚举:
	FlexAlign.Start
	FlexAlign.Center
	FlexAlign.End
	FlexAlign.SpaceBetween
	FlexAlign.SpaceAround
	FlexAlign.SpaceEvenly

在这里插入图片描述

HorizontalAlign枚举:
	HorizontalAlign.Start
	HorizontalAlign.Center
	HorizontalAlign.End

在这里插入图片描述

VerticalAlign枚举:
	VerticalAlign.start
	VerticalAlign.Center
	VerticalAlign.End

在这里插入图片描述

4.7 循环控制

  • ForEach
  • if-else
    在这里插入图片描述

4.8 List

列表(List)是一种复杂容器,具备以下特点:
① 列表项(ListItem)数量过多超出屏幕后,会自动提供滚动功能
②列表项(ListItem)既可以纵向排列,也可以横向排列

List({space:10}){
  ForEach([1,2,3,4],item => {
    ListItem(){
      //列表项内容,只能包含一个根组件
      Text('ListItem')
    }
  })
}
.width('100%')

4.9 自定义组件

  • 创建自定义组件
  • @Buider
  • @Styles

@Buider
在这里插入图片描述
@style
在这里插入图片描述
@Extend不仅可以写特有属性方法还可以写事件方法

5 ArkUI-状态管理

5.1@State装饰器

在声明式UI中,是以状态驱动视图更新:
在这里插入图片描述
状态(state):指驱动视图更新的数据(被装饰器标记的变量)
视图(View):基于UI描述渲染得到用户界面

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
      Text(this.message)
      .onClick(()=>{
        this.message == 'Hello World'?this.message = '你好 世界':this.message = 'Hello World'
      })
  }
  
}
说明:
@State装饰器标记的变量必须初始化,不能为空值。
@State支持Object、class、string、number、boolean、enum类型已经这些类型的数组。
嵌套类型以及数组中的对象属性无法触发视图更新。

如果做过vue开发应该很好理解。

下个目录所需要的案例

// 任务类
class Task{
  static id:number = 1
  // 任务名称
  name:string  = `任务${Task.id++}`
  // 任务状态:是否完成
  finished:boolean = false
}
// 统一的卡片样式
@Styles function  card(){
  .width('95%')
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(15)
  .shadow({radius:6,color:'#1F000000',offsetX:2,offsetY:4})
}
// 任务完成样式
@Extend(Text) function finishedTask(){
  .decoration({type:TextDecorationType.LineThrough})
  .fontColor('#B1B2B1')
}


@Entry
@Component
struct PropPage {
  @State message: string = 'Hello World'
  // 总任务数量
  @State totalTask:number = 0
  // 已完成任务数量
  @State finishTask:number = 0
  // 任务数组
  @State tasks:Task[] = []

  handleTaskChange(){
    // 更新任务总数量
    this.totalTask = this.tasks.length
    // 更新已完成任务数量
    this.finishTask = this.tasks.filter(item => item.finished).length
  }

  build() {
    Column({space:10}) {
      // 任务进度卡片
      Row(){
        Text('任务进度:')
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
        // 层叠容器
        Stack(){
          Progress({
            value:this.finishTask,
            total:this.totalTask,
            type:ProgressType.Ring
          })
            .width(100)
          Row(){
            Text(this.finishTask.toString())
              .fontColor('#36D')
              .fontSize(24)
            Text(' / '+this.totalTask.toString())
              .fontSize(24)
          }
        }

      }
      .card()
      .margin({top:20,bottom:10})
      .justifyContent(FlexAlign.SpaceEvenly)
      // 新增任务按钮
      Button('新增任务')
        .width(200)
        .onClick(()=>{
          this.tasks.push(new Task())
          // 更新任务总数量
          // this.totalTask = this.tasks.length
          this.handleTaskChange()
        })
      // 任务列表

      // 任务列表List版本
      List({space:10}){
        ForEach(
          this.tasks,
          (item:Task,index) =>{
            ListItem(){
              Row(){
                Text(item.name)
                  .fontSize(20)
                Checkbox()
                  .select(item.finished)
                  .onChange(val=>{
                    // 更新当前任务状态
                    item.finished = val
                    // 更新已完成任务数量
                    // this.finishTask = this.tasks.filter(item => item.finished).length
                    this.handleTaskChange()
                  })
              }
              .card()
              .justifyContent(FlexAlign.SpaceBetween)
            }
            .swipeAction({end:this.DeleteButton(index)})
          }
        )
      }
      .width('100%')
      .alignListItem(ListItemAlign.Center)
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F2F3')
  }

  @Builder DeleteButton(index: number){
    Button(){
      Image($r('app.media.ic_public_delete_filled'))
        .fillColor(Color.White)
        .width(20)
    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(()=>{
      this.tasks.splice(index,1)
      this.handleTaskChange()
    })
  }
}

5.2 @Prop和Link

状态管理
当父子组件之间需要数据同步时,可以使用@Prop和@Link装饰器:

@Prop@Link
同步类型单向同步双向同步
允许修饰的变量类型1. @Prop只支持string、number、boolean、enum类型 。2.父组件对象类型,子组件对象属性。3.不可以是数组、any1.父子类型一致:string、number、boolean、enum、object、class,以及他们的数组。2.数组中元素增、删、替换会引起刷新。 3.嵌套类型以及数组中的对象属性无法触发视图更新
初始化方式不允许子组件初始化父组件传递,禁止子组件初始化

在这里插入图片描述

// 任务类
class Task{
  static id:number = 1
  // 任务名称
  name:string  = `任务${Task.id++}`
  // 任务状态:是否完成
  finished:boolean = false
}
// 统一的卡片样式
@Styles function  card(){
  .width('95%')
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(15)
  .shadow({radius:6,color:'#1F000000',offsetX:2,offsetY:4})
}
// 任务完成样式
@Extend(Text) function finishedTask(){
  .decoration({type:TextDecorationType.LineThrough})
  .fontColor('#B1B2B1')
}


@Entry
@Component
struct PropPage {
  @State message: string = 'Hello World'
  // 总任务数量
  @State totalTask:number = 0
  // 已完成任务数量
  @State finishTask:number = 0




  build() {
    Column({space:10}) {

      // 任务进度卡片
      TaskStatistics({finishTask:this.finishTask,totalTask:this.totalTask})

      // 任务列表
      TaskList({finishTask:$finishTask,totalTask:$totalTask})


    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F2F3')
  }


}


@Component
struct TaskStatistics {
  @Prop finishTask:number
  @Prop totalTask:number


  build(){
    Row(){
      Text('任务进度:')
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
      // 层叠容器
      Stack(){
        Progress({
          value:this.finishTask,
          total:this.totalTask,
          type:ProgressType.Ring
        })
          .width(100)
        Row(){
          Text(this.finishTask.toString())
            .fontColor('#36D')
            .fontSize(24)
          Text(' / '+this.totalTask.toString())
            .fontSize(24)
        }
      }

    }
    .card()
    .margin({top:20,bottom:10})
    .justifyContent(FlexAlign.SpaceEvenly)
  }
}


@Component
struct TaskList {

  @Link finishTask:number
  @Link totalTask:number
  // 任务数组
  @State tasks:Task[] = []
  handleTaskChange(){
    // 更新任务总数量
    this.totalTask = this.tasks.length
    // 更新已完成任务数量
    this.finishTask = this.tasks.filter(item => item.finished).length
  }
  build(){
    Column(){
      // 新增任务按钮
      Button('新增任务')
        .width(200)
        .onClick(()=>{
          this.tasks.push(new Task())
          // 更新任务总数量
          // this.totalTask = this.tasks.length
          this.handleTaskChange()
        }).margin({bottom:10})

      // 任务列表List版本
      List({space:10}){
        ForEach(
          this.tasks,
          (item:Task,index) =>{
            ListItem(){
              Row(){
                Text(item.name)
                  .fontSize(20)
                Checkbox()
                  .select(item.finished)
                  .onChange(val=>{
                    // 更新当前任务状态
                    item.finished = val
                    // 更新已完成任务数量
                    // this.finishTask = this.tasks.filter(item => item.finished).length
                    this.handleTaskChange()
                  })
              }
              .card()
              .justifyContent(FlexAlign.SpaceBetween)
            }
            .swipeAction({end:this.DeleteButton(index)})
          }
        )
      }
      .width('100%')
      .alignListItem(ListItemAlign.Center)
      .layoutWeight(1)
    }
  }

  @Builder DeleteButton(index: number){
    Button(){
      Image($r('app.media.ic_public_delete_filled'))
        .fillColor(Color.White)
        .width(20)
    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(()=>{
      this.tasks.splice(index,1)
      this.handleTaskChange()
    })
  }
}

5.3 @Provide和Consume

5.4 @Observed和@ObjectLink

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

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

相关文章

Linux指令学习

目录 1.ls指令 2.pwd命令 3.cd 指令 4. touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.more指令 12.less指令 13.head指令 14.find指令&#xff1a; -name 15.grep指令 16.zip/unzip指令&#xff1a; 17.tar…

JavaWeb(十)

一、JavaWeb概述 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 JavaWeb&#xff1a;使用 Java技术进行web互联网开发。 二、JavaWeb 技术栈 2.1、B/S 架构 B/S 架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器…

看图学源码—Java集合 之 ArrayList 源码分析

ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}实现的接口 Serializable 类的序列化由实现java.io.Serializable接口的类启用。 不实现此接口的类将不会使任何状态 …

区块链密码学:基础知识、应用与未来发展

一、引言 区块链技术&#xff0c;作为一种分布式、去中心化的数据管理方式&#xff0c;密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。 二、区块链密码学基础知识 区块链密码学是区块链技术的核心组成部分…

02 CSS基础入门

文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…

联通宽带+老毛子Padavan固件 开启IP v6

联通宽带开启IP v6 参考&#xff1a; 联通宽带开启 IPV6 的方法_联通ipv6怎么开通-CSDN博客 个人宽带如何开启IPv6网络访问 - 知乎 (zhihu.com) 首先&#xff0c;你要确定当前你所在的地区运营商已经开通了IPV6&#xff0c;可以使用手机流量 IP查询(ipw.cn) | IPv6测试 | IPv…

ELK 日志解决方案

ELK 是目前最流行的集中式日志解决方案&#xff0c;提供了对日志收集、存储、展示等一站式的解决方案。 ELK 分别指 Elasticsearch、Logstash、Kibana。 Elasticsearch&#xff1a;分布式数据搜索引擎&#xff0c;基于 Apache Lucene 实现&#xff0c;可集群&#xff0c;提供…

【FPGA图像处理实战】- VGA接口与时序详解

VGA接口是一个很有历史的接口&#xff0c;全称为Video Graphics Array&#xff08;VGA&#xff09;视频图形阵列&#xff0c;是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。 时至今日&#xff0c;这个接口依然还在大量使用&#xff0c;因为这个接口具有…

【PTA-C语言】编程练习4 - 数组Ⅰ

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习4 - 数组Ⅰ&#xff08;1~7&#xff09; 7-1 评委打分&#xff08;分数 10&#xff09;7-2 组合数的和&#xff08;分数 10&#xff09;7-3 找不同&#xff08;分数 15&#xff09;7-4 利用二分查找…

Linux shell编程学习笔记33:type 命令

目录 0 引言1 type 命令的功能和格式 1.1 type命令的功能1.2 type 命令的格式2 type命令用法实例 2.1用type命令查看shell内置命令&#xff08;以echo命令为例&#xff09;2.2 用type命令查看别名&#xff08;以ls命令为例&#xff09;2.3 用type命令同时查看shell内置命令和别…

Kubernetes实战(八)-防止k8s namespace被误删除

1 背景 运维新同学在预发环境操作删除pod的时候&#xff0c;不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把预发环境删了&#xff0c;几十个模块&#xff0c;将近一个小时才恢复。幸亏是测试环境啊&#xff0c;如果是生产可以可以跑路了。 2 解决方案…

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…

深信服技术认证“SCSA-S”划重点:XSS漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

彻底解决公网ip无法访问服务器的问题

用服务器的公网ip访问突然提示页面无法访问了&#xff0c;之前还是ok的&#xff1a; 解决方案&#xff1a; 步骤1. 检查云服务器的安全组规则是否有添加80端口映射&#xff0c;如果没有需要手动添加&#xff0c;否则不能使用公网访问&#xff0c;检查了一下是有的&#xff1…

STM32 定时器总结

缩写 ARR: Auto-Reload Register&#xff08;保存定时器的计数范围&#xff09; PSC: Prescaler register&#xff08;预分频器寄存器&#xff0c;根据设置的分频因子N&#xff0c;计数N个定时器时钟脉冲后&#xff0c;产生一个CNT计数&#xff0c;以此实现分频功能&#xff0…

Python中函数添加超时时间,Python中signal使用

from time import time, sleepimport signal# 模拟要删除5条数据,中间有超时的i 5# 超时后执行的方法def timeout_handler(signal, frame):# 引发异常raise TimeoutError("删除第" str(i) "条,超时!")# 或者执行其他操作,不往外抛异常(超时的函数不会被…

nodejs+vue+微信小程序+python+PHP的Sd球鞋销售平台的设计与实现-计算机毕业设计推荐

此网站系统的开发方式和信息管理方式&#xff0c;借鉴前人设计的信息和研发。以网站商品信息为主&#xff0c;购物商品为核心功能来进行设计和研发&#xff0c;把网站信息和技术整合&#xff0c;开发出一套Sd球鞋销售平台。用目前现有的新技术进行系统开发&#xff0c;   目…

外包干了3个月,技术倒退2年。。。

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

淘宝用户体验VOC标签体系

本专题共10篇内容&#xff0c;包含淘宝APP基础链路过去一年在用户体验数据科学领域&#xff08;包括商详、物流、性能、消息、客服、旅程等&#xff09;一些探索和实践经验。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升&#xff1b;在物流侧洞察用户求助时间与…

UI自动化Selenium 数据驱动读取Excel

selenium 自动化&#xff0c;希望通过Excel进行数据驱动&#xff1b; 即代码自动读取并循环所有数据&#xff1b; 如下为Excel读取封装的函数 # Excel数据读取 def ExcelRead(filename, sheetname):# current_path os.getcwd()current_path "D:\WORK\自动化\pythonsel…