diff --git a/mini/components/version-badge/version-badge.js b/mini/components/version-badge/version-badge.js
new file mode 100644
index 0000000..391da78
--- /dev/null
+++ b/mini/components/version-badge/version-badge.js
@@ -0,0 +1,46 @@
+/**
+ * 版本号显示组件
+ * 使用方法:
+ *
+ */
+
+const versionInfo = require('../../utils/version.js');
+
+Component({
+ properties: {
+ // 是否显示详细信息(构建编号、commit SHA)
+ showDetail: {
+ type: Boolean,
+ value: false
+ },
+ // 是否显示构建时间
+ showTime: {
+ type: Boolean,
+ value: false
+ }
+ },
+
+ data: {
+ version: versionInfo.version,
+ buildNumber: versionInfo.buildNumber,
+ buildTime: versionInfo.buildTime,
+ commitSha: versionInfo.commitSha
+ },
+
+ lifetimes: {
+ attached() {
+ // 格式化构建时间
+ if (this.data.buildTime && this.data.buildTime !== 'unknown') {
+ const date = new Date(this.data.buildTime);
+ const formatted = date.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ this.setData({ formattedTime: formatted });
+ }
+ }
+ }
+});
diff --git a/mini/components/version-badge/version-badge.json b/mini/components/version-badge/version-badge.json
new file mode 100644
index 0000000..a89ef4d
--- /dev/null
+++ b/mini/components/version-badge/version-badge.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
diff --git a/mini/components/version-badge/version-badge.wxml b/mini/components/version-badge/version-badge.wxml
new file mode 100644
index 0000000..2512230
--- /dev/null
+++ b/mini/components/version-badge/version-badge.wxml
@@ -0,0 +1,6 @@
+
+ v{{version}}
+ #{{buildNumber}}
+ ({{commitSha}})
+ {{formattedTime}}
+
diff --git a/mini/components/version-badge/version-badge.wxss b/mini/components/version-badge/version-badge.wxss
new file mode 100644
index 0000000..17d273a
--- /dev/null
+++ b/mini/components/version-badge/version-badge.wxss
@@ -0,0 +1,22 @@
+.version-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ font-size: 12px;
+ color: #9E8E7E;
+}
+
+.version-text {
+ font-weight: 500;
+}
+
+.version-detail {
+ font-size: 11px;
+ opacity: 0.8;
+}
+
+.version-time {
+ font-size: 11px;
+ opacity: 0.6;
+ margin-left: 4px;
+}
diff --git a/mini/utils/request.js b/mini/utils/request.js
index c14cdf0..a900f86 100644
--- a/mini/utils/request.js
+++ b/mini/utils/request.js
@@ -1,5 +1,23 @@
// 网络请求封装
-const BASE_URL = 'http://localhost:8080'; // 开发环境
+// 按小程序运行环境自动切换后端地址:
+// - develop(开发者工具):本地开发服务
+// - trial/release(体验版/正式版):生产域名(需在微信公众平台配置为 request 合法域名)
+const API_HOSTS = {
+ develop: 'http://localhost:8080',
+ trial: 'https://lunar.neatcn.com',
+ release: 'https://lunar.neatcn.com',
+};
+
+function resolveBaseUrl() {
+ try {
+ const envVersion = wx.getAccountInfoSync().miniProgram.envVersion;
+ return API_HOSTS[envVersion] || API_HOSTS.release;
+ } catch (e) {
+ return API_HOSTS.release;
+ }
+}
+
+const BASE_URL = resolveBaseUrl();
// 请求拦截器
function request(options) {
@@ -20,8 +38,8 @@ function request(options) {
if (res.statusCode === 200) {
resolve(res.data);
} else if (res.statusCode === 401) {
- // 未授权,跳转登录
- wx.navigateTo({ url: '/pages/settings/settings' });
+ // 未授权:清除失效 token,由页面引导重新登录
+ wx.removeStorageSync('token');
reject(new Error('未授权'));
} else {
reject(new Error(res.data.msg || '请求失败'));