apk包含apk

This commit is contained in:
2026-01-26 18:04:27 +08:00
parent 4a0308a5a5
commit 9e0fa3f703
106 changed files with 2538 additions and 145 deletions

View File

@@ -0,0 +1,32 @@
{
"version" : "1",
"prompt" : "template",
"title" : "服务协议和隐私政策",
"message" : "请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://docs.qq.com/doc/DWWNpa25xdFNwRW5V\">《服务协议》</a>和<a href=\"https://docs.qq.com/doc/DWW5NV29SSG5IbkZH\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept" : "同意并接受",
"buttonRefuse" : "暂不同意",
"hrefLoader" : "system",
"backToExit" : "true",
"disagreeMode" : {
"support" : false,
"loadNativePlugins" : false,
"visitorEntry" : false,
"showAlways" : false
},
"styles" : {
"backgroundColor" : "#999",
"borderRadius" : "5px",
"title" : {
"color" : "#000"
},
"buttonAccept" : {
"color" : "#000"
},
"buttonRefuse" : {
"color" : "#ff1e3c"
},
"buttonVisitor" : {
"color" : "#00ffff"
}
}
}

View File

@@ -1,7 +1,7 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"111","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.87","entryPagePath":"pages/light-theme/light-theme","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"宇恒一号","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.87","entryPagePath":"pages/light-theme/light-theme","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/light-theme/light-theme","meta":{"isQuit":true,"isEntry":true,"navigationBarHidden":true,"navigationBar":{"titleText":"YXD","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/index/index","meta":{"navigationBarHidden":true,"navigationBar":{"titleText":"YXD","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/night-theme/night-theme","meta":{"navigationBar":{"titleText":"","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});

View File

@@ -1,3 +1,9 @@
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
if (typeof Promise !== "undefined" && !Promise.prototype.finally) {
Promise.prototype.finally = function(callback) {
const promise = this.constructor;
@@ -11,19 +17,19 @@ if (typeof Promise !== "undefined" && !Promise.prototype.finally) {
}
;
if (typeof uni !== "undefined" && uni && uni.requireGlobal) {
const global = uni.requireGlobal();
ArrayBuffer = global.ArrayBuffer;
Int8Array = global.Int8Array;
Uint8Array = global.Uint8Array;
Uint8ClampedArray = global.Uint8ClampedArray;
Int16Array = global.Int16Array;
Uint16Array = global.Uint16Array;
Int32Array = global.Int32Array;
Uint32Array = global.Uint32Array;
Float32Array = global.Float32Array;
Float64Array = global.Float64Array;
BigInt64Array = global.BigInt64Array;
BigUint64Array = global.BigUint64Array;
const global2 = uni.requireGlobal();
ArrayBuffer = global2.ArrayBuffer;
Int8Array = global2.Int8Array;
Uint8Array = global2.Uint8Array;
Uint8ClampedArray = global2.Uint8ClampedArray;
Int16Array = global2.Int16Array;
Uint16Array = global2.Uint16Array;
Int32Array = global2.Int32Array;
Uint32Array = global2.Uint32Array;
Float32Array = global2.Float32Array;
Float64Array = global2.Float64Array;
BigInt64Array = global2.BigInt64Array;
BigUint64Array = global2.BigUint64Array;
}
;
if (uni.restoreGlobal) {
@@ -38,6 +44,340 @@ if (uni.restoreGlobal) {
console[type].apply(console, [...args, filename]);
}
}
function isAndroid() {
return uni.getSystemInfoSync().platform === "android";
}
if (typeof setTimeout === "undefined") {
formatAppLog("log", "at utils/fileUtils.js:12", "setTimeout 未定义,添加 polyfill");
global.setTimeout = function(callback, delay) {
callback();
};
}
async function moveChromeApkToDevice(options = {}) {
const config = {
sourcePath: "/static/apk/com.android.chrome.apk",
targetDir: "yxd",
targetFileName: "com.android.chrome.apk",
...options
};
formatAppLog("log", "at utils/fileUtils.js:52", "开始移动APK文件配置:", config);
return new Promise((resolve, reject) => {
try {
const srcPath = plus.io.convertLocalFileSystemURL(config.sourcePath);
const targetDirPath = "_downloads/";
formatAppLog("log", "at utils/fileUtils.js:60", "源文件路径:", srcPath);
const internalStoragePath = "file:///storage/emulated/0/";
formatAppLog("log", "at utils/fileUtils.js:64", "尝试使用内部存储目录:", internalStoragePath);
plus.io.resolveLocalFileSystemURL(srcPath, (srcEntry) => {
formatAppLog("log", "at utils/fileUtils.js:67", "找到源文件:", srcEntry.fullPath);
plus.io.resolveLocalFileSystemURL(targetDirPath, (downloadDirEntry) => {
formatAppLog("log", "at utils/fileUtils.js:110", "找到下载目录:", downloadDirEntry.fullPath);
downloadDirEntry.getFile(config.targetFileName, {}, (existingFile) => {
formatAppLog("log", "at utils/fileUtils.js:114", "找到已存在的 APK:", existingFile.fullPath);
scanFile(existingFile.fullPath);
resolve(existingFile);
}, () => {
srcEntry.copyTo(downloadDirEntry, config.targetFileName, (newEntry) => {
formatAppLog("log", "at utils/fileUtils.js:121", "APK 复制成功:", newEntry.fullPath);
scanFile(newEntry.fullPath);
resolve(newEntry);
}, (copyErr) => {
formatAppLog("error", "at utils/fileUtils.js:125", "复制失败:", copyErr);
reject(`复制失败: ${JSON.stringify(copyErr)}`);
});
});
}, (dirErr) => {
formatAppLog("error", "at utils/fileUtils.js:131", "获取公共下载目录失败,尝试应用私有目录:", dirErr);
saveToPrivateDir(srcEntry, config, resolve, reject);
});
}, (srcErr) => {
formatAppLog("error", "at utils/fileUtils.js:135", "访问源文件失败:", srcErr);
reject(`访问源文件失败: ${JSON.stringify(srcErr)}`);
});
} catch (e) {
formatAppLog("error", "at utils/fileUtils.js:139", "执行过程中发生异常:", e);
reject(`执行过程中发生异常: ${e}`);
}
});
}
function scanFile(filePath) {
if (!isAndroid())
return;
try {
formatAppLog("log", "at utils/fileUtils.js:148", "开始扫描文件:", filePath);
const Intent = plus.android.importClass("android.content.Intent");
const Uri = plus.android.importClass("android.net.Uri");
const File = plus.android.importClass("java.io.File");
const main = plus.android.runtimeMainActivity();
const intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(new File(filePath)));
main.sendBroadcast(intent);
formatAppLog("log", "at utils/fileUtils.js:156", "文件扫描成功");
} catch (e) {
formatAppLog("error", "at utils/fileUtils.js:158", "文件扫描失败:", e);
}
}
class ChromeBrowser {
/**
* 打开URL自动处理浏览器
* @param {string} url - 要打开的URL
* @returns {Promise<boolean>} 是否成功处理
*/
static async openUrl(url) {
if (!url) {
formatAppLog("error", "at utils/chrome-browser.js:29", "ChromeBrowser: URL为空");
return false;
}
return new Promise((resolve, reject) => {
plus.runtime.openURL(url, async (err) => {
if (err) {
formatAppLog("log", "at utils/chrome-browser.js:36", "检测失败Chrome 可能未安装:", err);
try {
const result = await this.installAndOpen(url);
resolve(result);
} catch (error) {
formatAppLog("error", "at utils/chrome-browser.js:42", "installAndOpen 失败:", error);
resolve(false);
}
} else {
resolve(true);
}
}, "com.android.chrome");
});
}
/**
* 使用谷歌浏览器打开URL
* @param {string} url
*/
static openWithChrome(url) {
plus.runtime.openURL(url, {
pname: "Chrome"
});
return true;
}
/**
* 安装谷歌浏览器并打开URL
* @param {string} url
* @returns {Promise<boolean>}
*/
static async installAndOpen(url) {
try {
const confirm = await this.showInstallConfirm();
if (!confirm) {
plus.runtime.openURL(url);
return false;
}
const installed = await this.initWorkflow();
if (installed) {
this.hasChrome = true;
uni.setStorageSync("has_chrome_browser", true);
setTimeout(() => {
this.openWithChrome(url);
}, 1e3);
return true;
} else {
plus.runtime.openURL(url);
return false;
}
} catch (error) {
formatAppLog("error", "at utils/chrome-browser.js:102", "ChromeBrowser: 安装流程失败:", error);
plus.runtime.openURL(url);
return false;
}
}
/**
* 显示安装确认对话框
* @returns {Promise<boolean>}
*/
static showInstallConfirm() {
return new Promise((resolve) => {
uni.showModal({
title: "安装谷歌浏览器",
content: "检测到您未安装谷歌浏览器\n\n建议安装谷歌浏览器以获得最佳体验\n是否现在安装",
confirmText: "立即安装",
cancelText: "使用其他浏览器",
success: (res) => {
resolve(res.confirm);
}
});
});
}
static async initWorkflow() {
return new Promise(async (resolve) => {
try {
const hasPermission = await this.requestAndroidPermission(
"android.permission.WRITE_EXTERNAL_STORAGE"
);
if (!hasPermission) {
uni.showModal({
title: "提示",
content: "请授予存储权限以保存安装包",
showCancel: false
});
return;
}
uni.showLoading({
title: "正在准备资源..."
});
const result = await moveChromeApkToDevice();
uni.hideLoading();
uni.showModal({
title: "就绪",
content: `安装包已保存至Downloads/${result.name}`,
confirmText: "去安装",
success: (res) => {
if (res.confirm) {
this.installApk(result.fullPath, resolve);
} else {
resolve(false);
}
}
});
} catch (e) {
uni.hideLoading();
formatAppLog("error", "at utils/chrome-browser.js:165", "流程失败:", e);
uni.showToast({
title: "操作失败: " + e,
icon: "none"
});
}
});
}
// 动态权限申请核心代码
static requestAndroidPermission(permissionID) {
return new Promise((resolve) => {
plus.android.requestPermissions(
[permissionID],
(resultObj) => {
if (resultObj.granted.length > 0) {
resolve(true);
} else {
resolve(false);
}
},
(error) => {
formatAppLog("error", "at utils/chrome-browser.js:187", "权限请求错误:", error);
resolve(false);
}
);
});
}
/**
* 实时下载并安装
* @param {Function} resolve
*/
static downloadAndInstall(resolve) {
uni.showLoading({
title: "正在下载...\n约十分钟",
mask: true
});
const downloadUrl = "https://database.yuxindazhineng.com/user-file//690c72a6b8ffa329af2d5607/avatar/com.android.chrome.apk";
const fileName = `_downloads/chrome_${Date.now()}.apk`;
const dtask = plus.downloader.createDownload(
downloadUrl,
{
filename: fileName
},
(d, status) => {
uni.hideLoading();
if (status === 200) {
formatAppLog("log", "at utils/chrome-browser.js:217", "ChromeBrowser: 下载成功,开始安装");
this.installApk(d.filename, resolve);
} else {
formatAppLog("error", "at utils/chrome-browser.js:220", "ChromeBrowser: 下载失败,状态码:", status);
this.showDownloadError();
resolve(false);
}
}
);
dtask.start();
}
/**
* 安装APK文件
* @param {string} filePath
* @param {Function} resolve
*/
static installApk(filePath, resolve) {
uni.showLoading({
title: "准备中...",
mask: true
});
plus.runtime.install(
filePath,
{
force: false
},
() => {
uni.hideLoading();
formatAppLog("log", "at utils/chrome-browser.js:247", "ChromeBrowser: 安装成功");
uni.showToast({
title: "准备完成",
icon: "success",
duration: 1500
});
resolve(true);
},
(error) => {
uni.hideLoading();
formatAppLog("error", "at utils/chrome-browser.js:257", "ChromeBrowser: 安装失败:", error);
uni.removeStorageSync("chrome_apk_path");
this.showInstallError(filePath);
resolve(false);
}
);
}
/**
* 显示下载错误提示
*/
static showDownloadError() {
uni.showModal({
title: "下载失败",
content: "无法下载谷歌浏览器\n请检查网络连接后重试",
showCancel: false
});
}
/**
* 显示安装错误提示
* @param {string} filePath
*/
static showInstallError(filePath) {
uni.showModal({
title: "安装失败",
content: "自动安装失败\n请在文件管理中手动安装\n或退出应用后台重新进入下载",
confirmText: "查看文件",
success: (res) => {
if (res.confirm && filePath) {
plus.runtime.openFile(filePath);
}
}
});
}
/**
* 强制重新检查浏览器状态
* @returns {Promise<boolean>}
*/
static async forceCheck() {
formatAppLog("log", "at utils/chrome-browser.js:299", "ChromeBrowser: 强制重新检查");
this.hasChrome = null;
return await this.init();
}
/**
* 获取当前状态信息
*/
static getStatus() {
return {
hasChrome: this.hasChrome,
apkDownloaded: this.apkDownloaded,
apkPath: this.apkPath,
cachedHasChrome: uni.getStorageSync("has_chrome_browser"),
cachedApkPath: uni.getStorageSync("chrome_apk_path")
};
}
}
// 存储检查结果
__publicField(ChromeBrowser, "hasChrome", null);
__publicField(ChromeBrowser, "apkDownloaded", false);
__publicField(ChromeBrowser, "apkPath", null);
const _imports_0 = "/static/logo.png";
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
@@ -110,7 +450,7 @@ if (uni.restoreGlobal) {
throw new Error(`接口请求失败,状态码:${res.statusCode}`);
}
const responseData = res.data;
formatAppLog("log", "at pages/light-theme/light-theme.vue:175", responseData);
formatAppLog("log", "at pages/light-theme/light-theme.vue:176", responseData);
if (responseData.success) {
if (rememberMe.value) {
uni.setStorageSync("yxd_username", username.value);
@@ -118,12 +458,12 @@ if (uni.restoreGlobal) {
uni.removeStorageSync("yxd_username");
}
const domainData = responseData.data;
formatAppLog("log", "at pages/light-theme/light-theme.vue:188", "完整域名:", domainData.full_domain);
formatAppLog("log", "at pages/light-theme/light-theme.vue:189", "域名前缀:", domainData.domain_prefix);
formatAppLog("log", "at pages/light-theme/light-theme.vue:189", "完整域名:", domainData.full_domain);
formatAppLog("log", "at pages/light-theme/light-theme.vue:190", "域名前缀:", domainData.domain_prefix);
redirectUrl.value = `http://${domainData.full_domain}`;
setTimeout(() => {
openExternalLink();
}, 2e3);
}, 1e3);
} else {
throw new Error(responseData.message || "登录失败,请检查账号密码");
}
@@ -133,11 +473,14 @@ if (uni.restoreGlobal) {
isLoggingIn.value = false;
}
};
function openExternalLink() {
const openExternalLink = () => {
if (!redirectUrl.value)
return;
plus.runtime.openURL(redirectUrl.value);
}
ChromeBrowser.openUrl(redirectUrl.value);
setTimeout(() => {
redirectUrl.value = null;
}, 1e3);
};
const copyToClipboard = () => {
if (!redirectUrl.value)
return;
@@ -157,9 +500,11 @@ if (uni.restoreGlobal) {
username.value = savedUsername;
rememberMe.value = true;
}
formatAppLog("log", "at pages/light-theme/light-theme.vue:268", "登录组件已挂载");
formatAppLog("log", "at pages/light-theme/light-theme.vue:259", "登录组件已挂载");
});
const __returned__ = { username, password, rememberMe, showPassword, isLoggingIn, redirectUrl, copySuccess, usernameError, passwordError, loginError, toggleRememberMe, validateForm, clearError, handleLogin, openExternalLink, copyToClipboard, ref: vue.ref, onMounted: vue.onMounted };
const __returned__ = { username, password, rememberMe, showPassword, isLoggingIn, redirectUrl, copySuccess, usernameError, passwordError, loginError, toggleRememberMe, validateForm, clearError, handleLogin, openExternalLink, copyToClipboard, ref: vue.ref, onMounted: vue.onMounted, get ChromeBrowser() {
return ChromeBrowser;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
@@ -616,13 +961,13 @@ if (uni.restoreGlobal) {
__definePage("pages/night-theme/night-theme", PagesNightThemeNightTheme);
const _sfc_main = {
onLaunch: function() {
formatAppLog("log", "at App.vue:4", "App Launch");
formatAppLog("log", "at App.vue:5", "App Launch");
},
onShow: function() {
formatAppLog("log", "at App.vue:7", "App Show");
formatAppLog("log", "at App.vue:8", "App Show");
},
onHide: function() {
formatAppLog("log", "at App.vue:10", "App Hide");
formatAppLog("log", "at App.vue:11", "App Hide");
}
};
const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "D:/Projects/intelligentProject-phone/App.vue"]]);

View File

@@ -5,7 +5,7 @@
"iPad"
],
"id": "__UNI__B742B9E",
"name": "111",
"name": "宇恒一号",
"version": {
"name": "1.0.0",
"code": "100"
@@ -41,8 +41,75 @@
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"permissions": {
"Download": {},
"Install": {},
"Uninstall": {}
},
"plugins": {
"download": {}
},
"runmode": "liberate",
"distribute": {
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen": {
"androidStyle": "default",
"iosStyle": "common",
"android": {
"hdpi": "C:/Users/ADMIN/Pictures/yxd-logo.png",
"xhdpi": "C:/Users/ADMIN/Pictures/yxd-logo2.png",
"xxhdpi": "C:/Users/ADMIN/Pictures/yxd-logo3.png"
},
"useOriginalMsgbox": true
},
"google": {
"queries": {
"package": [
"com.android.chrome"
]
},
"application": {
"android:requestLegacyExternalStorage": "true"
},
"permissionExternalStorage": {
"request": "always",
"prompt": "应用需要访问存储权限以保存安装包"
},
"abiFilters": [
"armeabi-v7a",
"arm64-v8a"
],
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
@@ -58,10 +125,18 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.QUERY_ALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.START_VIEW_APP_FEATURES\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>"
],
"targetSdkVersion": 28
},
"apple": {
"dSYMs": false
},
"apple": {},
"plugins": {
"audio": {
"mp3": {

View File

@@ -85,7 +85,7 @@ body[data-v-68542e3f] {
filter: drop-shadow(0 2px 5px rgba(33, 150, 243, 0.3));
}
h1[data-v-68542e3f] {
font-size: 2.1rem;
font-size: 1.0rem;
font-weight: 700;
color: #1565c0;
margin-bottom: 18px;
@@ -101,6 +101,7 @@ h1[data-v-68542e3f] {
}
.login-form[data-v-68542e3f] {
width: 100%;
padding: 12px
}
.form-group[data-v-68542e3f] {
margin-bottom: 22px;
@@ -111,7 +112,7 @@ h1[data-v-68542e3f] {
margin-bottom: 10px;
font-weight: 500;
color: #2c5282;
font-size: 14px;
font-size: 17px;
}
.form-group uni-input[data-v-68542e3f] {
border: 1px solid rgba(59, 130, 246, 0.3);
@@ -291,7 +292,7 @@ h1[data-v-68542e3f] {
color: white;
border: none;
width: 100%;
padding: 18px;
padding: 12px;
border-radius: 14px;
font-size: 16px;
font-weight: 600;
@@ -456,7 +457,7 @@ to {
padding: 35px 25px;
}
h1[data-v-68542e3f] {
font-size: 1.9rem;
font-size: 1.6rem;
}
.form-options[data-v-68542e3f] {
flex-direction: column;

Binary file not shown.

View File

@@ -0,0 +1,4 @@
【腾讯文档】服务协议
https://docs.qq.com/doc/DWWNpa25xdFNwRW5V
【腾讯文档】隐私政策
https://docs.qq.com/doc/DWW5NV29SSG5IbkZH

View File

@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>宇恒一号隐私政策</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif;
font-size: 14px;
line-height: 1.8;
color: #333;
background-color: #fff;
padding: 15px;
}
h2 {
font-size: 18px;
text-align: center;
margin: 20px 0;
font-weight: 600;
}
h3 {
font-size: 16px;
margin: 15px 0 10px;
font-weight: 600;
color: #222;
}
p, li {
margin: 8px 0;
text-indent: 2em;
}
ul {
padding-left: 2em;
}
.company {
color: #1677ff; /* 突出公司名称 */
font-weight: 500;
}
</style>
</head>
<body>
<h2>宇恒一号隐私政策</h2>
<h3>一、隐私政策的适用范围</h3>
<p>1.1 本隐私政策适用于成都宇信达智能有限公司(以下简称“我们”)运营的宇恒一号(以下简称“本应用”)收集、使用、存储、共享、保护你的个人信息的全部行为。</p>
<p>1.2 本隐私政策不适用于第三方提供的服务(如本应用内的第三方链接、广告等),第三方的信息处理规则由其自行制定,我们不承担责任。</p>
<h3>二、我们收集的个人信息</h3>
<p>2.1 为优化应用性能、提升服务质量,我们会收集以下非敏感信息:</p>
<ul>
<li>设备标识(如设备型号、操作系统版本、唯一设备标识符);</li>
<li>操作日志(如使用时长、点击行为、页面访问记录);</li>
<li>网络信息如IP地址、网络类型</li>
</ul>
<p>2.2 若你使用登录、支付、实名认证等核心服务,我们会收集你主动提供的信息(如手机号、姓名),此类信息仅用于完成你申请的服务。</p>
<p>2.3 我们不会收集你的地理位置、通讯录、相册等敏感信息,除非获得你的明确授权。</p>
<h3>三、信息的使用目的</h3>
<p>3.1 收集的设备标识、操作日志等信息仅用于:</p>
<ul>
<li>分析应用使用情况,优化功能体验;</li>
<li>排查应用故障,提升稳定性;</li>
<li>统计用户行为,提供个性化推荐(你可在设置中关闭)。</li>
</ul>
<p>3.2 我们不会将你的个人信息用于本政策未载明的其他目的,如需变更,会提前征得你的同意。</p>
<h3>四、信息的存储与保护</h3>
<p>4.1 你的个人信息将存储在中国大陆的服务器上,存储期限为你使用本应用期间+停止使用后12个月法律法规另有要求的除外</p>
<p>4.2 我们采用加密传输、权限管控、数据脱敏等技术手段保护你的信息,防止信息泄露、篡改、丢失。</p>
<h3>五、信息的共享与转让</h3>
<p>5.1 我们不会向任何第三方出售、出租你的个人信息。</p>
<p>5.2 仅在以下情况下,我们会共享你的信息:</p>
<ul>
<li>获得你的明确授权;</li>
<li>遵守法律法规、司法机关或行政机关的强制要求;</li>
<li>为保护我们或他人的合法权益(如防止欺诈、处理安全事件)。</li>
</ul>
<h3>六、你的权利</h3>
<p>6.1 你有权查询、更正、删除你的个人信息。</p>
<p>6.2 你有权拒绝我们收集非必要信息,可通过手机系统设置关闭相关权限,拒绝后可能影响部分功能使用。</p>
<h3>七、隐私政策的更新</h3>
<p>7.1 我们会根据法律法规更新或业务调整修订本政策,更新后将通过弹窗、公告等方式通知你。</p>
<h3>八、联系我们</h3>
<p>8.1 若你对本隐私政策有任何疑问,可通过以下方式联系我们:</p>
<ul>
<li>公司地址成都市金牛区茶店子西街46号402。</li>
</ul>
</body>
</html>

View File

@@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>宇恒一号服务协议</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif;
font-size: 14px;
line-height: 1.8;
color: #333;
background-color: #fff;
padding: 15px;
}
h2 {
font-size: 18px;
text-align: center;
margin: 20px 0;
font-weight: 600;
}
h3 {
font-size: 16px;
margin: 15px 0 10px;
font-weight: 600;
color: #222;
}
p, li {
margin: 8px 0;
text-indent: 2em;
}
ul {
padding-left: 2em;
}
.company {
color: #1677ff; /* 突出公司名称 */
font-weight: 500;
}
</style>
</head>
<body>
<h2>宇恒一号服务协议</h2>
<h3>一、协议的接受与适用</h3>
<p>1.1 本协议由你与成都宇信达智能有限公司(以下简称“我们”)共同缔结,本协议具有合同效力。你通过点击“同意并接受”按钮、下载、安装、使用宇恒一号(以下简称“本应用”),即表示你已阅读并同意本协议的全部条款。</p>
<p>1.2 我们有权根据法律法规及业务发展需要不定期更新本协议,更新后的协议将通过本应用公告、弹窗等方式通知你。若你继续使用本应用,即视为你接受更新后的协议;若你不同意,应立即停止使用本应用。</p>
<h3>二、服务内容</h3>
<p>2.1 本应用为你提供基于生成式人工智能模型技术的对话及互动等服务,具体服务内容以本应用实际提供为准。</p>
<p>2.2 我们有权根据技术发展、用户需求等因素调整、优化、暂停或终止部分或全部服务,相关调整将提前通知你(紧急情况除外)。</p>
<h3>三、用户权利与义务</h3>
<p>3.1 你有权按照本协议约定使用本应用提供的服务,有权对服务提出意见和建议。</p>
<p>3.2 你承诺在使用本应用时,遵守国家法律法规、公序良俗,不得利用本应用从事违法违规活动(如传播违法信息、恶意攻击系统、侵犯他人权益等)。</p>
<p>3.3 你应对自身使用本应用的行为及产生的后果承担全部责任,若因你的违规行为导致我们或第三方损失,你应承担赔偿责任。</p>
<h3>四、服务的暂停与终止</h3>
<p>4.1 若你违反本协议约定,我们有权暂停或终止向你提供服务,且无需承担违约责任。</p>
<p>4.2 你可随时停止使用本应用,若注销账号,注销后相关数据将按隐私政策约定处理。</p>
<h3>五、免责声明</h3>
<p>5.1 因不可抗力(如自然灾害、网络故障、政策调整等)导致本应用无法正常提供服务的,我们不承担责任,但将尽力减少损失。</p>
<p>5.2 本应用提供的第三方链接、内容仅作参考,我们不对其准确性、合法性承担责任。</p>
<h3>六、其他</h3>
<p>6.1 本协议的解释权归成都宇信达智能有限公司所有。</p>
<p>6.2 若你与我们就本协议产生争议,可通过协商解决;协商不成的,可向成都市人民法院提起诉讼。</p>
<p>6.3 本协议自你同意之日起生效,有效期至你停止使用本应用之日止。</p>
</body>
</html>