Compare commits

...

3 Commits

Author SHA1 Message Date
1128114e73 网络请求,封装简化注释 2025-07-07 11:27:24 +08:00
a34158c60a Merge branch 'main' of http://47.107.152.87:3000/dyf/APP 2025-07-07 11:13:08 +08:00
9f70d557de 封装请求更改 2025-07-07 11:12:55 +08:00
4 changed files with 48 additions and 83 deletions

21
api/login.js Normal file
View File

@ -0,0 +1,21 @@
import request from '../utils/request'
// 登录方法
export function login(data) {
return request({
url: '/auth/app/login', // 假设登录接口是 /login
method: 'POST',
data: data
})
}
// 注册发送验证码
export function sendRegisterSms(data) {
return request({
url: '/api/appUser/sendRegisterSms', //发送验证码注册
method: 'POST',
data: data
})
}

View File

@ -53,6 +53,7 @@
</template> </template>
<script> <script>
import { login } from '@/api/login';
export default { export default {
data() { data() {
return { return {

View File

@ -1,41 +1,28 @@
import mqtt from 'mqtt/dist/mqtt.js'; // 根据典型的 uniapp 结构调整路径 import mqtt from 'mqtt/dist/mqtt.js';
// 请替换为您的 MQTT代理broker详细信息
const MQTT_BROKER_URL = 'ws://your-mqtt-broker-address:your-port/mqtt'; // 使用 ws:// 或 wss:// const MQTT_BROKER_URL = 'ws://your-mqtt-broker-address:your-port/mqtt'; // 使用 ws:// 或 wss://
const MQTT_OPTIONS = { const MQTT_OPTIONS = {
connectTimeout: 4000, // 连接超时时间 (毫秒) connectTimeout: 4000,
clientId: `mqtt_client_${Math.random().toString(16).substr(2, 8)}`, // 唯一的客户端ID clientId: `mqtt_client_${Math.random().toString(16).substr(2, 8)}`,
username: 'your-username', // 用户名 (可选) username: 'your-username',
password: 'your-password', // 密码 (可选) password: 'your-password',
clean: true, // 对于大多数移动应用场景,建议为 true clean: true,
// 更多选项请参考 MQTT.js 文档
// Keepalive (心跳包间隔) 通常为 30-60 秒。
// reconnectPeriod: 1000, // 每次重新连接尝试之间的间隔时间 (毫秒)
}; };
let client = null; // MQTT 客户端实例 let client = null;
let connectPromise = null; // 用于跟踪连接过程的 Promise let connectPromise = null;
// 连接到 MQTT 代理 // 连接到 MQTT 代理
export function connect() { export function connect() {
// 如果客户端已存在并且已连接,则直接返回
if (client && client.connected) { if (client && client.connected) {
return Promise.resolve(client); return Promise.resolve(client);
} }
// 如果正在连接中,则返回当前的连接 Promise
if (connectPromise) { if (connectPromise) {
return connectPromise; return connectPromise;
} }
let url = MQTT_BROKER_URL; let url = MQTT_BROKER_URL;
// #ifdef MP-WEIXIN || APP-PLUS // #ifdef MP-WEIXIN || APP-PLUS
// 对于微信小程序和 App某些代理可能需要 'wx://' 或 'wxs://'
// if (MQTT_BROKER_URL.startsWith('ws://')) {
// url = MQTT_BROKER_URL.replace('ws://', 'wx://');
// } else if (MQTT_BROKER_URL.startsWith('wss://')) {
// url = MQTT_BROKER_URL.replace('wss://', 'wxs://');
// }
// #endif // #endif
console.log(`正在连接到 MQTT 代理: ${url}`); console.log(`正在连接到 MQTT 代理: ${url}`);
@ -44,7 +31,7 @@ export function connect() {
connectPromise = new Promise((resolve, reject) => { connectPromise = new Promise((resolve, reject) => {
client.on('connect', () => { client.on('connect', () => {
console.log('MQTT 已连接'); console.log('MQTT 已连接');
connectPromise = null; // 连接成功后清除 Promise connectPromise = null;
resolve(client); resolve(client);
}); });
@ -54,19 +41,14 @@ export function connect() {
client.on('error', (err) => { client.on('error', (err) => {
console.error('MQTT 连接错误:', err); console.error('MQTT 连接错误:', err);
if (connectPromise) { // 仅当是初始连接尝试时才 reject if (connectPromise) {
reject(err); reject(err);
} }
connectPromise = null; // 出错时清除 Promise connectPromise = null;
// 如果合适,可以考虑在此处尝试断开连接或清理客户端
// client.end(true, () => console.log('客户端因错误被强制结束.'));
}); });
client.on('close', () => { client.on('close', () => {
console.log('MQTT 连接已关闭'); console.log('MQTT 连接已关闭');
// 如果连接意外关闭,您可能需要将客户端置为 null
// 或设置一个标志,以便 `connect()` 可以尝试建立新连接。
// client = null; // 或者管理重连逻辑
connectPromise = null; connectPromise = null;
}); });
@ -166,38 +148,31 @@ export function unsubscribe(topic) {
}); });
} else { } else {
console.warn('MQTT 客户端未连接,无法取消订阅。'); console.warn('MQTT 客户端未连接,无法取消订阅。');
resolve(); // 或 reject取决于期望的行为 resolve();
} }
}); });
} }
// 处理传入的消息 // 处理传入的消息
// 连接后设置一次此回调至关重要。
export function onMessage(callback) { export function onMessage(callback) {
if (client) { if (client) {
client.on('message', callback); // 回调格式: (topic, message, packet) => { ... } client.on('message', callback); // 回调格式: (topic, message, packet) => { ... }
} else { } else {
// 可能是 connect() 初始化 'client' 之前调用了此函数
// 延迟附加监听器,直到客户端可用。
const checkClientInterval = setInterval(() => { const checkClientInterval = setInterval(() => {
if (client) { if (client) {
client.on('message', callback); client.on('message', callback);
clearInterval(checkClientInterval); clearInterval(checkClientInterval);
} else if (connectPromise === null && client === null) { } else if (connectPromise === null && client === null) {
// 如果 connectPromise 为 null且 client 为 null表示 connect() 未被调用或已永久失败。
console.warn('MQTT 客户端未初始化以处理 onMessage且没有连接尝试正在进行中。'); console.warn('MQTT 客户端未初始化以处理 onMessage且没有连接尝试正在进行中。');
clearInterval(checkClientInterval); clearInterval(checkClientInterval);
} }
}, 100); // 每 100 毫秒检查一次 }, 100);
} }
} }
// 您可能希望直接公开客户端以用于高级用例或特定的事件处理
export function getClient() { export function getClient() {
return client; return client;
} }
// 可选:添加一个函数来检查连接状态
export function isConnected() { export function isConnected() {
return client && client.connected; return client && client.connected;
} }

View File

@ -1,72 +1,40 @@
import axios from 'axios' import axios from 'axios'
// 如果使用 Vuex 且需要 token请取消注释 const BASE_URL = 'http://192.168.2.23:8000'
// import store from '@/store'
// 示例:如果你有身份验证相关的工具函数
// import { getToken } from '@/utils/auth'
// 创建 Axios 实例 // 创建 Axios 实例
const service = axios.create({ const service = axios.create({
// 重要:请在此处配置你的 API 基础 URL baseURL: BASE_URL,
// 你可以从环境变量或配置文件中获取 timeout: 10000
baseURL: process.env.VUE_APP_BASE_API || '/api', // 示例基础 URL
timeout: 10000 // 请求超时时间 (毫秒)
}) })
// 请求拦截器 // 请求拦截器
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
// 如果需要,添加 Authorization 请求头 console.log('Full Request URL:', config.baseURL + config.url)
// 示例:检查用户是否登录(例如,通过 Vuex store 或 auth 工具函数) const token = uni.getStorageSync('token')
// if (store.getters.token) { if (token) {
// // 根据你的认证方案调整
// config.headers['Authorization'] = 'Bearer ' + getToken() config.headers['Authorization'] = 'Bearer ' + token
// } }
config.headers['Content-Type'] = config.headers['Content-Type'] || 'application/json'; config.headers['Content-Type'] = config.headers['Content-Type'] || 'application/json';
return config return config
}, },
error => { error => {
// 处理请求错误 console.log('Request Error:', error)
console.error('Request Error:', error) // 用于调试
return Promise.reject(error) return Promise.reject(error)
} }
) )
// 响应拦截器 // 响应拦截器
service.interceptors.response.use( service.interceptors.response.use(
/**
* 如果你想获取诸如头信息或状态之类的http信息
* 请返回 response => response
*/
/**
* 通过自定义代码确定请求状态
* 这里只是一个例子
* 你也可以通过HTTP状态码判断状态
*/
response => { response => {
const res = response.data const res = response.data
// 示例:根据你的后端响应结构调整此部分 if (res.code !== 200 && res.code !== 0) {
// 如果自定义状态码不是 200 (或你的成功状态码),则判断为错误。 console.log('API Error:', res.message || 'Error')
if (res.code !== 200 && res.code !== 0) { // 假设 200 或 0 表示成功
// 你可以在此添加全局错误处理,例如显示提示消息
// uni.showToast({ title: res.message || '错误', icon: 'none' });
console.error('API Error:', res.message || 'Error')
// 示例:处理特定的错误代码,例如未授权 (401)
// if (res.code === 401) {
// // 例如:重定向到登录页面
// }
return Promise.reject(new Error(res.message || 'Error')) return Promise.reject(new Error(res.message || 'Error'))
} else { } else {
// 如果成功,则返回响应的数据部分 return res
// 如果后端没有将数据包装在 'data' 字段中,请调整此项
return res.data
} }
}, },
error => { error => {
console.error('Response Error:', error.message) // 用于调试
// 处理网络错误或其他错误
// uni.showToast({ title: error.message, icon: 'none' });
return Promise.reject(error) return Promise.reject(error)
} }
) )