前后端post传递double数组的解决方案(springboot后台接收微信小程序传递double数组)

本文档描述了在开发小程序时遇到的问题,即如何将小程序中的数值数组以double类型传递给Java后台。由于小程序HTTP请求发送的数据是字符串格式,因此需要在后台将接收到的字符串转换为double数组。解决方案包括自定义Spring Boot的Tomcat配置以允许特殊字符,并提供了一个将字符串转换为Double数组的方法。该方法通过去除字符串中的括号,然后使用逗号分隔字符串并逐个转换为double,最后自动装箱为Double数组。

一、项目场景:

开发的数学模型小程序需要传递double数组到java后台,由后台进行double数据类型(double为了提升运算精度)的处理。但是用小程序传递数组的时候发起 HTTPS 网络请求传递过来的是字符串形式


二、问题描述:

问题1:小程序传递数值数组

小程序端 :
小程序发起http请求用的是
wx.request(Object object)
查看官方文档是可以发送数组数据的
在这里插入图片描述
但是“最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。”
在这里插入图片描述

解决思路:将字符串转换为double数值型数组

问题2:springboot后台接收【】数组符号报错


三、原因分析:

关于tomcat8.5以上版本后端接收数组或Json报错的问题 参考链接


四、解决方案:

1.首先针对【】报错

在springboot启动项
同级别包中建立TomcatConfig类
参考:springboot 2.X后内置tomcat自定义配置
在这里插入图片描述

package com.example.demo;

import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
  @description: tomcat特殊字符处理问题
 */
@Configuration
public class TomcatConfig {
    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            //允许的特殊字符
            connector.setProperty("relaxedQueryChars", "|{}[]");
        });
        return factory;
    }
}

2.字符串转Double数组

  1. 利用字符串裁减函数 把括号去掉 “1,5,0.2,7”
String nums2 = nums.substring(1, nums.length() - 1);
  1. 以逗号为标记,拆分字符串
String numArray1[] = nums2.split(",");
  1. 字符串转double只能是单个值转,采取的方式是数组值转然后添加到数组里边。
Double.parseDouble(numArray1[i]);
  1. 一般转换为double就够了,但是这里因为模型类建立的是Double封装数据,需要的是Double【】,
    double转为Double,利用的是double–>Double自动装箱
 Double doubleArray[] = new Double[strArray.length]; //3. Double数组容器

 for (int i = 0; i < strArray.length; i++) {
 double d = Double.parseDouble(strArray[i]); //4.string 转 double
            System.out.println(d);
            doubleArray[i] = d;   //4.double-->Double自动装箱

        }

完整代码:

    public Double[] postToArray(String nums) {
        /* @author  wuyun
         * @param    nums
         * @return java.lang.Double[]
         * @function:将数组字符串(例如"[1,5,0.2,7]") 转换为 double类型的数值型数组
         */

        String nums2 = nums.substring(1, nums.length() - 1);  //1. 利用字符串裁减函数 括号去掉 “1,5,0.2,7”

        String strArray[] = nums2.split(",");   //  2.以逗号为标记,拆分字符串

        Double doubleArray[] = new Double[strArray.length]; //3. Double数组容器

        for (int i = 0; i < strArray.length; i++) {
            double d = Double.parseDouble(strArray[i]);  //4.string 转 double
            System.out.println(d);
            doubleArray[i] = d;   //4.double-->Double自动装箱

        }
        System.out.println("=====截取除[]之外的纯数字,转换为 double类型的数值型数组 :doubleArray[i]=======");
        for (Double D : doubleArray) {
            System.out.println(D);
        }
        return doubleArray;
    }
<think>好的,用户想要构建一个基于SpringBoot、MySQL和微信小程序的个人健康管理系统,需要技术架构指导、代码示例或教程。首先,我需要整理这个系统的整体架构,确保前后端分离,同时考虑微信小程序的接口对接。 用户提到的引用中有几个相关的毕业设计项目,比如引用1、2、4都是关于健康管理系统的,引用3是图书管理系统,但架构类似。这些引用提供了技术栈的参考,比如Spring Boot、MySQL 5.7、微信小程序开发工具等,需要确认这些技术版本是否适用当前项目。 首先,技术选型方面,后端用Spring Boot,数据库用MySQL 5.7,前端微信小程序。可能需要使用MyBatis-Plus来简化数据库操作,引用中提到的Maven版本3.6.1或3.3.9,用户应该选择合适的版本。另外,后端和前端通过RESTful API交互,需要设计清晰的接口。 接下来是系统架构的分层设计,通常包括控制层、服务层、数据访问层和实体层。需要确保各层职责明确,比如控制层处理HTTP请求,服务层实现业务逻辑,数据访问层与数据库交互。此外,微信小程序端需要调用后端API,因此需要配置跨域支持和安全认证,比如使用JWT。 数据库设计是关键,用户可能需要管理健康数据、用户信息、运动记录等。根据引用中的功能模块,可能需要用户表、健康数据表、运动记录表、饮食记录表等。需要设计字段和表之间的关系,比如用户ID作为外键关联其他表。 代码示例方面,用户可能需要一个简单的Spring Boot控制器示例,以及MyBatis-Plus的配置和使用。比如创建UserController处理用户注册,使用MyBatis-Plus的BaseMapper简化CRUD操作。同时,微信小程序的页面需要调用wx.request访问后端接口,这部分也需要示例代码。 部署方面,需要指导用户如何打包Spring Boot应用,配置Tomcat服务器,以及部署MySQL数据库。可能还需要说明如何申请微信小程序账号,配置域名和HTTPS,确保小程序能够正常访问后端服务。 另外,用户可能需要了解如何实现具体功能模块,比如健康数据录入、图表展示等。可以建议使用ECharts或微信小程序自带的图表库来可视化数据。同时,提醒用户注意数据安全和隐私保护,比如加密存储用户信息,使用HTTPS输数据。 最后,生成相关问题,帮助用户深入解决可能遇到的难点,比如性能优化、第三方服务集成、数据同步等。确保用户能够根据提供的架构和示例继续开发和扩展系统。</think>### 基于SpringBoot+MySQL+微信小程序的个人健康管理系统架构指南 #### 一、系统整体架构设计 采用分层架构模式,分为四层结构: $$系统架构 = 微信小程序前端 + SpringBoot后端 + MySQL数据库 + 第三方服务$$ 1. **微信小程序端**:负责用户交互和数据展示,通过`wx.request`调用后端接口 2. **SpringBoot后端**:采用RESTful API设计,包含: - 控制层(Controller):处理HTTP请求 - 服务层(Service):业务逻辑处理 - 数据访问层(DAO):通过MyBatis-Plus操作数据库[^1] 3. **MySQL数据库**:存储用户信息、健康数据、运动记录等结构化数据 4. **第三方服务**:集成微信登录、位置服务、消息推送等能力 #### 二、技术栈选型参考 | 层级 | 技术选型 | |----------|----------------------------------------------------------------------| | 前端 | 微信小程序原生开发 + WXML/WXSS + Vant Weapp组件库 | | 后端 | Spring Boot 2.7.x + MyBatis-Plus 3.5.x + Spring Security + JWT认证 | | 数据库 | MySQL 5.7 + Redis缓存(可选) | | 开发工具 | IntelliJ IDEA +微信开发者工具 + Navicat数据库管理工具 | | 部署 | Nginx反向代理 + Tomcat 9.x + JDK1.8 | #### 三、核心模块代码示例 1. **SpringBoot实体类设计**(使用Lombok简化代码) ```java @Data @TableName("health_data") public class HealthData { @TableId(type = IdType.AUTO) private Long id; private Integer userId; private LocalDate recordDate; private Double weight; // 体重(kg) private Integer heartRate; // 心率 private Integer steps; // 步数 } ``` 2. **MyBatis-Plus配置**(application.yml) ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/health_db?useSSL=false&serverTimezone=Asia/Shanghai username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml configuration: map-underscore-to-camel-case: true ``` 3. **RESTful API接口示例** ```java @RestController @RequestMapping("/api/health") public class HealthController { @Autowired private HealthService healthService; @PostMapping("/data") public Result addHealthData(@RequestBody HealthData healthData) { return Result.success(healthService.save(healthData)); } @GetMapping("/{userId}") public Result getHealthData(@PathVariable Integer userId) { return Result.success(healthService.getByUserId(userId)); } } ``` #### 四、数据库设计关键表结构 1. **用户表(user)** ```sql CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `openid` VARCHAR(50) NOT NULL COMMENT '微信openid', `nickname` VARCHAR(50) DEFAULT NULL, `gender` TINYINT(1) DEFAULT 0 COMMENT '0-未知 1-男 2-女', `height` DECIMAL(5,2) DEFAULT NULL COMMENT '身高(cm)', PRIMARY KEY (`id`), UNIQUE KEY `idx_openid` (`openid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 2. **健康数据表(health_data)** ```sql CREATE TABLE `health_data` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `user_id` INT(11) NOT NULL, `record_date` DATE NOT NULL, `weight` DECIMAL(5,2) DEFAULT NULL, `heart_rate` INT(11) DEFAULT NULL, `steps` INT(11) DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` #### 五、微信小程序关键实现 1. **获取用户信息**(app.js) ```javascript wx.login({ success: res => { wx.request({ url: 'https://yourdomain.com/api/wx/login', method: 'POST', data: { code: res.code }, success: (res) => { wx.setStorageSync('token', res.data.token) } }) } }) ``` 2. **提交健康数据**(health.js) ```javascript Page({ submitData: function() { wx.request({ url: 'https://yourdomain.com/api/health/data', method: 'POST', header: { 'Authorization': 'Bearer ' + wx.getStorageSync('token') }, data: { weight: this.data.weight, heartRate: this.data.heartRate }, success: (res) => { wx.showToast({ title: '记录成功' }) } }) } }) ``` #### 六、部署建议 1. **服务器要求**: - 最低配置:1核CPU/2GB内存/50GB硬盘 - 推荐配置:2核CPU/4GB内存/SSD硬盘 2. **安全配置**: - 启用HTTPS(小程序强制要求) - 配置Spring Security进行接口鉴权[^2] - 使用JWT实现无状态认证 3. **性能优化**: - 添加Redis缓存层(存储会话信息、热点数据) - 使用MyBatis-Plus分页插件实现数据分页 - 配置连接池(HikariCP推荐)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值