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

【易售小程序项目】后端部署、Uniapp项目Web部署

文章目录

  • Uniapp项目Web打包部署
    • 为什么不部署小程序
    • Web打包前对项目进行调整
      • 网站、小程序切换
        • 增加constant.js来控制常量
        • 将js绑定到main.js的全局变量中
      • WebSocket差异
      • 监听键盘呼出
      • 导航条
      • 打包
      • 部署
  • 后端项目打包部署
    • 打包前准备
    • 打包
    • 部署

Uniapp项目Web打包部署

为什么不部署小程序

因为小程序部署审核比较严格,还需要备案,而且我现在还没有完全开发完成(研究生开学之后,基本没有时间开发了),到时候再摸索一下吧。之所以还没有开发完成我就部署,是因为我那弱小的服务器已经时日不多了/(ㄒoㄒ)/~~,再不部署就白买了

在这里插入图片描述
在这里插入图片描述

Web打包前对项目进行调整

客户端的开发是基于uniapp,uniapp的一个优点是支持跨平台,一次开发可以多端适配,即开发一次可以打包成小程序、网站、安卓等程序,但并没有想象的这么简单,不同平台之间支持的组件、功能还是有所差距的,如下图所示。因为之前的开发是根据微信小程序来开发的,如键盘呼出事件的处理、websocket的连接方式、页面的导航条都需要调整

在这里插入图片描述

网站、小程序切换

对项目调整让其可以适配网站的前提是不能丧失原有对小程序的适配,因此不能直接修改项目的代码来适配网站,而是增加代码来完成对网站的适配,再增加一个切换开关来控制,这样在打包之前就可以控制是打包为小程序还是网站程序

增加constant.js来控制常量

在这里插入图片描述

// 类型 0:小程序 1:网站
const softType = 1;
// socket的ip:端口
const socketUrl = '23.23.147.200:8085';
// const socketUrl = '10.23.17.164:8085';export default {softType,socketUrl
}
将js绑定到main.js的全局变量中

在这里插入图片描述

import Constant from "@/constant/constant.js"
Vue.prototype.Constant = Constant

后面直接使用this.Constant.softType来获取常量的值即可

在这里插入图片描述

WebSocket差异

【连接差异】

/*** 创建websocket连接*/
initWebsocket() {// console.log("this.socket:" + JSON.stringify(this.$socket))// this.$socket == null,刚刚进入首页,还没有建立过websocket连接// this.$socket.readyState==0 表示正在连接当中// this.$socket.readyState==1 表示处于连接状态// this.$socket.readyState==2 表示连接正在关闭// this.$socket.readyState==3 表示连接已经关闭let socket = null;if (this.Constant.softType == 0) {socket = this.$socket;} else if (this.Constant.softType == 1) {socket = this.$store.state.ws;}if (socket == null || (socket.readyState != 1 && socket.readyState != 0)) {// --if--小程序类型let socketUrl = this.Constant.socketUrl;// console.log("socketUrl:" + socketUrl)if (this.Constant.softType == 0) {this.$socket = uni.connectSocket({url: "ws://" + socketUrl + "/websocket/" + uni.getStorageSync("curUser").userName,success(res) {console.log('WebSocket连接成功', res);},})// 监听WebSocket连接打开事件this.$socket.onOpen((res) => {console.log("websocket连接成功")Vue.prototype.$socket = this.$socket;// 连接成功,开启心跳this.headbeat();});// 连接异常this.$socket.onError((res) => {console.log("websocket连接出现异常");// 重连this.reconnect();})// 连接断开this.$socket.onClose((res) => {console.log("websocket连接关闭");// 重连this.reconnect();})} else if (this.Constant.softType == 1) {// --if--网站类型socket = new WebSocket("ws://" + socketUrl + "/websocket/" + uni.getStorageSync("curUser").userName);// 网站类型//监听WebSocket连接打开事件let _that = this;socket.onopen = function() {console.log("websocket连接成功")// Vue.prototype.Constant.WebSocket = socket;console.log("常量socket:" + JSON.stringify(socket));store.commit("SET_WS", socket);// console.log("Vue.prototype.$socket:" + Vue.prototype.WebSocket)// 连接成功,开启心跳_that.headbeat();};socket.onmessage = function(msg) {console.log("接收到socket服务器的数据====" + JSON.stringify(msg))};// 连接异常socket.onerror = function() {console.log("websocket连接出现异常");// 重连_that.reconnect();};// 连接断开socket.onclose = function() {console.log("websocket连接关闭");// 重连_that.reconnect();};}}
},

【发送消息差异】

/*** 发送消息*/
send() {if (this.messageInput != '') {let message = {from: this.me.userName,to: this.you.username,text: this.messageInput}// console.log("this.socket.send:" + this.$socket)// 将组装好的json发送给服务端,由服务端进行转发if (this.Constant.softType == 0) {this.$socket.send({data: JSON.stringify(message)});} else if (this.Constant.softType == 1) {// 网站类型let socket = this.$store.state.ws;socket.send(JSON.stringify(message));}this.total++;let newMessage = {// code: this.messageList.length,type: 1,content: this.messageInput};this.messageList.push(newMessage);this.messageInput = '';this.toBottom();}
},

【接收消息差异】

/*** 接收消息*/
receiveMessage() {if (this.Constant.softType == 0) {this.$socket.onMessage((response) => {// console.log("接收消息:" + response.data);let message = JSON.parse(response.data);let newMessage = {// code: this.messageList.length,type: 0,content: message.text};this.messageList.push(newMessage);this.total++;// 让scroll-view自动滚动到最新的数据那里this.toBottom();})} else if (this.Constant.softType == 1) {// 网站类型let socket = this.$store.state.ws;let _that = this;socket.onmessage = function(response) {console.log("接收消息:" + response.data);let message = JSON.parse(response.data);let newMessage = {// code: this.messageList.length,type: 0,content: message.text};_that.messageList.push(newMessage);this.total++;// 让scroll-view自动滚动到最新的数据那里_that.toBottom();};}
},

监听键盘呼出

在这里插入图片描述
在这里插入图片描述

onReady() {// 监听键盘高度变化,以便设置输入框的高度(适用于小程序,不适用于网站)uni.onKeyboardHeightChange(res => {if (this.Constant.softType == 0) {let keyBoardHeight = res.height;this.chatSuitable(keyBoardHeight);}})
},methods: {/*** 键盘呼出(适用于网站)*/keyboardUp(value, height) {if (this.Constant.softType == 1) {this.chatSuitable(height);}},/*** 键盘呼出时,聊天框自适应缩短*/chatSuitable(keyBoardHeight) {this.scrollViewHeight = `calc(100vh - 20px - 44px - ${keyBoardHeight}px)`;this.scrollToView = '';setTimeout(() => {this.scrollToView = 'message' + this.messageList[this.messageList.length - 1].id;}, 150)},
}

导航条

使用安卓手机打开网页时,上面已经有导航标题了,因此可以隐藏掉小程序的标题,不然重复的标题显得多余。

在这里插入图片描述

uniapp自带的标题无法直接使用代码来隐藏,uniapp只提供了设置导航栏的颜色和内容的方法(可能是我没有找到)

在这里插入图片描述
因此我只能想到直接修改配置文件pages.json的方式,通过设置navigationStylecustom来实现,当需要切换成小程序来打包时,可以通过将custom替换为default来实现

在这里插入图片描述

打包

uniapp项目的打包h5程序较为简单,首先修改配置文件的运行的基础路径修改为./,作用是将程序运行的基础路径设为当前路径,而不是默认的根目录,使得程序在不同的环境中更加灵活,可以更方便地进行部署和迁移

在这里插入图片描述
修改完成之后,使用菜单栏下面的发行操作即可完成打包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部署

打包成功之后,将这两个文件拖入到服务器的文件夹中即可部署,我部署的方式使用宝塔面板,具体步骤可以学习SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)的前端部署下面的宝塔部署

在这里插入图片描述
在这里插入图片描述

后端项目打包部署

后端项目基于若依管理系统进行开发

打包前准备

创建两个配置文件来分别存储开发环境和生产环境的配置,application.yml可以用来存储开发环境和生产环境的公共配置,例如mysql、redis、rabbitmq这些中间件,开发时可能是使用的本地电脑进行开发,部署时使用的是云服务器,因为开发环境和生产环境中中间件的ip和端口有所不同,因此使用两个文件来进行区分,方便切换

在这里插入图片描述
在application.yml中可以指定使用dev还是prod文件,当然,在打包之前并不需要对其进行修改,因为在运行jar包的时候还可以二次指定jar包运行的端口、使用的内存、使用的配置文件……,如java -Xmx256M -Xms256M -jar sss-enterprise-0.0.1-SNAPSHOT.jar --server.port=6002 --spring.profiles.active=prod

在这里插入图片描述

打包

打包直接使用maven工具里面的cleaninstall命令即可,因为若依管理系统已经在pom.xml中内置了打包配置

在这里插入图片描述
在这里插入图片描述

部署

本文使用的是若依的单机版本,并非微服务版本,因此只需要在服务器中启动admin的jar包即可,具体的操作步骤可以学习SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)

在这里插入图片描述

相关文章:

【易售小程序项目】后端部署、Uniapp项目Web部署

文章目录 Uniapp项目Web打包部署为什么不部署小程序Web打包前对项目进行调整网站、小程序切换增加constant.js来控制常量将js绑定到main.js的全局变量中 WebSocket差异监听键盘呼出导航条打包部署 后端项目打包部署打包前准备打包部署 Uniapp项目Web打包部署 为什么不部署小程…...

prometheus监控kafka

一、前言 关于对kafka的监控,要求高的话可以使用kafka-exorter和jmx-exporter一起收集监控数据,要求不高的情况下可以使用kafka-exporter收集监控数据即可 二、部署 kafka-exporter 部署kafka-exporter,我是在k8s集群中部署的 编辑yaml文件…...

【STL】:list用法详解

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关list的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构…...

SQL Wildcards 通配符

SQL Wildcards 通配符 通配符用于替换字符串中的任何其他字符。 通配符与 SQL LIKE 运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与 LIKE 运算符一起使用: % - 百分号表示零个,一个或多个字符_ - 下…...

入门必学 | R语言for循环的常规应用

文章目录 何为判断语句在for循环中添加判断语句嵌套循环 在上一节中,我们介绍了迭代与for循环,并对for循环的结构与原理进行了深入的介绍。在这一节中,我们将分享for循环的常规应用,包括在其中加入判断语句与嵌套循环。 何为判断语…...

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包,用于构建跨平台应用程序,支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo,支持linux/windows/mac/android/ios操作系统,此demo在ubuntu桌面环境下测试成功。…...

int怎么转成QString?

2023年10月31日,周二晚上 要将 int 类型转换为 QString,可以使用 QString::number() 方法。 下面是一个示例代码: int number 123; QString str QString::number(number);还可以在转换时指定进制,比如将整数转换为十六进制的字…...

JavaScript进阶(二十九): 走近 es6 之 new.target

文章目录 一、前言二、new.target 重写三、拓展阅读 一、前言 源码阅读过程中,发现以下语句 new.target.prototype鉴于该语法为es6所有,项目在编译过程中,控制台报Unexpected token: punc(.)错误。按照常规处理,应用babel-loade…...

JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…...

RabbitMQ学习02

Hello World&#xff08;Java&#xff09; 1.导入依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration&g…...

android中的Package安装、卸载、更新替换流程

android系统在安装&#xff0c;删除&#xff0c;替换&#xff0c;清除数据等与应用相关的动作时&#xff0c;会发出对应的Broadcast&#xff0c;上层的应用通过注册相应的广播事件来做相应的处理。 官方文档中给出了详尽的罗列&#xff1a; ACTION_PACKAGE_ADDED 一个新应用包已…...

思维训练第三课 反意疑问句

系列文章目录 文章目录 系列文章目录前言一、什么是反意疑问句二、反意疑问句的回答&#x1f49a;主系表/主谓宾&#xff08;肯定&#xff09;&#xff0c;否定提问1、一般现在时2、一般过去时3、一般将来时4、现在完成时 &#x1f49b; 主谓宾1、一般现在2、一般过去3、一般将…...

nvm安装步骤

注意事项 不要安装任何版本的node.js&#xff0c;有的话卸载干净&#xff01;注意&#xff1a;要卸载干净了&#xff01; 安装步骤&#xff1a; nvm下载 点击exe文件安装 安装目录选择&#xff1a;D:\NVM 下一步创建nodejs文件放在D:\NVM 下&#xff0c;然后一直next到最后 …...

关于比较级(内含名词比较级)

在比较级中&#xff0c;修饰形容词一般使用more 或者-er的变体&#xff0c;但是怎么修饰名词呢&#xff1f; 即&#xff0c;如果我们想表达&#xff1a;你能不能表现得更马屁精一点&#xff1f;这种针对一个具体名词的程度升级怎么表达呢&#xff1f; 使用be more of 名词的…...

【算法|动态规划 | 线性dp | 最长上升子序列模型No.1】AcWing1017.怪盗基德的滑翔翼 AcWing1014.登山

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家…...

2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;道路运输企业主要负责人证模拟考试题库是根据道路运输企业主要负责人最新版教材&#…...

Linux学习第26天:异步通知驱动开发: 主动

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开启今天的学习前&#xff0c;讲一讲为什么标题中加入了【主动】俩字。之前学习的阻塞和非阻塞IO&#xff0c;都是在被动的接受应用程序的操作。而今天的学…...

SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换

SpringBoot核心配置 SpringBoot配置文件分类 SpringBoot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用 application.properties或者application.yml&#xff08;application.yaml&#xff09;进…...

把Qt6.2.4内置的标签打印了一遍

2023年10月31日&#xff0c;周二晚上 #include <QGridLayout> #include <QPushButton> #include <QLabel> #include <QApplication> #include <QStyle>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;widget.set…...

element-ui 表单校验・大全

目录 1、对全部表单项的校验2、校验指定字段3、自定义函数校验表单4、一行内多个输入框的校验 element-ui 官网 element-ui 表单校验的规则如下&#xff1a; <属性名>: [{ required: true,// 是否必填&#xff08;若有label则在其左上角显示红点&#xff0c;否则不显示必…...

Circuit Playground Express 硬件解析与四步编程实战:从创客入门到项目开发

1. 项目概述&#xff1a;为什么选择 Circuit Playground Express 作为创客起点 如果你对硬件编程、物联网或者智能设备感兴趣&#xff0c;但又被 Arduino Uno 上密密麻麻的杜邦线和面包板劝退&#xff0c;或者觉得树莓派 Zero 的 Linux 系统门槛太高&#xff0c;那么 Adafruit…...

基于SpringBoot的民宿预订与评价系统毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的民宿预订与评价系统以解决当前旅游住宿服务领域存在的信息不对称问题用户体验碎片化问题以及数据管理分散化问题该…...

启扬RK3568核心板如何赋能智能炒菜机:从嵌入式主控到AI烹饪

1. 项目概述&#xff1a;当嵌入式核心板遇上智能炒菜机在餐饮后厨这个看似传统&#xff0c;实则对效率、成本和一致性要求极高的领域&#xff0c;痛点一直非常明确。人工炒菜&#xff0c;老师傅的手艺固然可贵&#xff0c;但出餐速度受限于体力&#xff0c;菜品口味因厨师状态、…...

组合模式实战:统一处理树形结构,提升代码简洁性与可维护性

1. 项目概述&#xff1a;从“树”到“森林”的统一管理哲学在软件开发的日常里&#xff0c;我们常常会遇到一种让人头疼的结构&#xff1a;部分与整体的层次关系。想象一下&#xff0c;你正在开发一个图形界面系统&#xff0c;里面有简单的按钮、文本框&#xff0c;也有复杂的面…...

对比Taotoken与直接购买官方API在账单清晰度上的差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比Taotoken与直接购买官方API在账单清晰度上的差异 效果展示类&#xff0c;从个人开发者或小团队的实际使用经历出发&#xff0c…...

如何免费解锁Cursor AI Pro功能:终极三步激活指南

如何免费解锁Cursor AI Pro功能&#xff1a;终极三步激活指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial r…...

如何使用witr快速定位占用端口的神秘进程?完整指南

如何使用witr快速定位占用端口的神秘进程&#xff1f;完整指南 【免费下载链接】witr Why is this running? 项目地址: https://gitcode.com/GitHub_Trending/wi/witr 你是否曾经遇到过端口被占用却不知道是哪个进程在捣乱的情况&#xff1f;&#x1f62b; 想要启动Web…...

魔兽争霸3终极优化指南:三步告别卡顿与显示异常

魔兽争霸3终极优化指南&#xff1a;三步告别卡顿与显示异常 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的卡顿、掉帧…...

暑期旅游网络诈骗演化与 AI 赋能防御体系研究

摘要 2026 年暑期旅游旺季到来&#xff0c;在线预订、短信通知、证件办理等全流程成为网络诈骗高发场景。The420.in 于 2026 年 5 月 16 日发布的安全预警显示&#xff0c;虚假通行费钓鱼短信、AI 伪造房源预订、虚假政务证件网站、深度伪造语音与视频四类诈骗呈产业化、规模化…...

初创公司如何利用Taotoken以可控成本试用多模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初创公司如何利用Taotoken以可控成本试用多模型 对于资源有限的初创团队而言&#xff0c;在产品开发中引入大模型能力是一个充满机…...