uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推

news2025/1/20 20:49:22

uniApp开通unipush1.0个推,SpringBoot程序集成

一、APP开通unipush1.0个推(商户App源码仅支持1.0个推)

1.app模块配置开通推送

在这里插入图片描述

2.应用开通推送

在这里插入图片描述

3.开通后点击消息推送菜单会看到如下页面 完成以上步骤后

在这里插入图片描述

  • 此时android 仅支持在线推送。

4.配置各厂商离线推送

  • 暂未配置

二、Java端SpringBoot集成uniPush1.0推送

1.引入依赖

		<!--	unipush 1.0个推	-->
		<dependency>
			<groupId>com.getui.push</groupId>
			<artifactId>restful-sdk</artifactId>
			<version>1.0.6.0</version>
		</dependency>

2.spring配置yaml文件添加配置

getui:  #个推推送
    appId: ************ 
    appKey: ************ 
    masterSecret: ************
    domin: https://restapi.getui.com/v2 

3.参数可从uniapp开发者中心获取

在这里插入图片描述

4.注入所有API实体类

  • UniPushConfiguration.java

    package com.joolun.cloud.common.jiguang.config;
    
    import com.getui.push.v2.sdk.ApiHelper;
    import com.getui.push.v2.sdk.api.PushApi;
    import com.getui.push.v2.sdk.api.UserApi;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.getui.push.v2.sdk.GtApiConfiguration;
    
    /**
     * @author yuanDing
     * @version 1.0
     * @date 2025-01-10 9:40
     * uniPush 1.0个推推送配置类
     */
    @Data
    @RefreshScope
    @Configuration
    @ConfigurationProperties(prefix = "getui")
    public class UniPushConfiguration {
        private String appId;
    
        private String appKey;
    
        private String masterSecret;
    
        private String domin;
        @Bean
        public GtApiConfiguration apiConfiguration() {
            GtApiConfiguration apiConfiguration = new GtApiConfiguration();
            //填写应用配置,参数在“Uni Push”下的“应用配置”页面中获取
            apiConfiguration.setAppId(appId);
            apiConfiguration.setAppKey(appKey);
            apiConfiguration.setMasterSecret(masterSecret);
            apiConfiguration.setDomain(domin);
            return apiConfiguration;
        }
    
        @Bean
        public PushApi PushApi(GtApiConfiguration apiConfiguration) {
            return ApiHelper.build(apiConfiguration).creatApi(PushApi.class);
        }
    
        @Bean
        public UserApi UserApi(GtApiConfiguration apiConfiguration) {
            return ApiHelper.build(apiConfiguration).creatApi(UserApi.class);
        }
        
        // 还有其他所需API实体类自行注入...
    
    }
    

5.封装工具类

  • UniPushUtils

    package com.joolun.cloud.common.jiguang.util;
    
    import cn.hutool.core.collection.ListUtil;
    import cn.hutool.json.JSONObject;
    import com.getui.push.v2.sdk.api.PushApi;
    import com.getui.push.v2.sdk.api.UserApi;
    import com.getui.push.v2.sdk.common.ApiResult;
    import com.getui.push.v2.sdk.dto.req.Audience;
    import com.getui.push.v2.sdk.dto.req.AudienceDTO;
    import com.getui.push.v2.sdk.dto.req.CidAliasListDTO;
    import com.getui.push.v2.sdk.dto.req.Settings;
    import com.getui.push.v2.sdk.dto.req.message.PushDTO;
    import com.getui.push.v2.sdk.dto.req.message.PushMessage;
    import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
    import com.joolun.cloud.common.jiguang.dto.CIdAliasDTO;
    import com.joolun.cloud.common.jiguang.dto.UniPushDTO;
    import lombok.AllArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * @author yuanDing
     * @version 1.0
     * @date 2025-01-10 10:40
     * uniPush 1.0推送工具类
     */
    @Slf4j
    @Configuration
    @AllArgsConstructor
    public class UniPushUtils {
    
        private final PushApi pushApi;
    
        private final UserApi userApi;
    
        /**
         * 单解绑
         * 解除绑定cid和userId(解除绑定别名)
         *
         * @return
         */
        public boolean unBoundingUserIdAndCId(CIdAliasDTO cIdAliasDTO) {
            return this.unBoundingUserIdAndCIdList(ListUtil.toList(cIdAliasDTO));
        }
    
        /**
         * 批量解绑
         * 解除绑定cid和userId(批量解除绑定别名)
         *
         * @return
         */
        public boolean unBoundingUserIdAndCIdList(List<CIdAliasDTO> cIdAliasDTOS) {
            return userApi.batchUnbindAlias(this.getCidAliasListDTO(cIdAliasDTOS)).isSuccess();
        }
    
        /**
         * 单绑
         * 绑定cid和userId(绑定别名)
         * 注意:1个cid只能绑定一个别名 1个别名最多只能绑定10个cid 超出以最后绑定为准
         *
         * @return
         */
        public boolean boundingUserIdAndCId(CIdAliasDTO cIdAliasDTO) {
            return this.boundingUserIdAndCIdList(new ArrayList<CIdAliasDTO>() {{
                add(cIdAliasDTO);
            }}).isSuccess();
        }
    
        /**
         * 多绑
         * 绑定cid和userId(绑定别名)
         * 注意:1个cid只能绑定一个别名 1个别名最多只能绑定10个cid 超出已最后绑定为准
         *
         * @return
         */
        public ApiResult<Void> boundingUserIdAndCIdList(List<CIdAliasDTO> cIdAliasDTOS) {
            return  userApi.bindAlias(this.getCidAliasListDTO(cIdAliasDTOS));
        }
    
        /**
         * 获取cid alias DTO
         * @param cIdAliasDTOS
         * @return
         */
        private CidAliasListDTO getCidAliasListDTO(List<CIdAliasDTO> cIdAliasDTOS) {
            CidAliasListDTO cidAliasListDTO = new CidAliasListDTO();
            // 0 普通别名 1系统别名
    //        cidAliasListDTO.setAliasType("1");
            ArrayList<CidAliasListDTO.CidAlias> cidAliases = new ArrayList<>();
            cIdAliasDTOS.forEach(aliasDTO -> {
                CidAliasListDTO.CidAlias cidAlias = new CidAliasListDTO.CidAlias();
                cidAlias.setAlias(aliasDTO.getAlias());
                cidAlias.setCid(aliasDTO.getCId());
                cidAliases.add(cidAlias);
            });
            cidAliasListDTO.setDataList(cidAliases);
            return cidAliasListDTO;
        }
    
        /**
         * 根据别名单推 alias参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByAlias(UniPushDTO uniPushDTO) {
            return pushApi.pushToSingleByAlias(this.getPushDTO(uniPushDTO , "alias")).isSuccess();
        }
    
        /**
         * 根据CId单推 cid参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByCId(UniPushDTO uniPushDTO) {
            return pushApi.pushToSingleByCid(this.getPushDTO(uniPushDTO , "cid")).isSuccess();
        }
    
        /**
         * 根据别名多推送 alias参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByAliasList(UniPushDTO uniPushDTO) {
    
            PushDTO pushDTO = new PushDTO();
            PushMessage pushMessage = new PushMessage();
            pushMessage.setTransmission(new JSONObject(uniPushDTO.getMessage()).toString());
            pushDTO.setPushMessage(pushMessage);
            ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
            if (msg.isSuccess()) {
                AudienceDTO audienceDTO = new AudienceDTO();
                audienceDTO.setTaskid(msg.getData().getTaskId());
                audienceDTO.setAsync(false);
    
                Audience audience = new Audience();
                for (String alias : uniPushDTO.getAliasList()) {
                    audience.addAlias(alias);
                }
                audienceDTO.setAudience(audience);
    
                // 发送推送消息
                return  pushApi.pushListByAlias(audienceDTO).isSuccess();
            }
    
            return false;
        }
    
        /**
         * 获取推送实体类
         * @param uniPushDTO
         * @param type
         * @return
         */
        public PushDTO<Audience> getPushDTO(UniPushDTO uniPushDTO , String type) {
            //根据cid进行单推
            PushDTO<Audience> pushDTO = new PushDTO<Audience>();
            // 设置推送参数,requestid需要每次变化唯一
            pushDTO.setRequestId(System.currentTimeMillis() + "");
            Settings settings = new Settings();
            pushDTO.setSettings(settings);
            //消息有效期,走厂商消息必须设置该值
            settings.setTtl(uniPushDTO.getTtl());
    
            //在线走个推通道时推送的消息体
            PushMessage pushMessage = new PushMessage();
            pushDTO.setPushMessage(pushMessage);
            //此格式的透传消息由 unipush 做了特殊处理,会自动展示通知栏。开发者也可自定义其它格式,在客户端自己处理。
            pushMessage.setTransmission(new JSONObject(uniPushDTO.getMessage()).toString());
            // 设置接收人信息
            Audience audience = new Audience();
            pushDTO.setAudience(audience);
    
    
            switch (type) {
                case "cid": uniPushDTO.getCIdList().forEach(audience::addCid);break;
                case "alias": uniPushDTO.getAliasList().forEach(audience::addAlias);break;
            }
    
            /**
             * 离线推送,暂未对接
             */
            /*        //设置离线推送时的消息体
            PushChannel pushChannel = new PushChannel();
            //安卓离线厂商通道推送的消息体
            AndroidDTO androidDTO = new AndroidDTO();
            Ups ups = new Ups();
            ThirdNotification thirdNotification = new ThirdNotification();
            ups.setNotification(thirdNotification);
            thirdNotification.setTitle("安卓离线展示的标题");
            thirdNotification.setBody("安卓离线展示的内容");
            thirdNotification.setClickType("intent");
            //注意:intent参数必须按下方文档(特殊参数说明)要求的固定格式传值,intent错误会导致客户端无法收到消息
            thirdNotification.setIntent("请填写固定格式的intent");
            androidDTO.setUps(ups);
            pushChannel.setAndroid(androidDTO);*/
    
            /**
             * ios暂未对接 后续对接完放开注释
             */
            //ios离线apn通道推送的消息体
    //        Alert alert = new Alert();
    //        alert.setTitle("苹果离线通知栏标题");
    //        alert.setBody("苹果离线通知栏内容");
    //        Aps aps = new Aps();
    //        aps.setContentAvailable(0);
    //        aps.setSound("default");
    //        aps.setAlert(alert);
    //        IosDTO iosDTO = new IosDTO();
    //        iosDTO.setAps(aps);
    //        iosDTO.setType("notify");
    
    //        pushChannel.setIos(iosDTO);
    //        pushDTO.setPushChannel(pushChannel);
    
    
            return pushDTO;
        }
    
    
    
    
    }
    
    
    • UniPushDTO.java

      package com.joolun.cloud.common.jiguang.dto;
      
      import cn.hutool.json.JSONObject;
      import lombok.AllArgsConstructor;
      import lombok.Builder;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      import java.util.List;
      
      /**
       * @author yuanDing
       * @version 1.0
       * @date 2025-01-10 9:40
       * uniPush 1.0个推推送领域类
       */
      @Data
      @Builder
      @AllArgsConstructor
      @NoArgsConstructor
      public class UniPushDTO {
      
          /**
           * 单推必填
           * 推送消息体 JSON格式
           *  title:标题
           *  content:内容
           *  payload:承载数据 最好传JSON,与前端接收初一致!
           */
          private Message message;
      
          /**
      
      
          /**
           * cid或alias二选一
           * 设备cid
           */
          private List<String> cIdList;
      
          /**
           * cid或alias二选一
           * 设备别名
           */
          private List<String> aliasList;
      
      
          /**
           * 离线推送必填,在线推送非必填
           * 消息离线时间设置,单位毫秒,-1表示不设离线, -1 ~ 3 * 24 * 3600 * 1000之间
           */
          private Integer ttl;
      
          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          public static class Message{
              /**
               *  title
               * 必传
               */
              private String title;
              /**
               *  content
               * 必传
               */
              private String content;
      
              // 必传
              private Object payload;
          }
      
      
      }
      
      
    • CIdAliasDTO.java

      package com.joolun.cloud.common.jiguang.entity;
      
      import lombok.AllArgsConstructor;
      import lombok.Builder;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      /**
       * @author yuanDing
       * @version 1.0
       * @date 2025-01-10 9:40
       * uniPush 1.0个推推送别名设备领域类
       */
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      @Builder
      public class CIdAliasDTO {
          /**
           * 设备cid
           */
          private String cId;
      
          /**
           * 别名
           */
          private String alias;
      
      }
      

6.测试推送


import cn.hutool.core.collection.ListUtil;
import cn.hutool.json.JSONObject;
import com.joolun.cloud.common.jiguang.dto.CIdAliasDTO;
import com.joolun.cloud.common.jiguang.dto.UniPushDTO;
import com.joolun.cloud.common.jiguang.util.UniPushUtils;
import com.joolun.cloud.mall.api.JooLunMallApiApplication;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;

/**
 * unipush 推送测试
 */
@SpringBootTest(classes = JooLunMallApiApplication.class)
public class UniPushTest {

    @Autowired
    private UniPushUtils uniPushUtils;

    /**
     * 绑定别名测试
     */
    @Test
    public void boundingTest() {
        boolean result = uniPushUtils.boundingUserIdAndCId(CIdAliasDTO.builder()
                .alias("15065606797")
                .cId("75328b5a6f777a1c853810340d9404ac")
                .build());
        System.out.println("voidApiResult = " + result);
    }

    /**
     * 根据cid推送测试
     */
    @Test
    public void pushByCIdTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .cIdList(ListUtil.toList("3d9d4ceecd51c5b147a0e3ab6edb72e0"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("速归")
                        .payload("测试")
                        .build())
                .build();
        boolean result = uniPushUtils.pushByCId(uniPushDTO);
        System.out.println("result = " + result);
    }

    /**
     * 根据别名单推推送测试
     */
    @Test
    public void pushByAliasTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .aliasList(ListUtil.toList("1790974474554609665"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("聚城测试")
                        .payload("测试")
                        .build())
                .build();

        boolean result = uniPushUtils.pushByAlias(uniPushDTO);
        System.out.println("result = " + result);
    }

    /**
     * 根据别名多推推送测试
     */
    @Test
    public void pushByAliasListTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .aliasList(ListUtil.toList("1790974474554609665" , "15065606797" , "4565456"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("聚城测试")
                        .payload("测试")
                        .build())
                .build();
        boolean result = uniPushUtils.pushByAliasList(uniPushDTO);
        System.out.println("result = " + result);
    }


    /**
     * 单解绑测试
     */
    @Test
    public void unBoundingTest() {

        boolean result = uniPushUtils.unBoundingUserIdAndCId( CIdAliasDTO.builder()
                .alias("1790974474554609665")
                .cId("3d9d4ceecd51c5b147a0e3ab6edb72e0")
                .build());
        System.out.println("result = " + result);
    }
}

三、uniapp端订阅消息事件(未配置不影响推送,用户收到消息后的后续操作)

  • App.vue

    onLaunch: function() {
          service.saveLogInfo("********************** App启动 ************************")
          //#ifdef APP-PLUS
          var info = plus.push.getClientInfo() // 获取clientId
          console.log(`info` , info)
          if (info && info.clientid) {
            Vue.prototype.$publicStore.cid = info.clientid
          }
    
          // 以下为订阅监听消息事件,如有需要放开
    
          // 使用5+App的方式进行监听消息推送 点击消息回调
          plus.push.addEventListener("click", function(msg) {
            if (msg.payload) {
              // 订单下单通知
              if (msg.payload.signature === 'order') {
                uni.navigateTo({
                  url: '/pages/mall/order/list?status=1'
                })
              }
            }
    
          }, false);
    
          // 监听在线消息事件
          plus.push.addEventListener("receive", function(msg) {
    							//业务代码
    							console.log("recevice:" + JSON.stringify(msg))
    
          }, false);
    
    
    		//#endif
    		
    
    		},
    

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

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

相关文章

华为昇腾910B1基于 LoRA 的 Qwen2.5-7B-Instruct 模型微调

目录 系统环境虚拟环境微调模型yaml文件training_losstraining_eval_loss 系统环境 Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run Ascend-hdk-910b-npu-firmware_7.5.0.1.129.run Ascend-cann-toolkit_8.0.RC3.alpha003_linux-aarch64.run Ascend-cann-kernels-910…

窥探QCC518x/308x系列与手机之间的蓝牙HCI记录与分析 - 手机篇

今天要介绍给大家的是, 当我们在开发高通耳机时如果遇到与手机之间相容性问题, 通常会用Frontline或Ellisys的Bluetooth Analyzer来截取资料分析, 如果手边没有这样的仪器, 要如何窥探Bluetooth的HCI log.这次介绍的是手机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 U…

【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)

文章目录 一、应用场景二、墨卡托投影1、知识点2、Arcgis中的坐标系选择 三、操作步骤1、数据转换2、数据加载3、栅格投影4、地理配准 一、应用场景 地理配准是数字化之前必须进行的一项工作。扫描得到的地图数据通常不包含空间参考信息&#xff0c;需要通过具有较高位置精度的…

【云岚到家】-day02-客户管理-认证授权

第二章 客户管理 1.认证模块 1.1 需求分析 1.基础概念 一般情况有用户交互的项目都有认证授权功能&#xff0c;首先我们要搞清楚两个概念&#xff1a;认证和授权 认证: 就是校验用户的身份是否合法&#xff0c;常见的认证方式有账号密码登录、手机验证码登录等 授权:则是该用…

VUE学习笔记(入门)5__vue指令v-html

v-html是用来解析字符串标签 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

二、华为交换机 Trunk

一、Trunk功能 Trunk口主要用于连接交换机与交换机&#xff08;或路由器&#xff09;&#xff0c;允许在一条物理链路上传输多个VLAN的数据。这大大增加了网络的灵活性和可扩展性&#xff0c;使得不同VLAN之间的通信变得更加便捷。 二、作用原理 标签处理&#xff1a;Trunk口能…

基于SSM的自助购药小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

AI守护煤矿安全生产:基于视频智能的煤矿管理系统架构解析

前言 本文我将介绍我和我的团队自主研发设计的一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。 这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的…

SpringCloud -根据服务名获取服务运行实例并进行负载均衡

Nacos注册中心 每个服务启动之后都要向注册中心发送服务注册请求&#xff0c;注册中心可以和各个注册客户端自定义协议实现服务注册和发现。 pom.xml <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-na…

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

Android CustomTextField

在 Compose 中开发用户界面时&#xff0c;需要处理输入框和键盘的交互&#xff0c;例如在键盘弹出时调整布局位置&#xff0c;避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【338-342】

338. 零钱通消费 package com.masterspark.smallchange;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;public class SmallChangeSys {public static void main(String[] args) {//1. 先完成显示菜单&#xff0c;并可以选择菜单&#…

Mac M1处理器uiautomatorviewer 使用

问题 Android自带工具uiautomatorviewer在mac电脑上运行报错 解决 有位大神解决了这个问题 项目网址&#xff1a;https://github.com/TarCV/uiautomatorviewer-gradle ./gradlew installDist JAVA_OPTS-XstartOnFirstThread ./build/install/uiautomatorviewer-gradle/bin…

【漫话机器学习系列】054.极值(Extrema)

极值&#xff08;Extrema&#xff09; 定义 极值是数学分析和优化问题中的一个核心概念&#xff0c;指函数在某个定义域内取得的最大值或最小值。根据极值的性质&#xff0c;可以将其分为两类&#xff1a; 局部极值&#xff08;Local Extrema&#xff09;&#xff1a;函数在…

QT开发技术 【基于TinyXml2的对类进行序列化和反序列化】一

一、对TinyXml2 进行封装 使用宏 实现序列化和反序列化 思路&#xff1a; 利用宏增加一个类函数&#xff0c;使用序列化器调用函数进行序列化 封装宏示例 #define XML_SERIALIZER_BEGIN(ClassName) \ public: \virtual void ToXml(XMLElement* parentElem, bool bSerialize …

代码随想录训练营第五十一天| 99.岛屿数量 深搜 岛屿数量 广搜 100.岛屿的最大面积

99.岛屿数量 深搜 题目链接&#xff1a;99. 岛屿数量 讲解链接&#xff1a;代码随想录 就是dfs模版题目 在dfs里可以先定义方向数组移动 再遍历分别向四个方向移动 同时记得更新当前nextx nexty 再判断是否越界 再执行判断条件 当前位置未走过 visited[i][j] false 一开始jav…

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局

目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例&#xff0c;复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…

【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键

文章目录 进程创建再次认识fork()函数fork()函数返回值 写时拷贝fork常规⽤法以及调用失败的原因 进程终⽌进程终止对应的三种情况进程常⻅退出⽅法_exit函数exit函数return退出 进程等待进程等待的必要性进程等待的⽅法 进程创建 再次认识fork()函数 fork函数初识&#xff1…

学习MyBatis的调优方案

MyBatis是一款优秀的Java持久层框架&#xff0c;它简化了数据库操作&#xff0c;并提供了灵活的SQL查询机制。然而&#xff0c;在实际应用中&#xff0c;我们可能会遇到一些性能问题&#xff0c;这时需要对MyBatis进行合理的调优。本文将详细探讨MyBatis的调优方案&#xff0c;…