feat: AI routing DB-driven, payment gateway full integration, WeChat mini-program CI/CD

- AI routing rules now stored in system_configs DB table instead of hardcoded config
- Multi-model support via name|model composite key for same-provider routing
- UnifiedPayService with HMAC-SHA256 gateway integration (alipay/wechat)
- Admin payment panel: list, stats, search, filter, refund
- WeChat mini-program CI/CD via miniprogram-ci (v1.0.9)
- Translation quota extended to LLM provider tier
- SearchService with DB-driven provider config (bing/google_cse/searxng)
- Footer cleanup across admin/workspace/uni-app
- Private key excluded from git tracking
This commit is contained in:
TradeMate Dev
2026-06-09 17:19:45 +08:00
parent f17a6ccbac
commit d2736d1ef6
28 changed files with 12368 additions and 267 deletions
+2 -43
View File
@@ -277,63 +277,22 @@
</view>
<view class="footer">
<view class="footer-qrcode">
<view class="qrcode-item">
<image src="/static/images/yzr/yuzhiran.jpg" class="qrcode-img" mode="aspectFill" />
<text class="qrcode-label">公众号</text>
</view>
<view class="qrcode-item">
<image src="/static/images/yzr/yuzhiran-tech.jpg" class="qrcode-img" mode="aspectFill" />
<text class="qrcode-label">服务号</text>
</view>
<view class="qrcode-item">
<image src="/static/images/yzr/yuzhiran-yhl.jpg" class="qrcode-img" mode="aspectFill" />
<text class="qrcode-label">小程序</text>
</view>
<view class="qrcode-item">
<image src="/static/images/yzr/kefu.png" class="qrcode-img" mode="aspectFill" />
<text class="qrcode-label">客服</text>
</view>
</view>
<view class="footer-links">
<text class="footer-link" @click="goToPage(PAGES.AGREEMENT_PRIVACY)">隐私政策</text>
<text class="footer-divider">|</text>
<text class="footer-link" @click="goToPage(PAGES.AGREEMENT_TERMS)">用户协议</text>
</view>
<view class="footer-beian">
<a class="footer-beian-link" :href="beianUrl" target="_blank">{{ beianIcp }}</a>
<text class="footer-divider">|</text>
<a class="footer-beian-link" :href="beianPsbUrl" target="_blank">{{ beianPsb }}</a>
</view>
<text class="footer-copyright">© {{ copyrightYear }} 北京宇之然科技中心. 保留所有权利.</text>
</view>
<AiAssistant />
</view>
</template>
<script setup>
import { ref, computed, onUnmounted } from 'vue'
import { ref, onUnmounted } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import { authApi, customerApi, analyticsApi, onboardingApi, notificationApi, followupApi, translateApi, BASE_URL } from '@/utils/api.js'
import AiAssistant from '@/components/ai-assistant.vue'
import { STORAGE_KEYS, PAGES, EXTERNAL_URLS, APP_INFO, EXTRACT_FIELD_LABELS } from '@/config.js'
const beianInfo = computed(() => {
let hostname = ''
try { hostname = window.location.hostname } catch {}
if (hostname === 'yuzhiran.com' || hostname === 'www.yuzhiran.com') {
return { icp: '京ICP备2026007249号-1', psb: '京公网安备11011502039545号', psbUrl: 'https://beian.mps.gov.cn/#/query/webSearch?code=11011502039545' }
}
if (hostname === 'yuzhiran.com.cn' || hostname === 'www.yuzhiran.com.cn') {
return { icp: '京ICP备2026007249号-2', psb: '京公网安备11011502039622号', psbUrl: 'https://beian.mps.gov.cn/#/query/webSearch?code=11011502039622' }
}
return { icp: APP_INFO.ICP, psb: APP_INFO.PSB, psbUrl: EXTERNAL_URLS.BEIAN_PSB }
})
const beianUrl = computed(() => EXTERNAL_URLS.BEIAN)
const beianIcp = computed(() => beianInfo.value.icp)
const beianPsb = computed(() => beianInfo.value.psb)
const beianPsbUrl = computed(() => beianInfo.value.psbUrl)
const copyrightYear = computed(() => new Date().getFullYear())
import { STORAGE_KEYS, PAGES, EXTRACT_FIELD_LABELS } from '@/config.js'
const showAnnouncement = ref(false)
const currentAnnouncement = ref(0)