XUYangWei 2 mesiacov pred
rodič
commit
ed60497501

+ 2 - 0
commons/basic/Index.ets

@@ -11,6 +11,8 @@ export * from '@ibestservices/ibest-ui'
 export { reviseImgHeaderBuilder } from './src/main/ets/components/generalComp/ReviseImgHeaderBuilder'
 
 export { takePicture } from './src/main/ets/utils/TakePicture'
+export { SavePhotoHelper } from './src/main/ets/utils/SavePhotoHelper'
+export { downImage } from './src/main/ets/utils/DownImage'
 
 export { copyText } from './src/main/ets/utils/CopyText'
 

+ 141 - 23
commons/basic/src/main/ets/apis/YTUserRequest.ets

@@ -276,33 +276,151 @@ export class YTUserRequest extends YTRequest {
   }
   //修改烧香配置表
   static updateFishFra(param:Params, success: (res: string) => void, fail: (err: Error) => void) {
-    YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
-      {
-        "countdownHour": param.countdownHour as number,
-        "countdownTime": param.countdownTime as number,
-        "fixedNum": param.fixedNum as number,
-        "fixedTime": param.fixedTime as number,
-        "incenseCharacters": param.incenseCharacters as string,
-        "incenseNum": param.incenseNum as number,
-        "incenseTime": param.incenseTime as number,
-        "infiniteTime": param.infiniteTime as number,
-        "luckValue": param.luckValue as number,
-        "meritsValue": param.meritsValue as number,
-        "suspensionCharacters": param.suspensionCharacters as string,
-        "timbreId": param.timbreId as number,
-        "woodenfishModel": param.woodenfishModel as number
-      })
-      .then(res => {
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "countdownHour": param.countdownHour as number,
+          "countdownTime": param.countdownTime as number,
+          "fixedNum": param.fixedNum as number,
+          "fixedTime": param.fixedTime as number,
+          "incenseCharacters": param.incenseCharacters as string,
+          "incenseNum": param.incenseNum as number,
+          "id": id,
+          "incenseTime": param.incenseTime as number,
+          "infiniteTime": param.infiniteTime as number,
+          "luckValue": param.luckValue as number,
+          "meritsValue": param.meritsValue as number,
+          "suspensionCharacters": param.suspensionCharacters as string,
+          "timbreId": param.timbreId as number,
+          "woodenfishModel": param.woodenfishModel as number
+        })
+
+        .then(res => {
 
-      })
-      .catch((err: Error) => {
-        IBestToast.show({
-          message:err.message,
-          duration:500
         })
-      })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
+  }
+
+  //木鱼敲击模式
+  static updateFishWoodenModel(param:Params){
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "id": id,
+          "countdownHour": param.countdownHour as number,
+          "countdownTime": param.countdownTime as number,
+          "fixedNum": param.fixedNum as number,
+          "fixedTime": param.fixedTime as number,
+          "infiniteTime": param.infiniteTime as number,
+          "woodenfishModel": param.woodenfishModel as number
+        })
+        .then(res => {
+
+        })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
+  }
+
+  //点香悬浮文字修改
+  static updateInseCharacter(param:Params, success: (res: string) => void, fail: (err: Error) => void){
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "id": id,
+          "incenseCharacters": param.incenseCharacters as string,
+        })
+        .then(res => {
+
+        })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
+  }
+
+  //点香数量点香时间
+  static updateIncese(param:Params, success: (res: string) => void, fail: (err: Error) => void){
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "id": id,
+          "incenseNum": param.incenseNum as number,
+          "incenseTime": param.incenseTime as number,
+        })
+        .then(res => {
+
+        })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
+  }
+
+  //功德数
+  //点香数量点香时间
+  static updateMeritsValue(param:Params, success: (res: string) => void, fail: (err: Error) => void){
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "id": id,
+          "meritsValue": param.meritsValue as number,
+        })
+        .then(res => {
+
+        })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
   }
 
+  //木鱼悬浮文字
+  static updateSuspensionCharacters(param:Params){
+    const  id=AppStorage.get('updateID') as number
+    if(id!=undefined) {
+      YTRequest.post<ReqString, ReqString>(`/api/woodenfish/config/modify`,
+        {
+          "id": id,
+          "suspensionCharacters": param.suspensionCharacters as string,
+        })
+        .then(res => {
+
+        })
+        .catch((err: Error) => {
+          IBestToast.show({
+            message: err.message,
+            duration: 500
+          })
+        })
+    }
+  }
+
+
   //获取配置表
   static getFishFra(success:(param:Params)=>void){
     YTUserRequest.get<Params>(`/api/woodenfish/config/selectConfigByUserId`).then((res)=>{

+ 16 - 2
commons/basic/src/main/ets/components/dialog/BlessCustomDialog.ets

@@ -1,21 +1,35 @@
 import { photoAccessHelper } from "@kit.MediaLibraryKit"
+import { componentSnapshot, promptAction } from "@kit.ArkUI"
+import { fileIo, fileUri } from "@kit.CoreFileKit"
+import { image } from "@kit.ImageKit"
+import { downImage } from "../../utils/DownImage"
 
 @CustomDialog
 export struct BlessCustomCustomDialog {
   controller: CustomDialogController
   @State imgIndex:number=0
+  async saveImage () {
+    // 进行截图
+    const pixelMap = componentSnapshot.getSync('share')
+    downImage.saveImage(pixelMap)
+  }
+
+
   build() {
     Column({space:21}){
       Column() {
         Column({space:20}) {
-          Image($r(`app.media.fuqian${this.imgIndex}`)).width(270)
+          Column() {
+            Image($r(`app.media.fuqian${this.imgIndex}`)).width(270)
 
+          }.id('share')
           Text('保存图片')
             .padding({left:56,right:56,top:14,bottom:14})
             .borderRadius(24)
             .backgroundColor('rgba(250, 222, 113, 1)')
             .fontColor('rgba(0, 0, 0, 0.95)')
-            .onClick(()=>{
+            .onClick( ()=>{
+             this.saveImage()
 
             })
         }.height('100%')

+ 64 - 0
commons/basic/src/main/ets/utils/DownImage.ets

@@ -0,0 +1,64 @@
+import { http } from "@kit.NetworkKit";
+import { image } from "@kit.ImageKit";
+import { SavePhotoHelper } from "./SavePhotoHelper";
+import { IBestToast } from "@ibestservices/ibest-ui";
+
+export class DownImage {
+
+  // 根据url下载图片,获取的是ArrayBuffer对象
+
+  async downLoadPic(url:string):Promise<ArrayBuffer|null> {
+
+    let data = await http.createHttp().request(url);
+
+    if (data.result instanceof ArrayBuffer) {
+
+      let imageData:ArrayBuffer = data.result
+
+      return imageData;
+
+    }
+
+    return null;
+
+  }
+  async arrayBufToPixelMap(buf:ArrayBuffer):Promise<PixelMap> {
+
+    let imgSource:image.ImageSource = image.createImageSource(buf);
+
+    let result:PixelMap = await imgSource.createPixelMap();
+
+    return result;
+
+  }
+  async saveImage(pixmap:PixelMap){
+    const context = getContext() as Context
+    const saveHelper = new SavePhotoHelper(context)
+    saveHelper.savePixmapToAlbumByDialog(pixmap, (err) => {
+      if (err) {
+        IBestToast.show('保存失败,请稍后再试')
+        pixmap.release()
+        return
+      }else {
+        IBestToast.show('保存成功')
+      }
+    })
+  }
+  async saveImageList(pixmaps:PixelMap[]){
+    const context = AppStorage.get<Context>("context") as Context
+    const saveHelper = new SavePhotoHelper(context)
+    saveHelper.saveMultiplePixmapsToAlbum(pixmaps, (err) => {
+      if (err) {
+        IBestToast.show('保存失败,请稍后再试')
+        return
+      }else {
+        IBestToast.show('保存成功')
+      }
+
+    })
+  }
+
+
+
+}
+export const downImage:DownImage=new DownImage()

+ 170 - 0
commons/basic/src/main/ets/utils/SavePhotoHelper.ets

@@ -0,0 +1,170 @@
+import { photoAccessHelper } from '@kit.MediaLibraryKit';
+import { image } from '@kit.ImageKit';
+import { util } from '@kit.ArkTS';
+import { fileIo, fileUri } from '@kit.CoreFileKit';
+import { BusinessError, emitter } from '@kit.BasicServicesKit';
+import { IBestToast } from '@ibestservices/ibest-ui';
+
+export class SavePhotoHelper {
+  private context: Context
+  private phAccessHelper: photoAccessHelper.PhotoAccessHelper
+
+  constructor(context: Context) {
+    this.context = context
+    //  获取相册帮助器
+    this.phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context);
+  }
+
+  async savePixmapToAlbumByDialog(pixmap: image.PixelMap, result?: (err?: Error) => void) {
+    // 处理PixelMap数据
+    // 2. PixelMap数据 => 二进制
+    const packer = image.createImagePacker() // 创建一个图片打包转换器
+    // 图片打包转换器  接收PixelMap数据 传入打包配置(jpeg格式  质量100)
+    const arrayBuffer = await packer.packToData(pixmap, { format: 'image/jpeg', quality: 100 }) // 转换为二进制
+
+    // 3.创建图片一个文件  写入数据(二进制)
+    const imagePath = this.context.cacheDir + '/' + util.generateRandomUUID() + '.jpeg'
+    const file = fileIo.openSync(imagePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
+    fileIo.writeSync(file.fd, arrayBuffer)
+
+    // 4.图片文件保存到相册(需要利用cache中转)
+
+    // imagePath 需要一个完整路径(uri)  file://包名 + imagePath
+    // fileUri.getUriFromPath(imagePath) //获取完整路径uri
+
+    const uris = [fileUri.getUriFromPath(imagePath)] //完整路径
+    const cashPaths = [imagePath]
+
+    try {
+      // 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选。
+      const photoCreationConfigs = uris.map(() => {
+        const photoCreationConfig: photoAccessHelper.PhotoCreationConfig = {
+          fileNameExtension: 'jpg',
+          photoType: photoAccessHelper.PhotoType.IMAGE,
+        }
+        return photoCreationConfig
+      })
+      // 基于弹窗授权的方式获取媒体库的目标uri。
+      let desFileUris: Array<string> =
+        await this.phAccessHelper.showAssetsCreationDialog(uris, photoCreationConfigs);
+
+      let index = 0
+      while (index < uris.length) {
+        //通过该uri打开图片
+        let file = await fileIo.open(desFileUris[index], fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
+        //获取流
+        const buffer = await this.getFileBuffer(cashPaths[index])
+        //通过流写入相册
+        let writeLen = await fileIo.write(file.fd, buffer)
+        //关流
+        await fileIo.close(file)
+        index++
+      }
+
+      result?.()
+
+
+    } catch (err) {
+      result?.(err)
+    } finally {
+
+    }
+
+
+  }
+
+  async getFileBuffer(filePath: string): Promise<ArrayBuffer> {
+    try {
+      const imageSource = image.createImageSource(filePath)
+      let imagePackerApi = image.createImagePacker();
+      let buffer = await imagePackerApi.packing(imageSource, {
+        quality: 100,
+        format: 'image/jpeg'
+      })
+      return buffer
+    } catch (err) {
+      let error: BusinessError = err as BusinessError;
+      console.error(`read file failed, errCode:${error.code}, errMessage:${error.message}`);
+      return Promise.reject(err)
+    }
+  }
+
+  async saveMultiplePixmapsToAlbum(pixmaps: image.PixelMap[], result?: (err?: Error) => void) {
+    try {
+      // 1. 准备所有图片的临时文件和URI
+      const tempFiles: string[] = [];
+      const uris: string[] = [];
+
+      // 2. 批量转换PixelMap为临时文件
+      for (const pixmap of pixmaps) {
+        const arrayBuffer = await this.convertPixmapToArrayBuffer(pixmap);
+        const imagePath = this.context.cacheDir + '/' + util.generateRandomUUID() + '.jpeg';
+
+        const file = fileIo.openSync(imagePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
+        fileIo.writeSync(file.fd, arrayBuffer);
+        fileIo.closeSync(file.fd);
+
+        tempFiles.push(imagePath);
+        uris.push(fileUri.getUriFromPath(imagePath));
+      }
+
+      // 3. 创建相册保存配置(所有图片使用相同配置)
+      // const photoCreationConfigs = uris.map(() => ({
+      //   fileNameExtension: 'jpg',
+      //   photoType: photoAccessHelper.PhotoType.IMAGE,
+      // }));
+
+      const photoCreationConfigs = uris.map(() => {
+        const photoCreationConfig: photoAccessHelper.PhotoCreationConfig = {
+          fileNameExtension: 'jpg',
+          photoType: photoAccessHelper.PhotoType.IMAGE
+        }
+        return photoCreationConfig
+      })
+      // 4. 只显示一次弹窗获取所有图片的目标URI
+      const desFileUris: string[] = await this.phAccessHelper.showAssetsCreationDialog(
+        uris,
+        photoCreationConfigs
+      )
+      // let index = 0
+      // while (index < uris.length) {
+      //   //通过该uri打开图片
+      //   let file = await fileIo.open(desFileUris[index], fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
+      //   //获取流
+      //   const buffer = await this.getFileBuffer(cashPaths[index])
+      //   //通过流写入相册
+      //   let writeLen = await fileIo.write(file.fd, buffer)
+      //   //关流
+      //   await fileIo.close(file)
+      //   index++
+      // }
+
+
+      // 5. 批量保存到相册
+      if (desFileUris.length > 0){
+        for (let i = 0; i < desFileUris.length; i++) {
+          const file = await fileIo.open(desFileUris[i], fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
+          const buffer = await this.getFileBuffer(tempFiles[i]);
+          await fileIo.write(file.fd, buffer);
+          await fileIo.close(file);
+          // 删除临时文件
+          fileIo.unlinkSync(tempFiles[i]);
+        }
+        result?.();
+    }
+      IBestToast.show({message:'保存失败,请重试'})
+      return
+    } catch (err) {
+      result?.(err);
+      emitter.emit('hide')
+    }
+  }
+
+  private async convertPixmapToArrayBuffer(pixmap: image.PixelMap): Promise<ArrayBuffer> {
+    const packer = image.createImagePacker();
+    return await packer.packToData(pixmap, {
+      format: 'image/jpeg',
+      quality: 100
+    });
+  }
+}

+ 5 - 1
features/feature/src/main/ets/view/FishSettingView.ets

@@ -1,5 +1,5 @@
 import { webview } from '@kit.ArkWeb'
-import { AppStorageKeyFishCollect, avPlayerManager, IBestToast, YTHeader } from 'basic'
+import { AppStorageKeyFishCollect, avPlayerManager, IBestToast, Params, YTHeader, YTUserRequest } from 'basic'
 
 @Builder
 function FishSettingViewBuilder() {
@@ -15,6 +15,10 @@ struct FishSettingView {
   @StorageLink(AppStorageKeyFishCollect.FISHTEXT)
   textValue:string=""
 
+  aboutToDisappear(): void {
+    YTUserRequest.updateSuspensionCharacters({suspensionCharacters:this.textValue} as Params)
+  }
+
   build() {
     Column() {
       YTHeader({title:'设置'})

+ 5 - 1
features/feature/src/main/ets/view/FragranceSettingView.ets

@@ -1,5 +1,5 @@
 import { webview } from '@kit.ArkWeb'
-import { AppStorageKeyFishCollect, avPlayerManager, IBestToast, YTHeader } from 'basic'
+import { AppStorageKeyFishCollect, avPlayerManager, IBestToast, YTHeader, YTUserRequest } from 'basic'
 import { TextInputCom } from '../component/TextInputCom'
 
 @Builder
@@ -18,6 +18,10 @@ struct FragranceSettingView {
   currSelectNumber:number=1
   @State
   currSelectTimeNumber:number=1
+
+  aboutToDisappear(): void {
+    // YTUserRequest.updateSuspensionCharacters()
+  }
   build() {
     Column() {
       YTHeader({title:'设置'})

+ 235 - 28
features/feature/src/main/ets/view/MainView.ets

@@ -1,5 +1,8 @@
 import { AppStorageKeyFishCollect, avPlayerManager,
   BlessCustomCustomDialog,
+  IBestInit,
+  IBestToast,
+  Params,
   Vibration, YTAvoid, YTHeader, yTRouter,
   YTUserRequest } from 'basic';
 import { faceDetector } from '@kit.CoreVisionKit';
@@ -40,17 +43,45 @@ export struct MainView{
 
   //动画true/false
   @State isAnimation:boolean=false
-  //进度条
-  @State currentMerit:number=0
-  @State totalMerit:number=10
+
 
   //时间间隔
   @State time:number=1000
 
   @State isShowTimeManger:boolean=false
+
+  //当前分钟
   @State valueTime:number=10
 
 
+  @Watch('caluc')
+  @State countdownHour:number=0.1
+  @State countdownTime:number=1
+  //
+  @Watch('caluc')
+  @State countdownCount:string="1"
+
+  @State countAutoHour:string=""
+
+  caluc(){
+    //计算间隔时长
+    this.countdownTime=this.countdownHour*60*60/Number(this.countdownCount)
+  }
+
+  @State fixedNum:number=1
+  @State fixedTime:number=1
+  @State fixedNumText:string="1"
+  @State fixedTimeText:string="1"
+
+  @State infiniteTime:number=1 //无限模式间隔时长
+  @State infiniteTimeText:string="1"
+  @State woodenfishModel:number=1
+  //进度条
+  @State currentMerit:number=0
+  @State totalMerit:number=10
+
+
+
 
 
   dialogController: CustomDialogController=new CustomDialogController({
@@ -90,6 +121,7 @@ export struct MainView{
     if(this.isOpenVibration){
       Vibration.startVibration()
     }
+    this.clockFish()
     this.isAnimation=true
     this.currentMerit++
     // this.openDialog(this.currentIndex,this.totalMerit)
@@ -129,18 +161,39 @@ export struct MainView{
       Row(){
         Image($r('[basic].media.quxiao')).width(20).onClick(()=>{
           this.isShowTimeManger = false
+
+          //发送请求
+          YTUserRequest.updateFishWoodenModel(
+            {
+              countdownHour:this.countdownHour,
+              countdownTime:this.countdownTime,
+              fixedNum:this.fixedNum,
+              fixedTime:this.fixedTime,
+              incenseTime:this.infiniteTime,
+              woodenfishModel:this.woodenfishModel
+            } as Params)
+
+          promptAction.showToast({
+            message:JSON.stringify(   {
+                 countdownHour:this.countdownHour,
+                 countdownTime:this.countdownTime,
+                fixedNum:this.fixedNum,
+                 fixedTime:this.fixedTime,
+                 incenseTime:this.infiniteTime,
+                 woodenfishModel:this.woodenfishModel
+               } as Params)
+          })
         })
 
       }.width('100%')
       .justifyContent(FlexAlign.End)
       Row(){
-
         Text('自动敲击设置').fontColor(Color.White).fontSize(20)
       }.width('100%')
       .justifyContent(FlexAlign.Center)
       .margin({bottom:20})
       Stack({alignContent:Alignment.Top}) {
-        Tabs({ barPosition: BarPosition.Start, controller: this.tabsController  }) {
+        Tabs({ barPosition: BarPosition.Start, controller: this.tabsController,index:this.currentIndex  }) {
           TabContent() {
             Column() {
               Column({ space: 16 }) {
@@ -154,7 +207,7 @@ export struct MainView{
 
 
                 Row() {
-                  TextInput()
+                  TextInput({text:this.infiniteTimeText})
                     .width(70)
                     .height(40)
                     .padding(0)
@@ -163,6 +216,27 @@ export struct MainView{
                     .borderRadius(4)
                     .backgroundColor(Color.Gray)
                     .margin({ right: 5 })
+                    .onChange((value)=>{
+                      if(Number(value)>10){
+                        IBestToast.show({
+                          message:"间隔时间不能大于10秒"
+                        })
+                        this.infiniteTimeText="10"
+                        this.infiniteTime=10
+                        return
+                      }
+                      if(Number(value)<=0){
+                        IBestToast.show({
+                          message:"间隔时间不能小于一秒"
+                        })
+                        this.infiniteTimeText="1"
+                        this.infiniteTime=1
+                        return
+                      }
+                      this.infiniteTime=Number(value)
+                      this.infiniteTimeText=this.infiniteTime.toString()
+
+                    })
 
                   Text('秒').fontColor('rgba(250, 222, 113, 1)')
                 }.width('100%').justifyContent(FlexAlign.Center)
@@ -188,7 +262,7 @@ export struct MainView{
 
 
               Row() {
-                TextInput()
+                TextInput({text:this.fixedNumText})
                   .width(70)
                   .height(40)
                   .padding(0)
@@ -197,8 +271,29 @@ export struct MainView{
                   .borderRadius(4)
                   .backgroundColor(Color.Gray)
                   .margin({right:5})
+                  .onChange((value)=>{
+                    if(Number(value)>9999){
+                      IBestToast.show({
+                        message:"敲击次数不能大于9999"
+                      })
+                      this.fixedNumText="9999"
+                      this.fixedNum=9999
+                      return
+                    }
+                    if(Number(value)<=0){
+                      IBestToast.show({
+                        message:"敲击次数不能小于1"
+                      })
+                      this.fixedNumText="1"
+                      this.fixedNum=1
+                      return
+                    }
+                    this.fixedNum=Number(value)
+                    this.fixedNumText=this.fixedNum.toString()
 
-                Text('秒').fontColor('rgba(250, 222, 113, 1)')
+                  })
+
+                Text('次').fontColor('rgba(250, 222, 113, 1)')
               }.width('100%').justifyContent(FlexAlign.Center)
 
               Row(){
@@ -211,7 +306,7 @@ export struct MainView{
 
 
               Row() {
-                TextInput()
+                TextInput({text:this.fixedTimeText})
                   .width(70)
                   .height(40)
                   .padding(0)
@@ -220,6 +315,29 @@ export struct MainView{
                   .borderRadius(4)
                   .backgroundColor(Color.Gray)
                   .margin({right:5})
+                  .onChange((value)=>{
+                    if(Number(value)>10){
+                      IBestToast.show({
+                        message:"间隔时间不能大于10秒"
+                      })
+                      this.fixedTimeText="10"
+                      this.fixedTime=10
+                      return
+                    }
+                    if(Number(value)<=0){
+                      IBestToast.show({
+                        message:"间隔时间不能小于一秒"
+                      })
+                      this.fixedTimeText="1"
+                      this.fixedTime=1
+                      return
+                    }
+                    this.fixedTime=Number(value)
+                    this.fixedTimeText=this.fixedTime.toString()
+
+                  })
+
+
 
                 Text('秒').fontColor('rgba(250, 222, 113, 1)')
               }.width('100%').justifyContent(FlexAlign.Center)
@@ -234,7 +352,6 @@ export struct MainView{
                 Row(){
                   Text() {
                     Span('倒计时').fontSize(16)
-                    Span('(1-9999次)').fontSize(12)
                   }.fontColor(Color.White)
                 }.width('100%')
                 .justifyContent(FlexAlign.Start)
@@ -252,6 +369,7 @@ export struct MainView{
                       .onClick(() => {
                         if (index != 6) {
                           this.valueTime = item  //比实际小10
+                          this.countdownHour=(this.valueTime+10)/60
                         } else {
                           this.valueTime=item
                           this.currentIndex = 3
@@ -262,7 +380,7 @@ export struct MainView{
                       .backgroundColor(this.valueTime == item ? Color.Yellow : Color.White)
                         Column() {
                           if (item != 60) {
-                            Text(item + "分钟")
+                            Text(Number(item+10) + "分钟")
                               .fontSize(10)
                               .fontColor(this.valueTime == item ? Color.White : 'rgba(255, 255, 255, 0.55)')
                           } else {
@@ -290,7 +408,7 @@ export struct MainView{
                 }.width('100%')
                 .justifyContent(FlexAlign.Start)
                 Row() {
-                  TextInput()
+                  TextInput({text:this.countdownCount})
                     .width(70)
                     .height(40)
                     .padding(0)
@@ -298,8 +416,27 @@ export struct MainView{
                     .textAlign(TextAlign.Center)
                     .borderRadius(4)
                     .backgroundColor(Color.Gray)
+                    .onChange((value)=>{
+                      if(Number(value)>9999){
+                        IBestToast.show({
+                          message:"敲击次数不能大于9999"
+                        })
+                        this.countdownCount="9999"
+                        return
+                      }
+                      if(Number(value)<=0){
+                        IBestToast.show({
+                          message:"敲击次数不能小于1"
+                        })
+                        this.countdownCount="1"
+                        return
+                      }
+                      this.countdownCount=value
 
-                  Text('秒').fontColor('rgba(250, 222, 113, 1)')
+
+                    })
+
+                  Text('次').fontColor('rgba(250, 222, 113, 1)')
                 }
               }
 
@@ -310,10 +447,10 @@ export struct MainView{
           }.tabBar('倒计时').layoutWeight(1)
           TabContent() {
             Column(){
-            Column() {
-              Text('自定义时间')
+            Column({space:30}) {
+              Text('自定义时间').fontColor(Color.White)
               Row() {
-                TextInput()
+                TextInput({text:this.countAutoHour})
                   .width(70)
                   .height(40)
                   .padding(0)
@@ -321,8 +458,19 @@ export struct MainView{
                   .textAlign(TextAlign.Center)
                   .borderRadius(4)
                   .backgroundColor(Color.Gray)
+                  .onChange((value)=>{
+                    if(Number(value)>120){
+                      IBestToast.show({
+                        message:'最多不得超过120分钟'
+                      })
+                      this.countAutoHour="120"
+                      return
+                    }
+                    this.countAutoHour=value
+                    this.countdownHour=Number(this.countAutoHour)/60
+                  })
 
-                Text('秒').fontColor('rgba(250, 222, 113, 1)')
+                Text('分钟').fontColor('rgba(250, 222, 113, 1)')
               }
             }
             }.layoutWeight(1).justifyContent(FlexAlign.Start)
@@ -340,6 +488,8 @@ export struct MainView{
             .onClick(()=>{
             this.currentIndex=0
             this.tabsController.changeIndex(this.currentIndex)
+              this.woodenfishModel=2
+
 
           })
           Text('固定次数')
@@ -351,6 +501,7 @@ export struct MainView{
             .backgroundColor(this.currentIndex==1?'rgba(250, 222, 113, 1)':Color.Transparent).onClick(()=>{
             this.currentIndex=1
             this.tabsController.changeIndex(this.currentIndex)
+            this.woodenfishModel=3
 
           })
           Text('倒计时')
@@ -363,6 +514,7 @@ export struct MainView{
             .onClick(()=>{
             this.currentIndex=2
             this.tabsController.changeIndex(this.currentIndex)
+              this.woodenfishModel=4
 
           })
 
@@ -385,15 +537,57 @@ export struct MainView{
     for (let i = 0; i < this.count; i++) {
       this.list.push(new Cell()); // 初始化 Cell 数组
     }
-
     YTUserRequest.getFishFra((res)=>{
-      promptAction.showToast({
-        message:JSON.stringify(res)
-      })
+      AppStorage.setOrCreate('updateID',res.id as number)
+      this.currentMerit=res.meritsValue as number
+      this.woodenfishModel=res.woodenfishModel as number
+      //无限间隔时长
+      this.infiniteTime=res.infiniteTime as number
+      //固定
+      this.fixedNum=res.fixedNum as number
+      this.fixedTime=res.fixedTime as number
+
+      //倒计时
+      this.countdownTime=res.countdownTime as number
+      this.countdownHour=(res.countdownHour as number)*60
+      //判断是否自动并设置敲击时间
+      if(res.woodenfishModel==1){
+        this.isAuto=false
+      }else if(res.woodenfishModel==2){
+        setInterval(()=>{
+          this.onclikMerit()
+        },this.infiniteTime*1000)
+      }else if(res.woodenfishModel==3){
+            const a=setInterval(()=>{
+              this.onclikMerit()
+
+            },this.fixedTime)
+            const b=setTimeout(()=>{
+              clearInterval(a)
+              clearTimeout(b)
+            },this.fixedTime*this.fixedNum)
+      }else if(res.woodenfishModel==4){
+
+            this.onclikMerit()
+            const a=setInterval(()=>{
+              this.onclikMerit()
+            },this.countdownTime)
+            const b=setTimeout(()=>{
+              clearInterval(a)
+              clearTimeout(b)
+            },this.countdownHour*this.countdownHour)
+
+
+      }
+
     })
 
   }
 
+  clockFish(){
+    YTUserRequest.knockingFish()
+  }
+
   build() {
     Stack() {
       Image($r('[basic].media.dengguang')).width('100%').height('100%')
@@ -426,6 +620,7 @@ export struct MainView{
                         .fontColor('rgba(0, 0, 0, 0.95)')
                         .onClick(() => {
                           this.currentMerit = 0
+                          YTUserRequest.resetFish()
                         })
 
 
@@ -482,12 +677,13 @@ export struct MainView{
                           .onClick(() => {
                             this.isAuto = !this.isAuto
                             //如果是本来自动,再点击就是手动,不需要设置任何东西
-                            // if (!this.isHand) {
-                            //   this.isHand = true
-                            // } else {
-                            //   //如果本来是手动,再点击就是自动,就需要设置东西
-                            //   this.isHand = false
-                            // }
+                            if (this.isAuto) {
+                              // this.woodenfishModel
+                            } else {
+                              //如果本来是手动,再点击就是自动,就需要设置东西
+                              // this.isHand = false
+                              this.woodenfishModel=1
+                            }
                           })
                         if (this.isAuto) {
                           Column({ space: 10 }) {
@@ -502,6 +698,9 @@ export struct MainView{
                               .backgroundColor('#252111')
                               .onClick(() => {
                                 this.isAuto = !this.isAuto
+                                if(this.isAuto==false){
+                                  this.woodenfishModel=1
+                                }
                               })
                             Text('无限')
                               .padding({
@@ -516,9 +715,15 @@ export struct MainView{
                                 width: '100%',
                                 height: 400,
                                 showClose: false,
+                                onWillDismiss: ((dismissSheetAction: DismissSheetAction) => {
+                                  if (dismissSheetAction.reason == DismissReason.SLIDE_DOWN) {
+                                    dismissSheetAction.dismiss(); //注册dismiss行为
+                                  }
+                                }),
                               })
                               .onClick(() => {
                                 this.isShowTimeManger = true
+                                this.woodenfishModel=2
                               })
                             Text('设置')
                               .padding({
@@ -575,7 +780,9 @@ export struct MainView{
                 level: ClickEffectLevel.LIGHT // 效果级别
               })
               .onClick(() => { // 点击图片时触发的回调
-                this.onclikMerit()
+                if(!this.isAuto) {
+                  this.onclikMerit()
+                }
               })
 
             Row() {

+ 1 - 1
features/user/src/main/ets/views/Mine.ets

@@ -239,7 +239,7 @@ export struct Mine {
         .layoutWeight(1)
         .width('100%')
       }.width('100%')
-      .borderRadius({topLeft:20,topRight:20})
+      .borderRadius({topLeft:15,topRight:15})
       .backgroundColor('rgba(63, 63, 63, 1)')
       .layoutWeight(1)
       .padding({ left: 16, right: 16 })