【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想深入鉆研技術細節,還是探尋商城運營之道,本專欄都能提供從 0 到 1 的系統講解,助力你打造獨具競爭力的電商平臺,開啟電商實戰之旅。
目錄
- 一、核心數據分析指標定義與實現
- 1.1 GMV 指標
- 1.2 轉化率指標
- 1.3 用戶留存率指標
- 二、構建指標計算模型
- 2.1 指標計算方法
- 2.2 數據來源確定
- 2.3 實現源碼展示
- 三、建立指標監控體系
- 3.1 實時跟蹤方案
- 3.2 趨勢展示實現
- 3.3 異常預警機制
一、核心數據分析指標定義與實現
1.1 GMV 指標
GMV(Gross Merchandise Volume)即總銷售額,是衡量商城業務規模的重要指標。它反映了在一定時期內商城通過銷售商品所獲得的總收入,包含了所有已完成訂單的商品總價,無論這些訂單是否最終發生退貨或退款。通過分析 GMV,我們可以直觀地了解商城的銷售表現,評估業務增長趨勢,進而為制定營銷策略、規劃庫存等提供數據支持。
在后端,利用 Spring Boot 和 MyBatis-Plus 實現計算 GMV 的接口。假設我們的訂單表名為order,其中包含訂單金額字段order_amount,可以通過以下代碼實現:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> {public Double calculateGMV() {QueryWrapper<Order> wrapper = new QueryWrapper<>();// 假設order_amount是訂單金額字段wrapper.select("SUM(order_amount) as gmv");return baseMapper.selectMaps(wrapper).stream().findFirst().map(map -> (Double) map.get("gmv")).orElse(0.0);}
}
對應的 Controller 層代碼如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate OrderServiceImpl orderService;@GetMapping("/gmv")public Double getGMV() {return orderService.calculateGMV();}
}
在前端,使用 uniapp 時,可以通過以下代碼調用該接口展示 GMV 數據:
<template><view><text>GMV: {{ gmv }}</text></view>
</template><script>
export default {data() {return {gmv: 0};},onLoad() {this.fetchGMV();},methods: {fetchGMV() {uni.request({url: 'http://your-server-url/gmv',success: (res) => {this.gmv = res.data;},fail: (error) => {console.log(error);}});}}
};
</script>
使用 Element plus 時,假設在一個 Vue 組件中:
<template><el-card><div slot="header">GMV統計</div><p>GMV: {{ gmv }}</p></el-card>
</template><script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';const gmv = ref(0);onMounted(() => {axios.get('http://your-server-url/gmv').then(response => {gmv.value = response.data;}).catch(error => {console.log(error);});
});
</script>
1.2 轉化率指標
轉化率在商城中通常指購買轉化率,即完成購買行為的用戶數量與訪問商城或特定商品頁面的用戶數量之比。它體現了商城引導用戶完成購買的能力,是衡量商城運營效果和用戶體驗的關鍵指標。較高的轉化率意味著商城在商品展示、用戶引導、購物流程等方面表現良好,能夠有效地將流量轉化為實際銷售;反之,則需要深入分析原因,進行針對性優化。
后端實現計算轉化率的接口,假設我們有用戶訪問記錄表user_visit和訂單表order,user_visit表記錄了用戶的訪問信息,order表記錄了訂單信息。可以通過以下代碼計算購買轉化率:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class ConversionRateServiceImpl extends ServiceImpl<ConversionRateMapper, ConversionRate> {public Double calculateConversionRate() {// 計算訪問用戶數QueryWrapper<UserVisit> visitWrapper = new QueryWrapper<>();Long visitCount = baseMapper.selectCount(visitWrapper);// 計算下單用戶數QueryWrapper<Order> orderWrapper = new QueryWrapper<>();orderWrapper.select("DISTINCT user_id");Long orderUserCount = baseMapper.selectMaps(orderWrapper).size();if (visitCount == 0) {return 0.0;}return (double) orderUserCount / visitCount;}
}
對應的 Controller 層代碼:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConversionRateController {@Autowiredprivate ConversionRateServiceImpl conversionRateService;@GetMapping("/conversion-rate")public Double getConversionRate() {return conversionRateService.calculateConversionRate();}
}
前端 uniapp 調用示例:
<template><view><text>購買轉化率: {{ conversionRate }}</text></view>
</template><script>
export default {data() {return {conversionRate: 0};},onLoad() {this.fetchConversionRate();},methods: {fetchConversionRate() {uni.request({url: 'http://your-server-url/conversion-rate',success: (res) => {this.conversionRate = res.data;},fail: (error) => {console.log(error);}});}}
};
</script>
Element plus 前端調用示例:
<template><el-card><div slot="header">轉化率統計</div><p>購買轉化率: {{ conversionRate }}</p></el-card>
</template><script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';const conversionRate = ref(0);onMounted(() => {axios.get('http://your-server-url/conversion-rate').then(response => {conversionRate.value = response.data;}).catch(error => {console.log(error);});
});
</script>
1.3 用戶留存率指標
用戶留存率是指在某一時間段內新注冊或首次訪問的用戶,在經過一段時間后仍然繼續使用商城的比例。它反映了商城對用戶的粘性和吸引力,是衡量商城長期運營健康程度的重要指標。高留存率意味著用戶對商城的產品和服務滿意,愿意持續使用;低留存率則可能暗示存在用戶流失問題,需要分析原因,采取措施提高用戶留存。
后端使用 Spring Boot 和 MyBatis-Plus 編寫查詢用戶留存數據的代碼,假設我們有用戶表user和用戶登錄記錄表user_login,user_login表記錄了用戶的登錄時間等信息。通過以下代碼計算不同時間段的用戶留存率,這里以次日留存率為例:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;import java.util.Date;@Service
public class UserRetentionServiceImpl extends ServiceImpl<UserRetentionMapper, UserRetention> {public Double calculateNextDayRetentionRate() {// 獲取前一天的日期Date yesterday = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);// 計算前一天新注冊用戶數QueryWrapper<User> newUserWrapper = new QueryWrapper<>();newUserWrapper.ge("register_time", yesterday);Long newUserCount = baseMapper.selectCount(newUserWrapper);// 計算前一天新注冊且在次日登錄的用戶數QueryWrapper<UserLogin> loginWrapper = new QueryWrapper<>();loginWrapper.select("DISTINCT user_id");loginWrapper.ge("login_time", new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000)).inSql("user_id", "SELECT id FROM user WHERE register_time >= " + yesterday.getTime());Long retainedUserCount = baseMapper.selectMaps(loginWrapper).size();if (newUserCount == 0) {return 0.0;}return (double) retainedUserCount / newUserCount;}
}
對應的 Controller 層代碼:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserRetentionController {@Autowiredprivate UserRetentionServiceImpl userRetentionService;@GetMapping("/next-day-retention-rate")public Double getNextDayRetentionRate() {return userRetentionService.calculateNextDayRetentionRate();}
}
uniapp 前端展示留存率數據示例:
<template><view><text>次日留存率: {{ nextDayRetentionRate }}</text></view>
</template><script>
export default {data() {return {nextDayRetentionRate: 0};},onLoad() {this.fetchNextDayRetentionRate();},methods: {fetchNextDayRetentionRate() {uni.request({url: 'http://your-server-url/next-day-retention-rate',success: (res) => {this.nextDayRetentionRate = res.data;},fail: (error) => {console.log(error);}});}}
};
</script>
Element plus 前端展示留存率數據示例:
<template><el-card><div slot="header">用戶留存率統計</div><p>次日留存率: {{ nextDayRetentionRate }}</p></el-card>
</template><script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';const nextDayRetentionRate = ref(0);onMounted(() => {axios.get('http://your-server-url/next-day-retention-rate').then(response => {nextDayRetentionRate.value = response.data;}).catch(error => {console.log(error);});
});
</script>
二、構建指標計算模型
2.1 指標計算方法
- GMV 計算方法:GMV 的計算是將所有訂單的金額進行累加。在數據庫中,訂單表order的order_amount字段記錄了每個訂單的金額,通過 SQL 的SUM函數可以實現對所有訂單金額的求和操作。例如:
SELECT SUM(order_amount) as gmv FROM order;
用流程圖表示如下:
st=>start: 開始
op1=>operation: 從訂單表獲取所有訂單記錄
op2=>operation: 提取每條訂單記錄的order_amount字段
op3=>operation: 對所有提取的order_amount字段進行求和
e=>end: 返回GMV結果
st->op1->op2->op3->e
- 轉化率計算方法:購買轉化率是下單用戶數與訪問用戶數的比值。需要從用戶訪問記錄表user_visit中統計訪問用戶數,從訂單表order中統計下單用戶數。具體步驟如下:
-
- 統計訪問用戶數:
SELECT COUNT(*) as visit_count FROM user_visit;
-
- 統計下單用戶數:
SELECT COUNT(DISTINCT user_id) as order_user_count FROM order;
-
- 計算轉化率:轉化率 = 下單用戶數 / 訪問用戶數 。
用偽代碼表示計算過程:
visitCount = selectCountFromUserVisit()
orderUserCount = selectDistinctUserIdCountFromOrder()
conversionRate = orderUserCount / visitCount if visitCount != 0 else 0
- 用戶留存率計算方法:以次日留存率為例,先獲取前一天新注冊的用戶數,再統計這些新注冊用戶中在次日登錄的用戶數,最后計算兩者的比值。假設用戶表user的register_time字段記錄了用戶注冊時間,用戶登錄記錄表user_login的login_time字段記錄了用戶登錄時間,計算步驟如下:
-
- 獲取前一天的日期:
Date yesterday = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
-
- 統計前一天新注冊用戶數:
SELECT COUNT(*) as new_user_count FROM user WHERE register_time >= {yesterday};
-
- 統計前一天新注冊且在次日登錄的用戶數:
SELECT COUNT(DISTINCT user_id) as retained_user_count FROM user_login
WHERE login_time >= {tomorrow} AND user_id IN (SELECT id FROM user WHERE register_time >= {yesterday});
-
- 計算次日留存率:次日留存率 = 前一天新注冊且在次日登錄的用戶數 / 前一天新注冊用戶數 。
用流程圖表示如下:
st2=>start: 開始
op4=>operation: 計算前一天日期
op5=>operation: 從用戶表統計前一天新注冊用戶數
op6=>operation: 從用戶登錄表統計前一天新注冊且次日登錄用戶數
op7=>operation: 計算次日留存率
e2=>end: 返回次日留存率結果
st2->op4->op5->op6->op7->e2
2.2 數據來源確定
- 訂單表:在指標計算中起著關鍵作用。對于 GMV 計算,order表的order_amount字段提供了訂單金額數據;對于轉化率計算,order表的user_id字段用于統計下單用戶數。訂單表結構設計如下:
CREATE TABLE order (id BIGINT AUTO_INCREMENT PRIMARY KEY,order_no VARCHAR(50) NOT NULL,user_id BIGINT NOT NULL,order_amount DECIMAL(10, 2) NOT NULL,order_status INT DEFAULT 0,create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
字段說明:
- id:訂單唯一標識。
- order_no:訂單編號。
- user_id:下單用戶 ID。
- order_amount:訂單金額。
- order_status:訂單狀態。
- create_time:訂單創建時間。
- 用戶表:對于用戶留存率計算,user表的register_time字段用于確定新注冊用戶。用戶表結構設計如下:
CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(100) NOT NULL,register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
字段說明:
- id:用戶唯一標識。
- username:用戶名。
- password:用戶密碼。
- register_time:用戶注冊時間。
- 用戶訪問記錄表:在轉化率計算中,user_visit表的記錄用于統計訪問用戶數。用戶訪問記錄表結構設計如下:
CREATE TABLE user_visit (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,visit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,visit_page VARCHAR(100)
);
字段說明:
- id:訪問記錄唯一標識。
- user_id:訪問用戶 ID。
- visit_time:訪問時間。
- visit_page:訪問頁面。
通過 MyBatis-Plus 從這些表中獲取數據時,利用其強大的查詢構造器QueryWrapper,可以方便地構建復雜的查詢條件,確保數據獲取的準確性和高效性。例如,在獲取 GMV 時,使用QueryWrapper構建求和查詢:
QueryWrapper<Order> wrapper = new QueryWrapper<>();
wrapper.select("SUM(order_amount) as gmv");
baseMapper.selectMaps(wrapper);
2.3 實現源碼展示
- Service 層代碼:以計算 GMV 為例,在 Spring Boot 的 Service 層實現計算 GMV 的邏輯。
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> {public Double calculateGMV() {// 使用MyBatis - Plus的QueryWrapper構建查詢條件QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.select("SUM(order_amount) as gmv");// 執行查詢并獲取結果return baseMapper.selectMaps(wrapper).stream().findFirst().map(map -> (Double) map.get("gmv")).orElse(0.0);}
}
這段代碼中,首先創建了一個QueryWrapper對象,通過select方法指定要查詢的字段為SUM(order_amount) as gmv,即對order_amount字段求和并別名為gmv。然后通過baseMapper.selectMaps(wrapper)執行查詢,返回一個包含查詢結果的List<Map<String, Object>>。最后通過流操作獲取第一個結果,并提取其中的gmv值,若結果為空則返回 0.0。
- Mapper 層代碼:由于使用了 MyBatis-Plus,無需手寫 Mapper 文件,BaseMapper已經提供了基本的數據庫操作方法。在上述 Service 層代碼中,baseMapper即為繼承自BaseMapper的OrderMapper,它會根據QueryWrapper構建的查詢條件自動生成 SQL 語句并執行數據庫操作,充分體現了 MyBatis - Plus 無需手寫 Mapper 文件的優勢 ,大大提高了開發效率,減少了重復代碼的編寫。例如在計算 GMV 時,baseMapper.selectMaps(wrapper)這一行代碼就完成了復雜的數據庫查詢操作,開發者無需關心具體的 SQL 實現細節。
三、建立指標監控體系
3.1 實時跟蹤方案
為了實現對 GMV、轉化率、用戶留存率等指標的實時跟蹤,我們可以采用多種技術方案。其中,Spring Boot 的定時任務注解@Scheduled是一種簡單有效的方式。通過在后端服務中使用該注解,可以定時執行指標計算方法,確保數據的實時更新。例如,對于 GMV 指標的定時計算:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class GMVMonitor {private final OrderServiceImpl orderService;public GMVMonitor(OrderServiceImpl orderService) {this.orderService = orderService;}// 每小時計算一次GMV@Scheduled(fixedRate = 60 * 60 * 1000)public void calculateGMVPeriodically() {Double gmv = orderService.calculateGMV();// 可以將計算出的GMV保存到緩存或數據庫中,以便前端獲取// 例如:redisTemplate.opsForValue().set("currentGMV", gmv);}
}
上述代碼中,@Scheduled(fixedRate = 60 * 60 * 1000)表示該方法每小時執行一次,通過調用orderService.calculateGMV()計算 GMV,并可將結果進行后續處理,如保存到緩存中。
另外,集成消息隊列如 RabbitMQ 也是一種不錯的選擇。當訂單狀態更新、用戶訪問等事件發生時,發送消息到消息隊列,消費者端接收到消息后實時計算相關指標。例如,在訂單服務中,當訂單創建成功時,發送一條消息到 RabbitMQ:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(Order order) {// 保存訂單到數據庫等操作//...// 發送訂單創建消息到RabbitMQrabbitTemplate.convertAndSend("order-exchange", "order.create", order);}
}
在消費者端,監聽該消息并更新 GMV 指標:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class GMVUpdateService extends ServiceImpl<OrderMapper, Order> {@RabbitListener(queues = "order-queue")public void updateGMVOnOrderCreate(Order order) {// 根據新訂單更新GMVQueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.select("SUM(order_amount) as gmv");Double newGMV = baseMapper.selectMaps(wrapper).stream().findFirst().map(map -> (Double) map.get("gmv")).orElse(0.0);// 保存新的GMV等操作//...}
}
通過這種方式,利用消息隊列的異步特性,能夠及時響應業務事件,保證指標數據的實時性和監控的穩定性。
3.2 趨勢展示實現
在 uniapp 和 Element plus 前端,我們可以使用 Echarts 可視化庫來展示指標變化趨勢。以 GMV 隨時間變化的折線圖為例,首先在 uniapp 中:
安裝 Echarts:npm install echarts --save
在頁面中引入并使用 Echarts:
<template><view><view id="gmv-chart" style="width: 100%; height: 400px;"></view></view>
</template><script>
import echarts from 'echarts';export default {data() {return {gmvData: []};},onLoad() {this.fetchGMVData();},methods: {fetchGMVData() {uni.request({url: 'http://your-server-url/gmv-history',success: (res) => {this.gmvData = res.data;this.renderGMVChart();},fail: (error) => {console.log(error);}});},renderGMVChart() {const chart = echarts.init(document.getElementById('gmv-chart'));const option = {title: {text: 'GMV變化趨勢'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: this.gmvData.map(item => item.time)},yAxis: {type: 'value'},series: [{name: 'GMV',type: 'line',data: this.gmvData.map(item => item.gmv)}]};chart.setOption(option);}}
};
</script>
在 Element plus 中,假設在一個 Vue 組件中:
<template><el-card><div slot="header">GMV變化趨勢</div><div id="gmv-chart" style="width: 100%; height: 400px;"></div></el-card>
</template><script setup>
import { onMounted } from 'vue';
import echarts from 'echarts';
import axios from 'axios';const fetchGMVData = async () => {try {const response = await axios.get('http://your-server-url/gmv-history');const gmvData = response.data;const chart = echarts.init(document.getElementById('gmv-chart'));const option = {title: {text: 'GMV變化趨勢'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: gmvData.map(item => item.time)},yAxis: {type: 'value'},series: [{name: 'GMV',type: 'line',data: gmvData.map(item => item.gmv)}]};chart.setOption(option);} catch (error) {console.log(error);}
};onMounted(() => {fetchGMVData();
});
</script>
上述代碼中,通過uni.request(uniapp)或axios(Element plus)從后端獲取 GMV 歷史數據,然后使用 Echarts 配置折線圖,展示 GMV 隨時間的變化情況。同樣的方式也可用于展示轉化率、用戶留存率等指標的變化趨勢,只需調整數據請求和圖表配置即可。
3.3 異常預警機制
當指標超出正常范圍時,需要及時通知相關人員。在后端,通過代碼判斷指標數據,當異常時發送郵件或短信通知。以 GMV 異常預警為例,假設設定 GMV 的正常范圍為前一周 GMV 平均值的 ±20%:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class GMVAlarmService extends ServiceImpl<OrderMapper, Order> {@Autowiredprivate JavaMailSender javaMailSender;public void checkGMVAlarm() {// 獲取前一周GMV平均值QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.select("AVG(order_amount) as avg_gmv");// 假設這里有邏輯計算前一周的時間范圍并添加到查詢條件中//...Double avgGMV = baseMapper.selectMaps(wrapper).stream().findFirst().map(map -> (Double) map.get("avg_gmv")).orElse(0.0);// 獲取當前GMVDouble currentGMV = this.baseMapper.selectMaps(new QueryWrapper<Order>().select("SUM(order_amount) as gmv")).stream().findFirst().map(map -> (Double) map.get("gmv")).orElse(0.0);// 判斷是否超出正常范圍if (currentGMV < avgGMV * 0.8 || currentGMV > avgGMV * 1.2) {sendGMVAlarmEmail(currentGMV, avgGMV);}}private void sendGMVAlarmEmail(Double currentGMV, Double avgGMV) {SimpleMailMessage message = new SimpleMailMessage();message.setTo("recipient@example.com");message.setSubject("GMV異常預警");message.setText("當前GMV為:" + currentGMV + ",超出正常范圍(前一周平均值:" + avgGMV + ")");javaMailSender.send(message);}
}
上述代碼中,checkGMVAlarm方法首先計算前一周 GMV 平均值和當前 GMV,然后判斷當前 GMV 是否超出正常范圍,若超出則調用sendGMVAlarmEmail方法發送郵件通知。
若要使用短信接口集成,以阿里云短信服務為例,首先添加依賴:
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>最新版本號</version>
</dependency>
配置短信服務參數,在application.properties中:
sms.accessKeyId=your-access-key-id
sms.accessKeySecret=your-access-key-secret
sms.signName=你的短信簽名
sms.templateCode=你的短信模板編碼
編寫短信發送代碼:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class SmsService {@Value("${sms.accessKeyId}")private String accessKeyId;@Value("${sms.accessKeySecret}")private String accessKeySecret;@Value("${sms.signName}")private String signName;@Value("${sms.templateCode}")private String templateCode;public boolean sendSms(String phoneNumber, String message) {DefaultProfile profile = DefaultProfile.getProfile("default", accessKeyId, accessKeySecret);IAcsClient client = new DefaultAcsClient(profile);SendSmsRequest request = new SendSmsRequest();request.setPhoneNumbers(phoneNumber);request.setSignName(signName);request.setTemplateCode(templateCode);request.setTemplateParam("{\"message\":\"" + message + "\"}");try {SendSmsResponse response = client.getAcsResponse(request);return response.getCode().equals("OK");} catch (ClientException e) {e.printStackTrace();}return false;}
}
在GMVAlarmService中調用短信發送服務:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class GMVAlarmService extends ServiceImpl<OrderMapper, Order> {@Autowiredprivate SmsService smsService;public void checkGMVAlarm() {// 計算GMV和判斷異常邏輯...if (currentGMV < avgGMV * 0.8 || currentGMV > avgGMV * 1.2) {String message = "當前GMV為:" + currentGMV + ",超出正常范圍(前一周平均值:" + avgGMV + ")";smsService.sendSms("13800138000", message);}}
}
這樣,當 GMV 指標異常時,就可以通過郵件或短信及時通知相關人員,以便采取相應措施。