Files
scottpan 4be53dcd1b feat: 集成 KieAI 服务,移除 models-integration 子项目
- 添加 Gemini 2.5 Flash 对话接口(流式+非流式)
- 添加 NanoBanana 图像生成/编辑接口
- 添加 Sora2 视频生成接口(文生视频、图生视频、去水印)
- 移除 models-integration 子项目(功能已迁移至主后端)
- 新增测试文档和 Playwright E2E 配置
- 更新前端页面和 API 接口
- 更新后端配置和日志处理
2026-03-03 15:33:50 +08:00

304 lines
9.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script>
import {
checkLogin
} from "./libs/login";
import {
HTTP_REQUEST_URL
} from './config/app';
import Auth from './libs/wechat.js';
import Routine from './libs/routine.js';
import Apps from './libs/apps.js';
import Cache from './utils/cache.js';
import {
getTheme,
loginConfigApi,
tokenIsExistApi
} from './api/api.js';
import {
mapActions
} from 'vuex'
import {
spread
} from "@/api/user";
var statusBarHeight = uni.getSystemInfoSync().statusBarHeight; //手机端头部手机时间位置高度
// const app = getApp();
export default {
globalData: {
statusBarHeight: statusBarHeight, //手机端头部手机时间位置高度
spread: 0, //推广人id
code: 0,
isLogin: false,
userInfo: {},
MyMenus: [],
windowHeight: 0,
navHeight: 0,
navH: 0,
id: 0, //商品id
isIframe: false,
theme: 'theme1', //主题色
publicLoginType: Cache.get('publicLoginType') ? Cache.get('publicLoginType') : '', //公众号登录方式(单选),1微信授权2手机号登录
routinePhoneVerification: '', //小程序手机号校验类型多选1微信小程序验证 2短信验证
companyName: uni.getStorageSync('companyName') ? uni.getStorageSync('companyName') : '欢迎你', //公司名称
tokenIsExist: false, //登录是否失效 false 失效true没失效
mobileLoginLogo: uni.getStorageSync('mobileLoginLogo') || `${Cache.get("imgHost")}crmebimage/perset/staticImg/logo2.png` //登录页logo
},
onLaunch: function(option) {
//获取登录配置
this.getLoginConfig();
//校验token是否有效,true为有效false为无效
tokenIsExistApi().then(res => {
this.globalData.tokenIsExist = res.data;
})
let that = this;
// #ifdef APP-PLUS || H5
uni.getSystemInfo({
success: function(res) {
// 首页没有title获取的整个页面的高度里面的页面有原生标题要减掉就是视口的高度
// 状态栏是动态的可以拿到 标题栏是固定写死的是44px
let height = res.windowHeight - res.statusBarHeight - 44
// #ifdef H5 || APP-PLUS
that.globalData.windowHeight = res.windowHeight + 'px'
// #endif
}
});
// #endif
// #ifdef MP
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function(res) {
// 请求完新版本信息的回调
if (res.hasUpdate) {
updateManager.onUpdateReady(function(res2) {
uni.showModal({
title: '更新提示',
content: '发现新版本,是否重启应用?',
cancelColor: '#eeeeee',
confirmColor: '#FF0000',
success(res2) {
if (res2.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
}
});
});
}
});
updateManager.onUpdateFailed(function(res) {
// 新的版本下载失败
uni.showModal({
title: '提示',
content: '检查到有新版本,但下载失败,请检查网络设置',
success(res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
}
});
});
if (HTTP_REQUEST_URL == '') {
console.error(
"请配置根目录下的config.js文件中的 'HTTP_REQUEST_URL'\n\n请修改开发者工具中【详情】->【AppID】改为自己的Appid\n\n请前往后台【小程序】->【小程序配置】填写自己的 appId and AppSecret"
);
return false;
}
//小程序扫码进入场景
if (option.query.hasOwnProperty('scene')) {
switch (option.scene) {
case 1047: //扫描小程序码
case 1048: //长按图片识别小程序码
case 1049: //手机相册选取小程序码
case 1001: //直接进入小程序
let value = this.$util.getUrlParams(decodeURIComponent(option.query.scene));
let mapeMpQrCodeValue = this.$util.formatMpQrCodeData(value);
// that.globalData = mapeMpQrCodeValue;
that.globalData = Object.assign(that.globalData,mapeMpQrCodeValue);
that.globalData.spread = mapeMpQrCodeValue.spread ? mapeMpQrCodeValue.spread : '';
break;
}
}
if (option.spread) that.globalData.spread = option.spread;
// #endif
// 获取导航高度;
uni.getSystemInfo({
success: function(res) {
that.globalData.navHeight = res.statusBarHeight * (750 / res.windowWidth) + 91;
}
});
// #ifdef MP
let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
that.globalData.navH = menuButtonInfo.top * 2 + menuButtonInfo.height / 2;
// #endif
// #ifdef H5
if (option.query.hasOwnProperty('type') && option.query.type == "iframeVisualizing") {
this.globalData.isIframe = true;
} else {
this.globalData.isIframe = false;
}
// wx公众号自动授权登录
let snsapiBase = 'snsapi_base';
let urlData = location.pathname + location.search;
//publicLoginType公众号登录方式(单选),1微信授权2手机号登录
if (!that.$store.getters.isLogin && Auth.isWeixin() && this.globalData.publicLoginType == 1 && !that
.globalData.tokenIsExist) {
const {
code,
state,
scope
} = option.query;
if (code && code != uni.getStorageSync('snsapiCode') && location.pathname.indexOf(
'/pages/users/wechat_login/index') === -1) {
// 存储静默授权code
uni.setStorageSync('snsapiCode', code);
let spread = that.globalData.spread ? that.globalData.spread : 0;
Auth.auth(code, that.$Cache.get('SPREAD'))
.then(res => {
uni.setStorageSync('snRouter', decodeURIComponent(decodeURIComponent(option.query
.back_url)));
if (res.type === 'register') {
this.$Cache.set('snsapiKey', res.key);
}
if (res.type === 'login') {
this.$store.commit('LOGIN', {
token: res.token
});
this.$store.commit("SETUID", res.uid);
location.replace(decodeURIComponent(decodeURIComponent(option.query.back_url)));
}
})
.catch(error => {
if (!this.$Cache.has('snsapiKey')) {
if (location.pathname.indexOf('/pages/users/wechat_login/index') === -1) {
Auth.oAuth(snsapiBase, option.query.back_url);
}
}
});
} else {
if (!this.$Cache.has('snsapiKey')) {
if (location.pathname.indexOf('/pages/users/wechat_login/index') === -1) {
Auth.oAuth(snsapiBase, urlData);
}
}
}
} else {
if (option.query.back_url) {
location.replace(uni.getStorageSync('snRouter'));
}
}
// #endif
// #ifdef MP
// 不再在启动时自动静默登录,允许用户先浏览首页与功能后再自行选择授权登录(符合小程序审核要求)
// 用户点击首页「请点击登录」或使用需登录功能时会进入登录页
// if (!this.$store.getters.isLogin && !this.globalData.tokenIsExist) {
// Routine.getCode().then(code => {
// Routine.authUserInfo(code)
// })
// .catch(res => {
// uni.hideLoading();
// });
// }
// #endif
// 主题变色
getTheme().then(resP => {
that.globalData.theme = `theme${Number(resP.data.value)}`
that.$Cache.set('theme', that.globalData.theme);
// #ifdef H5
window.document.documentElement.setAttribute('data-theme', that.globalData.theme);
// #endif
})
},
async mounted() {
if (this.$store.getters.isLogin && !this.$Cache.get('USER_INFO')) await this.$store.dispatch('USERINFO');
},
methods: {
//获取登录配置
getLoginConfig() {
loginConfigApi().then(res => {
let data = res.data;
//公众号登录方式(单选),1微信授权2手机号登录
this.globalData.publicLoginType = data.publicLoginType;
this.$Cache.set('publicLoginType', data.publicLoginType);
//小程序手机号校验类型多选1微信小程序验证 2短信验证
this.globalData.routinePhoneVerification = data.routinePhoneVerification;
//公司名称
this.globalData.companyName = data.siteName || '欢迎你';
uni.setStorageSync('companyName', data.siteName);
//登录页logo
this.globalData.mobileLoginLogo = data.mobileLoginLogo;
uni.setStorageSync('mobileLoginLogo', data.mobileLoginLogo);
//版权title
uni.setNavigationBarTitle({
title:data.siteName
});
})
}
},
onShow: function() {
// #ifdef H5
uni.getSystemInfo({
success(e) {
/* 窗口宽度大于420px且不在PC页面且不在移动设备时跳转至 PC.html 页面 */
if (e.windowWidth > 430 && !window.top.isPC && !/iOS|Android/i.test(e.system)) {
// window.location.pathname = 'https://java.crmeb.net/';
/* 若你的项目未设置根目录(默认为 / 时),则使用下方代码 */
window.location.pathname = '/static/html/pc.html';
}
}
})
// #endif
},
onHide: function() {}
}
</script>
<style lang="scss">
@import url("@/plugin/animate/animate.min.css");
@import 'static/css/base.css';
@import 'static/iconfont/iconfont.css';
@import 'static/css/guildford.css';
@import 'static/css/style.scss';
@import 'static/css/unocss.css';
@import 'static/fonts/font.css';
/* 条件编译仅在H5平台生效 */
// #ifdef H5
body::-webkit-scrollbar,
html::-webkit-scrollbar {
display: none;
}
// #endif
view {
box-sizing: border-box;
}
.bg-color-red {
background-color: #E93323;
}
.syspadding {
padding-top: var(--status-bar-height);
}
.flex {
display: flex;
}
.uni-scroll-view::-webkit-scrollbar {
/* 隐藏滚动条,但依旧具备可以滚动的功能 */
display: none
}
::-webkit-scrollbar {
width: 0;
height: 0;
color: transparent;
}
</style>