ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于uniapp+Spring Boot的房产中介小程序全栈开发实战

基于uniapp+Spring Boot的房产中介小程序全栈开发实战 在房产中介这个行当摸爬滚打多年我一直想把手里的房源管理、客户预约这些事儿搬到线上。市面上现成的中介SaaS系统要么太贵要么功能绑手绑脚数据还不一定在自己手里。所以去年我决定自己撸一套技术栈就锁定了uniapp Spring Boot前端做微信小程序后端统一走接口。这套组合在中小型业务系统里非常典型既能吃到微信的流量红利又能用Java生态的稳定和成熟踩了不少坑也沉淀了不少经验今天把整套系统的搭建思路和核心代码逻辑一次性分享出来。这套系统最终能做什么简单说就是三个端用户在小程序里浏览房源、搜索筛选、收藏预约经纪人在后台管理房源上下架、处理预约管理员做权限分配和数据统计。对个人开发者或者小型创业团队来说这个项目是一个很完整的全栈练手实战覆盖了微信登录、文件上传、权限拦截、订单预约等高频业务场景。如果你正在准备面试或者手头刚好有类似的外包单子这篇文章的实操细节可以直接拿来用。1. 整体方案设计与后端架构拆解1.1 前端为什么选定uniapp后端为什么是Spring Boot先说我为什么没选原生小程序开发。uniapp最大的优势是一套代码能同时编译到微信小程序、H5、甚至Android和iOS的App端。房产中介这个业务有个特点经纪人经常在外面跑他们更习惯用App或者H5去管理房源而消费者主要走小程序。如果全用原生开发等于要维护三套代码成本直接翻倍。uniapp基于Vue语法上手曲线比原生WXML平缓得多社区里的插件也够全。后端用Spring Boot没什么悬念。Java在中小型管理系统的优势在于生态成熟、招人容易、稳定性高尤其面对房产这类涉及资金和隐私数据的业务Java的类型安全和事务管理能力还是比PHP或Node.js让人放心。我用的是Spring Boot 2.7.x版本搭配MyBatis-Plus做数据持久化JWT做无状态登录校验Redis做缓存和验证码存储。1.2 系统功能模块与数据库核心表设计功能模块划分直接决定数据库设计的精细程度。我的系统分成了六个核心模块用户模块微信授权登录、经纪人与管理员账号体系房源模块房源新增、编辑、上下架、审核、条件检索图片模块房源图上传、缩略图处理、图片删除预约模块用户发起看房预约、经纪人确认或拒绝收藏模块用户收藏房源、查看收藏列表统计模块经纪人业绩统计、房源浏览量统计数据库这块我踩过最深的坑就是房源表字段设计得太随意。房子这个东西属性特别多面积、朝向、楼层、装修、产权年限、是否唯一住房等等每一类房源关注的字段还不一样。一开始我想把所有字段都塞进一张表结果就是表宽到离谱查询效率低下扩展还特别麻烦。后来我调整成了主表加扩展表的方式house表存核心通用字段比如标题、价格、面积、户型、区域、详细地址、经纬度、上下架状态house_extra表存可变字段用JSON格式存储比如装修情况、看房时间、配套信息等等。查询的时候主表负责筛选详情页再根据id去取扩展信息性能好了不少逻辑也清晰了。核心表的DDL我大致这样设计CREATE TABLE house ( id bigint(20) NOT NULL AUTO_INCREMENT, title varchar(100) NOT NULL COMMENT 房源标题, cover_url varchar(500) DEFAULT NULL COMMENT 封面图, price decimal(10,2) NOT NULL COMMENT 售价/租金, area decimal(10,2) DEFAULT NULL COMMENT 面积(平米), bedroom_num tinyint(4) DEFAULT NULL COMMENT 居室数量, livingroom_num tinyint(4) DEFAULT NULL COMMENT 客厅数量, bathroom_num tinyint(4) DEFAULT NULL COMMENT 卫生间数量, house_type tinyint(4) NOT NULL COMMENT 房源类型: 1-二手房 2-新房 3-租房, status tinyint(4) NOT NULL DEFAULT 0 COMMENT 状态: 0-待审核 1-已上架 2-已下架 3-审核驳回, city varchar(50) DEFAULT NULL, district varchar(50) DEFAULT NULL, address varchar(255) DEFAULT NULL, latitude decimal(10,6) DEFAULT NULL, longitude decimal(10,6) DEFAULT NULL, owner_id bigint(20) NOT NULL COMMENT 所属经纪人ID, view_count int(11) DEFAULT 0, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_status_type (status,house_type), KEY idx_district_price (district,price) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT房源主表;这里要提醒一下idx_district_price这种复合索引在房产系统里特别重要。因为用户搜索房源时基本都会带区域价格两个条件如果你没有建复合索引数据库就会走全表扫描数据量一上来接口响应直接卡死。我亲眼见过房源表几万条数据没加索引前搜索接口耗时3秒多加上复合索引后直接降到100毫秒以内。1.3 前后端接口约定与通用返回结构前后端联调最怕的就是各写各的后端返回{code: 0}前端在等{success: true}光是字段对不上就能白忙一晚上。我从项目第一天就定死了统一返回结构。Data public class ApiResponseT { private Integer code; private String message; private T data; private Long timestamp; public static T ApiResponseT success(T data) { ApiResponseT response new ApiResponse(); response.setCode(200); response.setMessage(success); response.setData(data); response.setTimestamp(System.currentTimeMillis()); return response; } public static T ApiResponseT error(Integer code, String message) { ApiResponseT response new ApiResponse(); response.setCode(code); response.setMessage(message); response.setTimestamp(System.currentTimeMillis()); return response; } }所有接口都返回这个结构前端axios或者uni.request统一拦截。code为200走成功逻辑其他code统一弹Toast提示这样后端报错再也不会莫名其妙地让前端卡在一个状态里出不来。2. 微信小程序端核心功能落地2.1 微信登录与用户体系打通微信小程序登录是整套系统最基础的一环流程其实很固定wx.login获取临时codecode传到后端后端拿着code去微信接口换openid和session_key然后后端生成自己的登录态token返回给小程序。小程序后续请求都带着token后端解析token就知道是谁在操作。我这个项目里后端写了个AuthController核心代码思路是这样的PostMapping(/wx/login) public ApiResponseMapString, Object wxLogin(RequestBody WxLoginRequest request) { // 1. 用code换取openid String url https://api.weixin.qq.com/sns/jscode2session?appid appid secret secret js_code request.getCode() grant_typeauthorization_code; String result restTemplate.getForObject(url, String.class); JSONObject json JSONObject.parseObject(result); String openid json.getString(openid); // 2. 根据openid查用户不存在则自动注册 User user userMapper.selectByOpenid(openid); if (user null) { user new User(); user.setOpenid(openid); user.setNickname(微信用户 openid.substring(openid.length() - 6)); user.setAvatar(https://xxx/default-avatar.png); user.setRole(1); // 1-普通用户 2-经纪人 userMapper.insert(user); } // 3. 生成JWT token返回前端 String token JwtUtil.createToken(user.getId(), user.getRole()); MapString, Object data new HashMap(); data.put(token, token); data.put(userInfo, user); return ApiResponse.success(data); }这里要特别说一个经验坑千万不要把openid直接返给小程序端更不要在前端存储openid。openid属于用户敏感标识一旦被恶意拿到理论上可以伪造请求。正确做法是只返回后端生成的token前端所有请求都通过token来标明身份。token里我放了userId和role用JWT进行签名过期时间设成7天小程序端ReLaunch时会判断token是否存在来决定是跳登录页还是首页。2.2 房源条件检索与筛选防坑指南房源检索功能一旦条件多了前端处理起来就头疼。普通用户搜索房子的习惯是选个区域、拖个价格区间、点一下户型然后看列表。我的筛选页面用了uniapp的popup弹出层组件底部弹出筛选面板里面有三个核心筛选项区域单选、价格区间单选、户型多选比如三居、四居同时勾选。前端请求参数设计成这样// pages/house/search.vue filterData: { district: , // 区域编码 priceMin: , // 最低价 priceMax: , // 最高价 bedroomNums: [], // 户型数组可能同时选多个 page: 1, pageSize: 10 }这里有个小坑得重点说户型多选的时候后端不能用一个in语句就去查而是要判断每个居室字段是否在数组里。我的需求是用户勾了三居和四居那就要查出所有3居室和4居室的房源。这个用SQL的IN完全可以解决WHERE bedroom_num IN (3, 4)。但如果后续扩展了五居以上这种特殊选项条件拼接就要特殊处理。我当时的做法是如果数组里包含99代表五居以上就拼成(bedroom_num 5)其他情况用IN。后端MyBatis-Plus的条件构造器写法很简洁LambdaQueryWrapperHouse wrapper new LambdaQueryWrapper(); wrapper.eq(House::getStatus, 1) .eq(StringUtils.isNotBlank(district), House::getDistrict, district) .ge(priceMin ! null, House::getPrice, priceMin) .le(priceMax ! null, House::getPrice, priceMax) .in(bedroomNums ! null !bedroomNums.isEmpty(), House::getBedroomNum, bedroomNums) .orderByDesc(House::getCreateTime);筛选页面还有个体验细节用户调整完筛选条件之后列表应该自动回到第一页不然用户在第三页筛了个新条件结果数据不够页面变空白这就很尴尬。我在监听filterData变化时会把page重置成1再重新请求。2.3 房源详情页与预约看房流程房源详情页是整个小程序里最复杂的页面因为它要处理的内容太多轮播图、基础信息卡片、房源描述、经纪人卡片、底部操作栏收藏预约每个区域的数据来源还不一样。我建议详情页不要一次性把接口返回的数据全塞进页面里而是按照区块加载主数据放一个接口经纪人信息放一个接口相关推荐又放一个接口。这样后续维护也方便哪个模块出问题单独排查。详情页的下方操作栏左侧是收藏按钮右侧是立即预约。用户点击预约后会弹出一个半屏面板里面让用户选择看房日期和时段我预置了三个时段上午9:00-11:30、下午14:00-17:00、晚上19:00-21:00。用户选完时间和日期提交预约请求到后端后端生成预约单并更新房源状态为预约中同时给经纪人推送一条模板消息。预约接口的幂等性一定要考虑。用户在弱网环境下可能点了几次提交按钮导致同一套房源被重复预约。我的做法是后端在插入预约记录前先查一下同一房源同一用户同一日期是否已存在有效预约单存在就直接返回您已预约过请勿重复提交。前端也做了按钮loading控制提交期间按钮不可再点双重保障。2.4 uniapp获取路由参数的那些坑小程序页面跳转传参是高频操作但uniapp里获取路由参数有一个特殊情况你必须知道。我的房源列表页跳详情页是这样写的uni.navigateTo({ url: /pages/house/detail?id houseId });详情页在onLoad(options)里拿参数onLoad(options) { this.houseId options.id; this.getHouseDetail(); }大部分场景这样写没问题但如果你遇到从分享卡片进入小程序的情况路径会变成/pages/house/detail?houseId123fromshare这种带额外参数的格式这时候只拿options.id就会是undefined。我后来统一约定所有详情页跳转都用houseId作为参数名分享时也带上houseId页面里就对options.houseId做非空判断。还有一个坑是参数值如果包含特殊字符会丢比如中文传参会乱码要么encodeURIComponent编码要么全用数字id传参。我的方案是只传数字id简单粗暴没有编码烦恼。3. Spring Boot后端高价值场景实战3.1 接口鉴权拦截器与用户身份注入有了token机制拦截器自然少不了。我用Spring MVC的HandlerInterceptor做了一套登录拦截器放行登录注册接口、房源检索列表、房源详情这类公开接口拦截需要登录的操作。public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } String token request.getHeader(Authorization); if (StringUtils.isBlank(token)) { throw new BusinessException(401, 未登录或登录已过期); } Claims claims JwtUtil.parseToken(token); if (claims null) { throw new BusinessException(401, 登录状态无效请重新登录); } // 把userId放到request attribute里方便后续controller取 request.setAttribute(userId, claims.get(userId)); request.setAttribute(userRole, claims.get(role)); return true; } }拦截器的注册配置也有讲究。我见过很多人把addPathPatterns写成/**结果静态资源也被拦截。正确写法是排除静态资源路径和公开接口路径registry.addInterceptor(authInterceptor) .addPathPatterns(/api/**) .excludePathPatterns(/api/auth/wx/login, /api/house/list, /api/house/detail);这里有几个容易踩的坑。第一JWT解析失败要区分是过期还是篡改我在JwtUtil里捕获了不同异常并设置了不同的提示文案方便排查。第二拦截器里抛的业务异常要能被全局异常处理器捕获所以我的拦截器实现里不要catch Exception后直接response输出而是抛出去交给RestControllerAdvice统一处理这样返回的错误结构才是统一格式的JSON。3.2 房源图片上传与访问路径设计房源图片是小程序里占用资源最多的部分一套房源动辄八九张图每张原图2-3MB如果不做处理服务器存储告急、用户加载卡顿、小程序代码包的限制也容易爆。图片来源必须要做压缩处理。我在Spring Boot里用的方案是后端接收MultipartFile先做大小校验限制单张不超过5MB然后使用Thumbnator库生成两种尺寸的图片——原图压缩版和缩略图版文件名用UUID时间戳生成存到服务器的指定目录同时把访问路径写进数据库。public String uploadImage(MultipartFile file) { if (file.isEmpty() || file.getSize() 5 * 1024 * 1024) { throw new BusinessException(500, 图片不能为空且大小不能超过5MB); } String originalFilename file.getOriginalFilename(); String ext originalFilename.substring(originalFilename.lastIndexOf(.)); String fileName UUID.randomUUID().toString().replace(-, ) ext; // 保存原图 file.transferTo(new File(uploadDir /origin/ fileName)); // 生成缩略图 400x300 Thumbnails.of(new File(uploadDir /origin/ fileName)) .size(400, 300) .toFile(new File(uploadDir /thumb/ fileName)); return /upload/origin/ fileName; }图片访问路径我有两个方案犹豫了很久一是直接用Nginx映射静态目录http://yourdomain.com/upload/xxx.jpg简单省事二是把图片传到OSS利用CDN加速。考虑到成本和快速交付前期我用了Nginx方案但如果你的系统将来要做视频看房或者高清户型图展示OSS是必选项带宽和性能不是一个量级的。3.3 经纪人工作台的预约管理与状态流转预约看房是中介业务的转化关键后端这块的状态机设计我花了不少心思。预约单的状态我定义成五种状态码含义说明0待确认用户提交经纪人还没处理1已确认经纪人同意等待用户到场2已取消用户或经纪人取消3已完成看房结束已完成带看4已爽约到了时间用户没来状态流转必须严格限定不能让用户取消一个已完成的订单也不允许经纪人把已取消的订单改成已完成。这些判断我会在Service层统一校验不散落在Controller里。为了应付面试常问的事务问题这里我用了Spring的Transactional注解就加在预约状态更新方法上保证状态变更和日志记录在同一个事务里任何一步失败都能回滚避免出现状态改了但日志没记的脏数据。Transactional(rollbackFor Exception.class) public void confirmAppointment(Long appointmentId, Long brokerId) { Appointment appointment appointmentMapper.selectById(appointmentId); if (appointment null) { throw new BusinessException(500, 预约记录不存在); } if (!appointment.getBrokerId().equals(brokerId)) { throw new BusinessException(403, 无权操作该预约); } if (appointment.getStatus() ! 0) { throw new BusinessException(500, 当前状态不可确认); } appointment.setStatus(1); appointmentMapper.updateById(appointment); // 记录操作日志 appointmentLogMapper.insert(new AppointmentLog(appointmentId, brokerId, 经纪人确认预约)); }3.4 模板消息推送与用户触达预约确认之后用户希望第一时间收到通知小程序里最合适的触达方式是订阅消息。微信的订阅消息机制有个规则一次性订阅消息用户每点击授权一次后端才能推送一次。这意味着你不能随便给用户推送必须让用户主动订阅。我在用户提交预约的按钮上做了个处理提交成功后弹出订阅消息授权框让用户勾选订阅。用户授权后后端拿到用户的openid和订阅授权记录等经纪人确认预约时后端再调用微信的subscribeMessage.send接口把您的看房预约已确认推送给用户。调用微信推送接口要用到access_tokenaccess_token的有效期是2小时后端我会用Redis缓存每次发送前先检查缓存里有没有没有就重新获取。这个细节一定要处理不然每次发消息都重新获取access_token微信接口调用频次限制很容易被触发直接被封一段时间别问我是怎么知道的。4. 常见问题排查与上线避坑指南4.1 真机调试与开发者工具不一致的问题小程序开发最恼火的事就是开发者工具里跑得好好的一到真机上就出问题。我遇到最典型的两个场景第一个是软键盘弹起遮挡输入框。房源搜索页面有个价格输入框在开发者工具里点击输入键盘弹起后输入框自动上移但在iPhone真机上键盘经常把输入框挡住。这个问题我在网上搜了很多方案最后用了一个稳妥的方法监听输入框的focus事件手动调整页面容器的adjust-position属性并且给需要输入的input组件加上cursor-spacing属性让输入光标和键盘保持一定距离。第二个是地图组件在iOS上显示空白。房源详情页展示房源位置时我用的是uniapp的map组件。Android上显示正常iOS上却经常白屏。排查了很久才发现是scale属性的类型问题——我传的是字符串15iOS需要数字类型15。改掉之后就好了。这种问题在开发者工具上根本发现不了因为模拟器环境没有区分类型只有真机才会暴露。4.2 接口响应慢与数据库连接池配置接口响应慢基本是所有系统上线后第一个被用户吐槽的点。我的房源列表页一开始响应要800多毫秒用户体感明显卡顿。排查步骤如下先在后端接口入口加耗时日志发现耗时主要在SQL查询上再看SQL执行计划发现status、district这些高频查询字段原来没走索引全表扫描了再加上复合索引后响应降到200毫秒以内。数据库连接池我也踩过坑。Spring Boot默认的HikariCP配置虽然已经很优秀但默认的maximum-pool-size是10如果并发一上来连接池满了新的请求就要排队等待获取连接接口超时就出现了。我把连接池参数调成了下面这样压测下来稳定很多spring: datasource: hikari: maximum-pool-size: 30 minimum-idle: 10 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000这里想提醒一句连接池不是越大越好。设太大数据库自身的连接数也会成为瓶颈而且连接池维护本身也有开销。经验值是一个实例的数据库连接池上限50以内就足够了。如果是云数据库还要注意数据库侧的最大连接数限制别搞得数据库那边先爆了。4.3 小程序审核被拒的常见原因小程序上线必须过微信审核这关我前后被拒了四次每次都让人血压升高。总结最常见的拒绝理由给大家提前避坑审核第一大类类目不符。房产中介小程序在微信里属于房产-房产中介类目需要提供对应的资质证明。个人主体的小程序很难申请到这类目基本都是企业主体才可以。如果你的账号是个人主体就要考虑挂靠或者换成信息服务类目但功能上就不能直接出现带看、成交这类中介服务。这个在项目启动前就要和客户确认好主体资质不然开发完审核过不了那可真叫欲哭无泪。审核第二大类功能不完整或违规。比如用户协议和隐私政策弹窗缺失、用户拒绝授权后App直接退出、诱导分享朋友圈等。隐私政策弹窗是最基础的要求必须在用户首次打开小程序时弹出用户同意后才能调用任何接口。千万别想跳过或者做个假的隐藏掉微信那边有自动检测机制一旦发现直接打回严重的还会限制搜索和分享能力。4.4 微信支付对接踩坑与临时故障处理很多房源系统的闭环里都有支付环节比如租房付定金、二手房诚意金。微信支付v3的密钥配置特别容易出错这里我贴一个亲测可用的配置思路。微信支付v3需要三个关键配置商家号mchId、商户API私钥、证书序列号。这三个值任何一个对不上调用支付接口都会报错。我当时遇到过最诡异的问题是本地测试支付一切正常一部署到服务器就报商户号未设置。排查到最后发现是服务器上clock偏差超过了5分钟微信支付v3的签名对时间非常敏感超过5分钟的时间偏移就会被拒。同步一下系统时间支付立刻恢复正常。这个坑如果你遇到了可以先检查服务器时间。写这篇文章的时候微信支付v3对接还遇到了一个临时状况支付功能因为账户主体资质问题被微信暂时关闭了。这种小程序违规支付功能暂时无法使用的情况平台侧会有站内信通知查清楚是资质问题还是交易类目配置问题按照站内信的指引去申诉或修改等待平台重新开通即可。开发阶段你可以先用mock支付模拟走通整个下单回调逻辑不影响业务流程的开发。5. 部署上线与运维心得分享5.1 服务器配置与Nginx反向代理这套系统的部署我选择了一台2核4G的云服务器前期完全够用。Spring Boot的jar包直接用nohup java -jar挂在后台Nginx做反向代理把/api/路径转发到后端服务/upload/路径直接映射到图片存储目录。Nginx的核心配置长这样server { listen 80; server_name yourdomain.com; client_max_body_size 50m; location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /upload/ { alias /data/house-system/upload/; expires 7d; add_header Cache-Control public; } }client_max_body_size一定要设置不然后端接收大图时会被Nginx直接拦下来返回413错误。一开始我没加这个配置小程序里上传房源图在5MB以内但Nginx默认只允许1MB直接导致经纪人传个稍微大点的户型图就失败排查了半天才反应过来是Nginx这层的问题。HTTPS证书也是必须的。微信小程序正式环境要求所有请求都必须是HTTPS不能有明文HTTP的接口。我用的是阿里云或者腾讯云的免费证书一年一换虽然麻烦点但成本为零。配置好HTTPS之后记得在location里加上HTTP强制跳转HTTPS的规则用户在微信里打开的时候就不会出现半路请求被拦截的问题。5.2 日志监控与线上问题定位系统上线之后遇到问题不能靠猜日志监控是保命的工具。我项目里用了Logback按天生成日志文件同时把error级别的日志单独输出到一个文件方便快速排查线上报错。但日志只是第一步真正的问题定位还需要接口层面的监控。我在项目里加了一个简单的API耗时拦截器记录每个接口的处理时间超过500毫秒的接口都打上WARN日志。这个策略帮了我大忙有一次线上房源列表突然变慢翻日志发现大量请求都集中在某个接口上而且平均耗时超过800毫秒马上就去查对应SQL发现是数据量涨上来后一个索引失效了重新优化SQL并加了索引才恢复。如果想更省事可以直接在Spring Boot里接入Spring Boot Actuator配合Prometheus和Grafana做可视化监控但这个对个人项目来说略微有点重前期用日志加定时检查的方式就足够了。5.3 数据备份与迁移策略数据是房产中介系统最核心的资产房源信息、用户数据、预约记录一旦丢失后果不堪设想。数据库备份我用了最简单的cron定时任务每天凌晨备份一次0 2 * * * mysqldump -u username -ppassword house_db /data/backup/house_db_$(date \%Y\%m\%d).sql备份文件保留最近7天的再通过云存储定期同步到异地防止服务器硬盘坏了连备份一起丢。如果遇到数据库迁移其实也不复杂。先用mysqldump导出整个库再到新服务器上source导入注意字符集一定要统一导出导入都加--default-character-setutf8mb4参数否则中文内容会出现乱码别问我为什么特别提醒那又是一段不堪回首的经历。6. 关于这套系统的最后几句实话整套系统从需求分析到上线我大概花了两个月时间每天下班后写两三个小时。说实话房产中介系统单看每个功能点都不算难真正的难点在于把几十个页面、几十个接口串起来之后还能保持逻辑清晰、性能稳定。经历过一次数据库慢查询把服务搞挂经历过一次小程序审核被拒五连击经历过一次用户反馈说iOS上图片加载不出来每个问题背后都是实打实的教训。我想对正在搭建类似系统的朋友说技术选型上uniapp Spring Boot这套组合在中小型业务场景确实能打但更核心的是设计阶段的数据建模和接口约定这块磨刀不误砍柴工。版本迭代时也一定要留好扩展位比如微信支付这次临时不能用如果之前没有做好服务层的抽象隔离临时切换逻辑会非常痛苦。最后再分享一个小技巧uniapp项目的manifest.json里小程序AppID要填自己申请的千万别用测试号直接发布不然上线审核会报错而且每次发布前把uni-app编译成微信小程序版本先在微信开发者工具里跑一遍基础流程再提交能省掉大半审核驳回的时间。希望大家都能顺利把项目跑起来少走我踩过的这些弯路。
返回列表