当前位置: 首页 > news >正文

做网站站长一年能赚多少钱怎么自己做个网站

做网站站长一年能赚多少钱,怎么自己做个网站,做的公司网站怎么没了,商业供应商链接#效果图 #思路 ##步骤: ###一、利用picker api选择1张图片 实例化选择器参数(使用new PhotoSelectOptions())实例化图片选择器 (使用newPhotoViewPicker() )调用图片选择器的select方法传入选择器参数完成图片选取获得结果 利用picker api选择1张图片 async sele…

#效果图

#思路

##步骤:
###一、利用picker api选择1张图片
  1. 实例化选择器参数(使用new PhotoSelectOptions())
  2. 实例化图片选择器 (使用newPhotoViewPicker() )
  3. 调用图片选择器的select方法传入选择器参数完成图片选取获得结果

利用picker api选择1张图片

 async selectImage(maxnum: number) {// 1.1 实例化选择参数let opts = new picker.PhotoSelectOptions()opts.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPEopts.maxSelectNumber = maxnum// 1.2 打开相册来选择照片返回(选择相册照片的数组)let viewer = new picker.PhotoViewPicker()let res = await viewer.select(opts)return res.photoUris}

//点击头像  

.onClick(async () => {
                  // 1. 使用picker选择相册中的图片
                  let urls = await this.selectImage(1)
                  AlertDialog.show({message:JSON.stringify(urls[0])})

                  //  2. 利用fs将相册图片拷贝到缓存目录中

                  //  3. 利用reqeust.uploadFile完成图片上传

                })

 ##拷贝选择图片到缓存目录
  // 2. 拷贝到应用程序缓存目录async copyToCacheDir(photoImagePath: string) {//   1. 使用openSync将相册中的图片加载到内存中得到内存的数字指向let file = fs.openSync(photoImagePath, fs.OpenMode.READ_ONLY)//   2. 使用copyFileSync完成图片拷贝到应用程序缓存中let dir = getContext().cacheDirlet type = 'jpg'let filename = Date.now() + '.' + typelet fullpath = dir + '/' + filenamefs.copyFileSync(file.fd, fullpath)//   3. 返回文件名和文件的扩展名// ['123123234.jpg','jpg']return [filename, type]}

//点击头像

.onClick(async () => {
                  // 1. 使用picker选择相册中的图片
                  let urls = await this.selectImage(1)
                  // AlertDialog.show({ message: JSON.stringify(urls[0]) })

                  //  2. 利用fs将相册图片拷贝到缓存目录中
                  let fileInfo = await this.copyToCacheDir(urls[0])
                  AlertDialog.show({ message: JSON.stringify(fileInfo, null, 2) })

                })

###二、利用 request.uploadFile 进行图片上传
  1. 准备好参数调用request.uploadFile()获得上传对象 uploader
  2.  'Content-Type': 'multipart/form-data'
  3. 给uploader对象注册progress事件,监听上传进度 requestRes.on("progress", (uploadedSize: number, totalSize: number)=>{})
  4. 给uploader对象注册fail事件,监听报错信息requestRes.on('fail', (taskStates) => {})

这是接口文档需要的参数

// 3. 头像上传async upload(filename: string, type: string) {let uploador = await request.uploadFile(getContext(), {method: 'POST',url: '接口地址',header: {'Content-Type': 'multipart/form-data','Authorization': `Bearer ${this.currentUser.token}`},files: [{filename: filename,type: type,name: 'file',uri: 'internal://cache/' + filename}],data: []})//  1.监控文件上传失败事件// 不能监听所有异常uploador.on('fail', (err) => {// AlertDialog.show({ message: 'fail-->' + JSON.stringify(err, null, 2) })Logger.error('头像上传失败', JSON.stringify(err))})//  2. 监控服务器响应回来的数据uploador.on('headerReceive', (res) => {// AlertDialog.show({ message: '完成-->' + JSON.stringify(res, null, 2) })})}

  .onClick(async () => {
                  // 1. 使用picker选择相册中的图片
                  let urls = await this.selectImage(1)
                  // AlertDialog.show({ message: JSON.stringify(urls[0]) })

                  //  2. 利用fs将相册图片拷贝到缓存目录中
                  let fileInfo = await this.copyToCacheDir(urls[0])
                  // AlertDialog.show({ message: JSON.stringify(fileInfo, null, 2) })

                  //  3. 利用reqeust.uploadFile完成图片上传
                  await this.upload(fileInfo[0], fileInfo[1])

                })

###三、get请求userInfo接口刷新用户数据,更新AppStorage("user")中的用户缓存数据

// 获取登录用户数据
  @StorageLink('user') currentUser: iLoginUserModel = {} as iLoginUserModel

    //  2. 监控服务器响应回来的数据
    uploador.on('headerReceive', async (res) => {
      // AlertDialog.show({ message: '完成-->' + JSON.stringify(res, null, 2) })
      //  这个方法一旦触发,那么服务器的头像已经上传完毕并且更新了
      //  这是去重新获取https://ap........中的头像地址就是我们上传以后的新的头像地址
      let newUserInfo = await HdHttp.Get<object>('hm/userInfo')
      this.currentUser.avatar = newUserInfo.data['avatar']

      // AlertDialog.show({ message: JSON.stringify('老头像地址:'+this.currentUser.avatar +' 新的头像地址:' + newUserInfo.data['avatar']) })
    })

##综合代码

import { iLoginUserModel } from '../models/datamodel'
import { picker } from '@kit.CoreFileKit'
import fs from '@ohos.file.fs';
import { request } from '@kit.BasicServicesKit';
import { Logger } from '../utils/Logger';
import { HdHttp } from '../utils/request';

@Entry
@Component
struct ProfileEditPage {
  // 获取登录用户数据
  @StorageLink('user') currentUser: iLoginUserModel = {} as iLoginUserModel
  // 获取安全区域高度数据
  @StorageProp("topHeight") topHeight: number = 0

  // 1. 使用picker选择相册中的图片
  async selectImage(maxnum: number) {
    // 1.1 实例化选择参数
    let opts = new picker.PhotoSelectOptions()
    opts.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE
    opts.maxSelectNumber = maxnum

    // 1.2 打开相册来选择照片返回(选择相册照片的数组)
    let viewer = new picker.PhotoViewPicker()
    let res = await viewer.select(opts)
    return res.photoUris
  }

  // 2. 拷贝到应用程序缓存目录
  async copyToCacheDir(photoImagePath: string) {
    //   1. 使用openSync将相册中的图片加载到内存中得到内存的数字指向
    let file = fs.openSync(photoImagePath, fs.OpenMode.READ_ONLY)

    //   2. 使用copyFileSync完成图片拷贝到应用程序缓存中
    let dir = getContext().cacheDir
    let type = 'jpg'
    let filename = Date.now() + '.' + type
    let fullpath = dir + '/' + filename

    fs.copyFileSync(file.fd, fullpath)

    //   3. 返回文件名和文件的扩展名
    // ['123123234.jpg','jpg']
    return [filename, type]
  }

  // 3. 头像上传
  async upload(filename: string, type: string) {
    let uploador = await request.uploadFile(getContext(), {
      method: 'POST',
      url: '后台给的接口地址',
      header: {
        'Content-Type': 'multipart/form-data',
        'Authorization': `Bearer ${this.currentUser.token}`
      },
      files: [
        {
          filename: filename,
          type: type,
          name: 'file',
          uri: 'internal://cache/' + filename
        }
      ],
      data: []
    })

    //  1.监控文件上传失败事件
    // 不能监听所有异常
    uploador.on('fail', (err) => {
      // AlertDialog.show({ message: 'fail-->' + JSON.stringify(err, null, 2) })
      Logger.error('头像上传失败', JSON.stringify(err))
    })

    //  2. 监控服务器响应回来的数据
    uploador.on('headerReceive', async (res) => {
      // AlertDialog.show({ message: '完成-->' + JSON.stringify(res, null, 2) })
      //  这个方法一旦触发,那么服务器的头像已经上传完毕并且更新了
      //  这是去重新获取https://api-.........中的头像地址就是我们上传以后的新的头像地址
      let newUserInfo = await HdHttp.Get<object>('hm/userInfo')
      this.currentUser.avatar = newUserInfo.data['avatar']

      // AlertDialog.show({ message: JSON.stringify('老头像地址:'+this.currentUser.avatar +' 新的头像地址:' + newUserInfo.data['avatar']) })
    })
  }

  build() {
    Navigation() {
      Stack() {
        List() {
          ListItem() {
            Row() {
              Text('头像')
              // 回显用户头像
              Image(this.currentUser.avatar || $rawfile('avatar.png'))
                .width((40))
                .width((40))
                .borderRadius((40))
                .border({ width: 0.5, color: '#e4e4e4' })
                .onClick(async () => {
                  // 1. 使用picker选择相册中的图片
                  let urls = await this.selectImage(1)
                  // AlertDialog.show({ message: JSON.stringify(urls[0]) })

                  //  2. 利用fs将相册图片拷贝到缓存目录中
                  let fileInfo = await this.copyToCacheDir(urls[0])
                  // AlertDialog.show({ message: JSON.stringify(fileInfo, null, 2) })

                  //  3. 利用reqeust.uploadFile完成图片上传
                  await this.upload(fileInfo[0], fileInfo[1])

                })
            }.width('100%').height((60)).justifyContent(FlexAlign.SpaceBetween)
          }

          ListItem() {
            Row() {
              Text('昵称')
              // 回显用户昵称
              TextInput({ text: this.currentUser.nickName || '昵称' })
                .textAlign(TextAlign.End)
                .layoutWeight(1)
                .padding(0)
                .height((60))
                .backgroundColor(Color.Transparent)
                .borderRadius(0)
                .onSubmit(() => {
                  // 修改昵称 this.updateNickName()//待完善

                })
            }.width('100%').height(60).justifyContent(FlexAlign.SpaceBetween)
          }
        }
        .width('100%')
        .height('100%')
        .padding({
          left: (45),
          right: (45),
          top: (15),
          bottom: (15)
        })
        .divider({ strokeWidth: 0.5, color: '#f5f5f5' })

      }.width('100%')
      .height('100%')
    }
    .padding({ top: this.topHeight + 10 })
    .title('完善个人信息')
    .titleMode(NavigationTitleMode.Mini)
    .mode(NavigationMode.Stack)
    .linearGradient({
      colors: [['#FFB071', 0], ['#f3f4f5', 0.3], ['#f3f4f5', 1]]
    })
  }
}


文章转载自:
http://blindworm.mrfr.cn
http://grandniece.mrfr.cn
http://lighter.mrfr.cn
http://microphenomenon.mrfr.cn
http://swamy.mrfr.cn
http://remilitarization.mrfr.cn
http://evidentiary.mrfr.cn
http://blockhead.mrfr.cn
http://hypoalonemia.mrfr.cn
http://iconograph.mrfr.cn
http://godspeed.mrfr.cn
http://eggwalk.mrfr.cn
http://refect.mrfr.cn
http://snowwhite.mrfr.cn
http://heldentenor.mrfr.cn
http://thermantidote.mrfr.cn
http://temporizer.mrfr.cn
http://morphine.mrfr.cn
http://goodness.mrfr.cn
http://childbirth.mrfr.cn
http://quantitate.mrfr.cn
http://bhl.mrfr.cn
http://consentaneous.mrfr.cn
http://kibbutznik.mrfr.cn
http://cymling.mrfr.cn
http://undine.mrfr.cn
http://sausage.mrfr.cn
http://cordate.mrfr.cn
http://greasiness.mrfr.cn
http://mestizo.mrfr.cn
http://incity.mrfr.cn
http://santana.mrfr.cn
http://triserial.mrfr.cn
http://bung.mrfr.cn
http://departed.mrfr.cn
http://reynold.mrfr.cn
http://xerophytism.mrfr.cn
http://aboriginally.mrfr.cn
http://raschel.mrfr.cn
http://saponification.mrfr.cn
http://palaeozoology.mrfr.cn
http://growler.mrfr.cn
http://khaibar.mrfr.cn
http://autolyzate.mrfr.cn
http://arapunga.mrfr.cn
http://knower.mrfr.cn
http://impleadable.mrfr.cn
http://diacetylmorphine.mrfr.cn
http://burrawang.mrfr.cn
http://piratical.mrfr.cn
http://quarterdeck.mrfr.cn
http://confessingly.mrfr.cn
http://godwards.mrfr.cn
http://iktas.mrfr.cn
http://loverboy.mrfr.cn
http://mid.mrfr.cn
http://parasitise.mrfr.cn
http://rightfully.mrfr.cn
http://mumps.mrfr.cn
http://villainously.mrfr.cn
http://soundproof.mrfr.cn
http://adaptation.mrfr.cn
http://repo.mrfr.cn
http://abdomen.mrfr.cn
http://liberalism.mrfr.cn
http://gastronomic.mrfr.cn
http://agrostologist.mrfr.cn
http://conflagate.mrfr.cn
http://decimator.mrfr.cn
http://totemic.mrfr.cn
http://anagogic.mrfr.cn
http://spire.mrfr.cn
http://redescend.mrfr.cn
http://faintly.mrfr.cn
http://accusable.mrfr.cn
http://commanding.mrfr.cn
http://polygynist.mrfr.cn
http://inviolacy.mrfr.cn
http://homophonic.mrfr.cn
http://deviationist.mrfr.cn
http://laconical.mrfr.cn
http://liveability.mrfr.cn
http://galveston.mrfr.cn
http://piaffe.mrfr.cn
http://isostemony.mrfr.cn
http://size.mrfr.cn
http://nitride.mrfr.cn
http://homeothermic.mrfr.cn
http://uncandid.mrfr.cn
http://crystallize.mrfr.cn
http://kaaba.mrfr.cn
http://decelerometer.mrfr.cn
http://avocation.mrfr.cn
http://heliskiing.mrfr.cn
http://airy.mrfr.cn
http://sfz.mrfr.cn
http://circumvolute.mrfr.cn
http://laeotropic.mrfr.cn
http://lowlander.mrfr.cn
http://willies.mrfr.cn
http://www.dt0577.cn/news/100194.html

相关文章:

  • 东海建设局网站百度在线客服
  • 微网站怎么开发辅导机构
  • 高端网站建设询问磐石网络百度推广运营专员
  • 网站seo与网站没关app营销策略有哪些
  • 灵璧有做公司网站的吗沈阳头条今日头条新闻最新消息
  • 网站开发属于商标哪个类别竞价推广
  • 做关于家乡的网站百度链接提交工具
  • 织梦网站如何更新系统推荐一个seo优化软件
  • 江宁网站建设要多少钱外贸企业网站设计公司
  • 做旅游网站怎么样网络营销策划的具体流程是
  • 怎么样把第一页PPT设为模板相关信息圆柱钢模板优势是什么?企业网站建设模板和定制化有什么区别呢?百度热词指数
  • 长春快速建站公司今日热搜榜官网
  • 著名设计案例网站在线识图
  • 做网站第一市场营销策略包括哪些策略
  • 瀑布流资源网站模板志鸿优化设计电子版
  • 谷歌网站提交浙江seo关键词
  • wordpress 仿今日头条厦门seo计费
  • 网站建设 上海网灰色词排名推广
  • 专业网站建设软件开发百度官方网
  • 济南网站建设报价百度移动开放平台
  • 山东省建设厅官方网站怎么样seo排名外包
  • 西安网络公司做网站html期末大作业个人网站制作
  • 厦门做直销网站公司APP百度最新收录方法
  • 青岛开发区网站建设多少钱saas建站平台
  • 四川疫情第二波最新消息百度网站优化公司
  • 在线浏览器上海营销seo
  • 垣曲做网站手机app安装下载
  • 做美食视频网站有哪些网络推广的含义
  • 在线客服系统哪个好seo蜘蛛屯
  • 手机网站建设制作公司软文推广营销