使用springboot每日推送早安问候语到用户微信【部署篇】

news2024/9/20 10:41:25

上一篇介绍文章

上一篇介绍文章

https://blog.csdn.net/weixin_45206218/article/details/127872136

代码仓库

代码仓库

https://gitee.com/stevezhaozps/daily-weather

前期准备

  • 一台云服务器
  • 云服务器安装MySQL8.x
  • 云服务器安装jdk8

数据库初始化

由于本项目使用的是springdatajpa,所以不需要我们手动建表,只需要建数据库启动项目,会自动建表

CREATE DATABASE daily_weather;

这里提供数据库备份

/*
 Navicat Premium Data Transfer

 Source Server         : win11
 Source Server Type    : MySQL
 Source Server Version : 50740 (5.7.40-log)
 Source Host           : localhost:3306
 Source Schema         : daily_weather

 Target Server Type    : MySQL
 Target Server Version : 50740 (5.7.40-log)
 File Encoding         : 65001

 Date: 17/11/2022 15:03:50
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_info
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info`  (
  `id` bigint(20) NOT NULL,
  `bir_time` datetime NULL DEFAULT NULL,
  `city` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `create_time` datetime NULL DEFAULT NULL,
  `district_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `nickname` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  `scq_time` datetime NULL DEFAULT NULL,
  `type` int(11) NULL DEFAULT NULL,
  `update_time` datetime NULL DEFAULT NULL,
  `wechat_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

项目配置

如何申请见上一篇文章

server:
  port: 43310
# 微信配置
tencent:
  wechat:
    appId: 微信申请appid
    appSecret: 微信申请appSecret
  # 模板消息集合
  templatelist:
    - type: 1
      templateId: 模板id
    - type: 2
      templateId: 模板id
    - type: 3
      templateId: 模板id
# 百度天气配置
baidu:
  server: https://api.map.baidu.com
  ak: 百度申请的ak
# 天行数据
tianxin:
  server: http://api.tianapi.com
  key: 天行数据的key
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/daily_weather?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: 数据库用户
    password: 数据库密码
    hikari:
      minimum-idle: 5
      # 空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 180000
      # 连接池最大连接数,默认是10
      maximum-pool-size: 10
      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      # 连接池名称
      pool-name: MyHikariCP
      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      connection-test-query: SELECT 1
  jpa:
    show-sql: true # 默认false,在日志里显示执行的sql语句
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建
      naming:
        #指定jpa的自动表生成策略,驼峰自动映射为下划线格式7
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
        #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# 日志
#logging:
#  config: classpath:logback-spring-dev.xml

项目结构介绍

在这里插入图片描述

  • advice : 负责统一封装处理前端返回数据格式
  • common : 统一结果封装
  • config: 项目配置
  • domain: 实体类
  • enums: 服务状态枚举类
  • exception: 异常处理和自定义异常
  • job: 定时任务
  • remote: 第三方接口调用,使用openfeign
  • repository: 数据库操作层,dao/mapper层
  • rest: 视图控制层
  • service: 业务处理层

统一结果封装
注意返回String类型需要特殊处理

package com.zhao.wechat.advice;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhao.wechat.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 对前端响应结果统一封装
 */
@Slf4j
@RestControllerAdvice(basePackages = {"com.zhao.wechat.rest"})
public class ApiResponseAdvice implements ResponseBodyAdvice<Object> {


	/**
	 * 打印统一请求响应规范
	 */
	ApiResponseAdvice(){
		log.info("启动请求统一响应规范... ...");
	}


	/**
	 * 判断是否需要对返回值进行封装
	 * @param returnType the return type
	 * @param converterType the selected converter type
	 * @return
	 */
	@Override
	public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
		// 如果返回的结果是Result.class类型就不用封装
		if (returnType.getParameterType().equals(Result.class)){
			return false;
		}
		return true;
	}

	/**
	 * 对返回前端的值统一封装
	 * @param body the body to be written
	 * @param returnType the return type of the controller method
	 * @param selectedContentType the content type selected through content negotiation
	 * @param selectedConverterType the converter type selected to write to the response
	 * @param request the current request
	 * @param response the current response
	 * @return
	 */
	@Override
	public Object beforeBodyWrite(Object body,
								  MethodParameter returnType,
								  MediaType selectedContentType,
								  Class<? extends HttpMessageConverter<?>> selectedConverterType,
								  ServerHttpRequest request,
								  ServerHttpResponse response) {
	 if (returnType.getParameterType().equals(String.class)){
		 // 如果是String类需要特殊处理
		 ObjectMapper objectMapper = new ObjectMapper();
		 try {
			 // 设置响应数据格式为json
			 response.getHeaders().add("content-type","application/json;charset=UTF-8");
			 return objectMapper.writeValueAsString(Result.success(body));
		 } catch (JsonProcessingException e) {
			 throw new RuntimeException(e);
		 }
	 }
	 return Result.success(body);
	}

}

项目打包

  • 找到maven
  • 先点clean清理,再点package打包
    在这里插入图片描述
    在target找到jar包,准备上传到云服务器
    在这里插入图片描述

项目部署

xftp 上传文件 + xshell

通过xftp上传到云服务器

在这里插入图片描述

xshell执行jar

切换到当前jar目录下

# 启动
java -jar daily-weather-1.0.0.jar >/dev/null 2&1 &
# 启动成功会出现log目录,cd到log目录下可查看项目运行日志,有无报错

# 查看项目是否在运行
ps -ef | grep daily-weather-1.0.0.jar
# 可看到线程的pid
kill -9 pid号,可以杀死当前运行的项目

通过swagger访问

正常启动成功后,使用公网ip:端口/doc.html可以访问swagger页面

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

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

相关文章

LIVOX HAP激光雷达使用方法

一、Livox HAP介绍 Livox HAP 由 Livox 团队耗时两年精心打造&#xff0c;是 Livox 首款面向智能辅助驾驶市场研发的车规级激光雷达。HAP 于 2021 年在全新自建的车规级智能制造中心进行批量生产&#xff0c;可满足 74 项严苛的车规可靠性要求。HAP 已成功为小鹏汽车、一汽解放…

C#【必备技能篇】Release下的pdb文件有什么用,是否可以删除?

文章目录一、简介二、问答三、Release中删除pdb文件四、重要事项一、简介 英文全称&#xff1a;Program Database File 中文全称&#xff1a;程序数据库 文件 程序数据库 (PDB) 文件保存着调试和项目状态信息&#xff0c;使用这些信息可以对程序的调试配置进行增量链接。 在…

ORCID以及ResearcherID注册

ORCID以及ResearcherID注册 ORCID 网址&#xff1a; https://orcid.org/ 点击注册 开始注册 跟着流程走一遍 最后登录进入个人首页&#xff0c;可以看到自己的ORCID。 ResearcherID 网址&#xff1a;https://webofscience.com 注册 邮箱点击确认邮件后&#xff0c;登录进…

操作系统 | 实验七 SPOOLING技术

文章目录一、实验目的二、实验内容三、数据结构3.1 数据结构3.2 函数以及功能四、程序流程图五、实验代码六、实验结果七、实验体会总结一、实验目的 理解和掌握SPOOLING假脱机技术 二、实验内容 通过SPOOLING技术可将一台物理I/O设备虚拟为多台逻辑I/O设备&#xff0c;同样…

奇技淫巧第7期

终于腾出时间了&#xff0c;现在对3~11月份知识点作总结。 这段时间主要在写论文&#xff0c;跑案例分析。暑期的比赛另写了一个小系列&#xff0c;这里就不再写了。 总的来说&#xff0c;零散的代码知识点在积累几个月后还是要汇总回顾一下的。 文章目录Python 歪门邪道fnmatc…

SpringBoot SpringBoot 开发实用篇 3 测试 3.7 匹配响应体【JSON】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇3 测试3.7 匹配响应体【JSON】3.7.1 问题引入3.7.2 匹配响应体【JSON…

力扣刷题day50|739每日温度、496下一个更大元素 I

文章目录739. 每日温度暴力思路单调栈思路什么时候用单调栈&#xff1f;解题思路496. 下一个更大元素 I思路单调栈739. 每日温度 力扣题目链接 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对…

[Games 101] Lecture 11-12 Geometry 2 (Curves and Surfaces)

Lecture 11-12 Geometry 2 (Curves and Surfaces) Curves Bzier Curves 贝塞尔曲线 使用一系列的控制点定义某个曲线&#xff0c;控制点定义曲线满足的一些性质可以定义出唯一的曲线&#xff0c;从 p0p_0p0​ 开始&#xff0c;p3p_3p3​ 结束 de Casteljau Algorithm 绘制贝…

Linux16 ---共享内存、操作函数、使用示例

一、共享内存 1、 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间&#xff0c;多个进程可以将其映射到自己的虚拟地址空间中。 所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由 malloc 分配的一样。如果某…

(二)Easyexcel 的使用(读取数据到map集合中)

前面讲述了使用实体类的方式绑定excel表头的方式进行读取和写入操作&#xff0c;是比较简单的&#xff0c;那么由于表头可能会变&#xff0c;那么就不能使用绑定实体类的方式进行了&#xff0c;于是搜索百度一番&#xff0c;借鉴别人的博客&#xff0c;使用map集合的方式进行读…

一文详解Cookie 和 Session 会话技术

目录 Cookie Session 分布式下Seesion的不足 Cookie 定义&#xff1a;Cookie是服务器发送到浏览器&#xff0c;并保存在浏览器端的一小块数据。浏览器下次访问该服务器时&#xff0c;会自动携带该数据块&#xff0c;将其发送给服务器。 作用&#xff1a;由于HTTP是无状态的&…

tomcat修改默认端口详细步骤(包含运行测试)

前言&#xff1a; 在tomcat端口被占用或者需要把默认的8080端口换成其他的端口&#xff0c;就可以修改默认端口。 一、修改步骤 1.打开tomacat的文件位置--conf目录 2.找到server.xml右键打开方式选择记事本打开 3.找到这个文件的Connector port "8080" 大概位…

TVM 中文站正式上线!最全机器学习模型部署「参考书」它来了

内容一览&#xff1a; 近日&#xff0c;由 MLC 社区志愿者共同翻译校对的 TVM 中文文档正式发布&#xff0c;现已托管至超神经官网 Hyper.AI。 关键词&#xff1a; TVM 开源 机器学习编译器 本文首发自微信公众号&#xff1a;HyperAI超神经 面世5年&#xff0c;TVM成备受追捧的…

tensorflow2.0 学习笔记:一、神经网络计算

mooc课程Tensorflow2.0 笔记 人工智能三学派 行为主义&#xff1a;基于控制论&#xff0c;构建感知-动作控制系统&#xff08;自适应控制系统&#xff09;符号主义&#xff1a;基于算数逻辑表达式&#xff0c;求解问题时先把问题描述为表达式&#xff0c;再求解表达式&#x…

AMD EPYC(霄龙)Genoa服务器 | 综合评测

9004 | EYPC | 9654P | AMD 9654 | 7703 | Genoa | Intel 当生命科学、医药研发、东数西算、数据分析、数据挖掘、算力、数据中心、智算中心、遥感测绘、地质遥感等场景逐渐成熟&#xff0c;上层应用场景改变了底层硬件基础&#xff0c;计算、存储、网络架构的迭代升级和调整融…

win11连接共享打印机错误0x00000709

连接共享打印机出现错误0x00000709是常见的打印机错误了&#xff0c;但是用户升级到win11系统之后还遇到了同样的问题&#xff0c;这该如何解决&#xff1f;今天小编就给大家带来详细的解决办法&#xff0c;一起来看看。 方法一、卸载补丁 Win10卸载有问题的补丁KB5006667或KB5…

java项目-第145期ssm汽车在线销售系统-java毕业设计_计算机毕业设计

java项目-第145期ssm汽车在线销售系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm汽车在线销售系统》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、车辆信息、新闻资讯、留言反馈、我的、跳…

OpenCV图像处理——直方图

总目录 图像处理总目录←点击这里 十二、直方图 12.1、原理 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果…

电容笔哪个品牌好?十大电容笔知名品牌

如今&#xff0c;电容笔越来越受欢迎&#xff0c;性能也越来越好。如何挑选出一款物美价廉的电容笔&#xff0c;就成了一件非常头疼的事情。许多人将其用于日常生活&#xff0c;所以人们都在寻找更好、更经济的电容笔。那么&#xff0c;电容笔的牌子是最便宜、最值得我们入手呢…

骁龙AR2平台解析:分布式架构开启轻量化AR眼镜新时代

在今天的骁龙峰会2022上&#xff0c;高通面向轻量化AR眼镜推出了专属SoC&#xff1a;第一代骁龙AR2平台&#xff0c;这套方案将骁龙XR1、骁龙XR2的单片式方案&#xff0c;改为多芯片分布式SoC方案&#xff0c;同时融合了分离式渲染&#xff0c;实现一整套的AR/VR与智能手机、PC…