uni-app自动升级功能
效果图
一、VUE
login.vue
<template><view><view class="uni-common-mt"><view class="uni-flex uni-column"><view class="flex-item flex-item-V"><view class="logo"><image src="/static/image/uniui-logo.png" style="height:90px;display: none;"></image></view><view class="logoHead">欢迎使用WMS</view></view><view class="flex-item flex-item-V"></view><view class="flex-item flex-item-V form"><form><view class="uni-form-item uni-column"><uni-easyinput v-model="formData.loginName" maxlength="50" name="loginName"placeholder="请输入账号" prefixIcon="person" value=""></uni-easyinput></view><view class="uni-form-item uni-column"><uni-easyinput v-model="formData.password2" maxlength="50" name="password" type="password"placeholder="请输入密码" prefixIcon="locked" @confirm="formSubmit"></uni-easyinput></view><view class="uni-btn-v loginBtn"><button form-type="submit" type="primary" :loading="loginLoading" @click="formSubmit">登录</button></view></form></view></view></view></view><view class="register-section">Copyright © 2025 **科技 版本号:{{ThisVersion}}</view>
</template><script setup>import {nextTick,onMounted,ref} from 'vue';import {userApi} from "@/api/user";import graceChecker from "@/common/graceChecker.js";import CryptoJS from 'crypto-js';import G from '@/utils/global.js'const ThisVersion = G.ApkVersion;const loginLoading = ref(false);const myForm = ref();const formData = ref({loginName: "",password: "",password2: "",tenantId: "1867144130501541888",lang: "zh_cn",industry: null}); //提交登录const formSubmit = (e) => {//定义表单规则var rule = [{name: "loginName",checkType: "string",checkRule: "1,20",errorMsg: "请输入1-20位的账号"},{name: "password2",checkType: "string",checkRule: "3,20",errorMsg: "请输入3-20密码"}];//进行表单检查 var checkRes = graceChecker.check(formData.value, rule);if (checkRes) {//登录信息 formData.value.password = CryptoJS.SHA256(formData.value.password2).toString(CryptoJS.enc.Hex);let thisObj = {"thisObj": formData.value};loginLoading.value = true;uni.setStorageSync('token', "login");//1.登录得到codeuserApi.LoginByOauth(thisObj).then(loginRes => {console.log('loginRes========', JSON.stringify(loginRes));if (loginRes.mfail != '0' || loginRes.data == null) {loginLoading.value = false;uni.showToast({icon: 'none',duration: G.ShowPopTime,title: `登录异常,code获取异常:${loginRes.msg}`});return;} else {//2.通过code获取Tokenlet postData = {code: loginRes.data.code};//获取tokenuserApi.GetTokenFromCode(postData).then(tokenRes => {console.log('Token========', JSON.stringify(tokenRes));if (tokenRes.mfail != '0' || tokenRes.data == null) {loginLoading.value = false;uni.showToast({icon: 'none',duration: G.ShowPopTime,title: `登录异常,token获取异常:${res.msg}`});return;}//登录成功后,将token写入全局变量uni.setStorageSync('token', tokenRes.data.token);//跳转到首页nextTick(() => {uni.reLaunch({animationType: 'zoom-out',animationDuration: 200,url: "/pages/index/index"});});}).catch(error => {uni.setStorageSync('token', null);loginLoading.value = false;uni.showToast({icon: 'none',duration: G.ShowPopTime,title: `访问失败,请联系管理员!:${res.msg}`});});}}).catch(error => {uni.setStorageSync('token', null);loginLoading.value = false;uni.showToast({icon: 'none',duration: G.ShowPopTime,title: `访问失败,请联系管理员!:${res.msg}`});});} else {loginLoading.value = false;uni.showToast({title: graceChecker.error,icon: "error",duration: G.ShowPopTime});}}//自动更新升级新版本const autoUpdate = () => { var myVerson =ThisVersion; //Android当前版本var obj = {AppType: G.AppType, //1.Android(默认) 2.ISO AppVersion: myVerson} userApi.getVersion(obj).then(res => {console.log("查询服务器版本信息---------------- " + JSON.stringify(res));if (res == undefined) {console.log('连接服务器失败!');} else {if (res.IsUpdate == true) {console.log('需要更新版本!'); uni.showModal({title: "版本更新",content: '检测到程序有新版本,是否立即进行新版本下载?',confirmText: '立即更新',cancelText: '稍后进行',success: function(res) {if (res.confirm) {//设置 最新版本apk的下载 let downloadApkUrl = G.DownLoadUrl;//GLOBAL.DOMAIN_URL + "/apk/mzz2.apk";let dtask = plus.downloader.createDownload(downloadApkUrl, {},function(d, status) {// 下载完成 if (status == 200) {plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename), {}, {},function(error) {uni.showToast({title: '安装失败',duration: 1500});})} else {uni.showToast({title: '更新失败',duration: 1500});}});dtask.start();var prg = 0;var showLoading = plus.nativeUI.showWaiting("正在下载");//创建一个showWaiting对象 dtask.addEventListener('statechanged', function(task, status) {// 给下载任务设置一个监听 并根据状态 做操作switch (task.state) {case 1:showLoading.setTitle("正在下载");break;case 2://showLoading.setTitle("已连接到服务器");break;case 3:prg = parseInt((parseFloat(task.downloadedSize) /parseFloat(task.totalSize)) *100);showLoading.setTitle("正在下载" + prg + "% "); break;case 4:plus.nativeUI.closeWaiting();//下载完成break;}});} else if (res.cancel) {console.log('稍后更新');}}});} else {console.log('不需要更新版本!');}}}).catch(error => {console.log('访问失败,请联系管理员!!');});}onMounted(() => {uni.setStorageSync('token', null);autoUpdate();});
</script><style scoped lang="scss">view {box-sizing: border-box;}.uni-common-mt {margin: 0;}.flex-item:nth-child(1) {display: flex;flex-flow: column;justify-content: center;align-content: center;}.flex-item:nth-child(2) {height: 120rpx;background: url("/static/login-style.png") round space;}.logo {min-height: 100rpx;padding-left: 10px;margin-top: 100rpx;}.logoHead {font-family: 'Microsoft YaHei', sans-serif;text-align: center;color: darkblue;font-size: 58rpx;font-weight: bold;text-shadow: 1px 1px rgba(0, 0, 0, .3);padding-bottom: 40rpx;}.loginBtn {padding-top: 40rpx;}.form {padding: 0px 40px;}.register-section {position: absolute;left: 0;bottom: 20px;width: 100%;font-size: $uni-font-size-sm;color: $uni-text-color;text-align: center;}
</style>
global.js
export default {CAPTCHA_TYPE: {COMMON: 'common'},ShowPopTime: 5000, //弹框持续时间AppType: 1, //1.Android(默认) 2.ISOApkVersion: 'v5.3.25.2', //Android当前版本IsoVersion: 'v5.2.20.1', //Iso当前版本DownLoadUrl: 'http://192.168.6.1/APPDownLoad/TJWMSApp.apk', //正式下载App地址REQUEST_URL: 'http://192.168.6.3', //正式api地址 http://192.168.6.3,代理地址/base-api // REQUEST_URL: 'http://localhost:80', //本地api地址/FileHandler: 'http://192.168.6.1/APPDownLoad/' //正式保存图片地址UAWebService/api/Test/SaveFile
};
API user.ts
import { request } from '@/utils/request.js';
//1.登录得到code
const LoginByOauth = (data) => {return request.post('/levault/usrsvr/Usr/LoginByOauth', data);
};
//2.通过code获取Token
const GetTokenFromCode = (data) => {return request.post('/levault/usrsvr/Usr/GetTokenFromCode', data);
};
// 获取版本号const getVersion=(data)=> {return request.post('http://192.168.6.1/api/GetVersion', data);
};
export const userApi = {LoginByOauth,GetTokenFromCode,getVersion
};
request.js
import config from '@/utils/config';
// 统一 POST 请求方法示例
const post = async (url, data, options = {}) => {if (!String(url).startsWith('http://')) {url = config.url + url;}console.log("uni.getStorageSync('token')==========", uni.getStorageSync('token'));//判断是否登录if (uni.getStorageSync('token') == null || uni.getStorageSync('token') == '') {// uni.reLaunch({// animationType: 'zoom-out',// animationDuration: 200,// url: "/pages/login/index"// });}const defaultOptions = {method: 'POST',header: {'Content-Type': 'application/json'// ,'token': `${uni.getStorageSync('token')}`}};const finalOptions = { ...defaultOptions, ...options };// 如果服务器需要 token,可以在这里添加 Authorization 头部if (!finalOptions.header['token'] && uni.getStorageSync('token')) {finalOptions.header['token'] = `${uni.getStorageSync('token')}`;}// if (!finalOptions.header['Authorization'] && uni.getStorageSync('token')) {// finalOptions.header['Authorization'] = `Bearer ${uni.getStorageSync('token')}`;// }console.log('POST 请求参数=====', JSON.stringify(data));console.log('POST 请求header=====', finalOptions);console.log('POST url=====', url);uni.showLoading({title: '加载中...'});return new Promise((resolve, reject) => {uni.request({...finalOptions,url: url,data: data,success: (res) => {console.log('请示结果=============', res);if (res.statusCode === 200) {resolve(res.data);} else {reject(new Error(`POST请求失败,状态码:${res.statusCode}`));uni.showToast({icon: 'none',title: `POST请求失败,状态码:${res.statusCode}`});}},fail: (err) => {reject(err);// 网络错误或其他请求失败的情况uni.showToast({icon: 'none',title: 'POST系统异常,请稍后再试'});},complete: () => {uni.hideLoading();}});});
};
// 统一 GET 请求方法示例
const get = async (url, data, options = {}) => {url = config.url + url;console.log("uni.getStorageSync('token')==========", uni.getStorageSync('token'));const defaultOptions = {method: 'GET',header: {'Content-Type': 'application/json'// ,'token': `${uni.getStorageSync('token')}`}};//判断是否登录if (uni.getStorageSync('token') == null || uni.getStorageSync('token') == '') {// uni.reLaunch({// animationType: 'zoom-out',// animationDuration: 200,// url: "/pages/login/index"// });}const finalOptions = { ...defaultOptions, ...options };// 如果服务器需要 token,可以在这里添加 Authorization 头部if (!finalOptions.header['token'] && uni.getStorageSync('token')) {finalOptions.header['token'] = `${uni.getStorageSync('token')}`;}// if (!finalOptions.header['Authorization'] && uni.getStorageSync('token')) {// finalOptions.header['Authorization'] = `Bearer ${uni.getStorageSync('token')}`;// }console.log('GET 请求header=====', finalOptions);console.log('GET url=====', url);console.log('GET 请求参数=====', data);uni.showLoading({title: '加载中...'});return new Promise((resolve, reject) => {uni.request({...finalOptions,url: url,data: data,success: (res) => {console.log('GET请示结果=============', res);if (res.statusCode === 200) {resolve(res.data);} else {reject(new Error(`GET请求失败,状态码:${res.statusCode}`));uni.showToast({icon: 'none',title: `GET请求失败,状态码:${res.statusCode}`});}},fail: (err) => {reject(err);// 网络错误或其他请求失败的情况uni.showToast({icon: 'none',title: 'GET系统异常,请稍后再试'});},complete: () => {uni.hideLoading();}});});
};
const postAsync = async (url, data, options = {}) => {try {// 合并基础URLconst fullUrl = config.url + url;// 构建请求头(动态添加token)const headers = {'Content-Type': 'application/json',...(uni.getStorageSync('token') && { token: uni.getStorageSync('token') })};// 合并自定义配置const finalOptions = {method: 'POST',header: { ...headers, ...options.header },...options};// 调试日志(开发环境保留)if (process.env.NODE_ENV === 'development') {console.log('[POST Request]', {url: fullUrl,data,headers: finalOptions.header});}// 发送请求const response = await new Promise((resolve, reject) => {uni.request({url: fullUrl,data,...finalOptions,success: (res) => resolve(res),fail: (err) => reject(err)});});// 处理响应状态码if (response.statusCode !== 200) {const errorMessage = `请求失败 (${response.statusCode})`;uni.showToast({ icon: 'none', title: errorMessage });throw new Error(errorMessage);}return response.data;} catch (error) {// 统一错误处理const errorMessage = error.errMsg || '系统异常,请稍后再试';uni.showToast({ icon: 'none', title: errorMessage });throw error; // 继续抛出错误供调用方捕获}
};
export const request = {post,postAsync,get
};
二、C# MVC接口代码
检测系统版本号,是否需要升级
using MAPP.WebApi.Models;using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Configuration;namespace MAPP.WebApi.Controllers
{public class SystemController : ApiController{/// <summary>/// 校验系统版本号,返回是否需要更新/// </summary>/// <param name="jo"></param>/// <returns></returns> [HttpPost, Route("api/GetVersion")]public HttpResponseMessage GetVersion(JObject jo){var result = new AppSystemModel();result.IsSuccess = true;result.IsUpdate = false;int appType = 1;//默认安卓系统try{//判断是否启用自动更新if (WebConfigurationManager.AppSettings["OpenAppUpdateOnline"].ToString() != "1"){result.IsUpdate = false;result.NewVersion = "";//result.returnMsg = "不需要更新!";return Request.CreateResponse(HttpStatusCode.OK, result);}string appVersion = "";if (jo["AppVersion"] == null){result.IsSuccess = false;result.IsUpdate = false;result.Msg = "无法获取当前版本号!";return Request.CreateResponse(HttpStatusCode.OK, result);}if (jo["AppType"] != null){if (jo["AppType"].ToString() == "2"){appType = 2;}}if (appType == 1){appVersion = WebConfigurationManager.AppSettings["APKVersion"].ToString();}else{appVersion = WebConfigurationManager.AppSettings["IOSVersion"].ToString();}//服务器端版本Version v1_server = new Version(appVersion.ToLower().Replace("v", ""));//手机端版本Version v2_pda = new Version(jo["AppVersion"].ToString().ToLower().Replace("v", ""));if (v1_server > v2_pda){result.IsUpdate = true;result.Msg = "请更新系统!";return Request.CreateResponse(HttpStatusCode.OK, result);}else{result.IsUpdate = false;result.Msg = "";return Request.CreateResponse(HttpStatusCode.OK, result);}}catch (Exception ex){result.IsSuccess = false;result.IsUpdate = false;result.Msg = "获取版本号失败:" + ex.Message;return Request.CreateResponse(HttpStatusCode.OK, result);}}}
}
web.config
<?xml version="1.0" encoding="utf-8"?>
<!--有关如何配置 ASP.NET 应用程序的详细信息,请访问https://go.microsoft.com/fwlink/?LinkId=301879-->
<configuration><appSettings><!--==========Android版本相关配置============--><!--APP更新下载路径--><add key="AppDownLoadUrl" value="http://192.168.6.1/UpLoad/APPDownLoad/"/><!-- APP是否启用自动升级:1启用,2关闭 --><add key="OpenAppUpdateOnline" value="1"/><!-- ==========Android版本号============ --><add key="APKVersion" value="v1.5.20.1"/><!--==========IOS版本号============--><add key="IOSVersion" value="v1.3.31.1"/><add key="webpages:Version" value="3.0.0.0"/><add key="webpages:Enabled" value="false"/><add key="ClientValidationEnabled" value="true"/><add key="UnobtrusiveJavaScriptEnabled" value="true"/></appSettings><system.web><compilation debug="true" targetFramework="4.6.1"/><httpRuntime targetFramework="4.6.1"/></system.web><system.webServer><handlers><remove name="ExtensionlessUrlHandler-Integrated-4.0"/><remove name="OPTIONSVerbHandler"/><remove name="TRACEVerbHandler"/><add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"preCondition="integratedMode,runtimeVersionv4.0"/></handlers><staticContent><mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" /></staticContent></system.webServer>
</configuration>
AppSystemModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace MAPP.WebApi.Models
{public class AppSystemModel{/// <summary>/// 是否成功/// </summary>public bool IsSuccess { get; set; }/// <summary>/// 返回App版本是否需要更新/// </summary>public bool IsUpdate { get; set; }/// <summary>/// 最新版本号/// </summary>public string NewVersion { get; set; }/// <summary>/// 返回消息/// </summary>public string Msg { get; set; }}public class Payloaddata{public string token { get; set; }public string nickname { get; set; }public string profile { get; set; }public bool hasLogin { get; set; }public bool isGoogle { get; set; }public object result { get; set; }}public class LoginModel{public string UserId { get; set; }public string RoleCode { get; set; }public object DeptId { get; set; }public string UserName { get; set; }}public class UserInfo{public string UserCode { get; set; }public string UserName { get; set; }public object AppModelPageList { get; set; }public object AppModelList { get; set; }}
}
相关文章:
uni-app自动升级功能
效果图 一、VUE login.vue <template><view><view class"uni-common-mt"><view class"uni-flex uni-column"><view class"flex-item flex-item-V"><view class"logo"><image src"/st…...
线性回归 + 基础优化算法
线性回归 线性回归是机器学习最基础的模型,也是理解后续所有深度学习的基础。 线性模型可以看做是单层神经网络。 上述有个0.5是在求导的时候可以很方便的将2消去。 实际上,这里的数据样本受限很大,比如地球上房子就那么多,肯…...
MyBatis分页插件混用问题解析:IPage与PageHelper的冲突与解决
一、背景 在同时使用 MyBatis-Plus 的 IPage 分页 和 PageHelper 时,开发者可能会遇到以下两类问题: 分页结果异常:IPage 查询的 total 总条数返回 0,但实际数据正常。依赖冲突报错:启动时报错 Column.withColumnNam…...
4.Socket类、InetAddr类、Epoll类实现模块化
目录 1. InetAddr类 类定义 代码说明 类实现 2.Socket类 类定义 类实现 3. Epoll类 类定义 构造与析构函数 方法实现 类实现 4. 使用模块化设计 示例使用(main.cpp) 5. 运行程序 随着程序复杂度的增加,单一的面向过程的代码会变得难以理…...
19 python 模块
在办公室的日常工作中,我们常常会用到各种各样的工具,像计算器用于计算数据、打印机用来打印文件、订书机将纸张装订成册等。这些工具会被反复使用,而且不同的工具具有不同的功能。 一、模块的定义 在 Python 里,模块就如同一个…...
医疗智能体通信整合-大模型训练中沟通优化策略研究
一、引言:医疗模型训练的沟通困境 1.1 医疗 AI 发展背景 在数智化浪潮的推动下,医疗 AI 正以前所未有的速度融入现代医疗体系。从智能影像诊断助力医生精准识别病灶,到基于大数据分析的个性化药物研发,医疗 AI 在提升医疗效率、改善医疗质量方面展现出巨大潜力。据相关数据…...
LearnOpenGL-笔记-其六
今天我们来聊一些更深入的东西: Depth Testing 在之前的学习过程中,我们有接触过深度缓冲,彼时的深度缓冲的意义就是可以让我们体现出深度的差异从而达到立体的效果,而现在我们将在深度缓冲的基础进一步扩展,进行深度…...
【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Windows 10更新失败解决方法
在我们使用 Windows 时的时候,很多时候遇到系统更新 重启之后却一直提示“我们无法完成更新,正在撤销更改” 这种情况非常烦人,但其实可以通过修改文件的方法解决,并且正常更新到最新版操作系统 01修改注册表 管理员身份运行注…...
【安当产品应用案例100集】042-基于安当KADP实现机密文件安全流转
一、客户需求 某集团公司客户,在系统业务流中,存在大量的内部文件流转的需求。内部业务文件有不同的安全密级,最初在文件流转时,公司内部规定点对点的文件传输,要使用加密工具加密后再发给需要的一方。这种方式虽然能…...
【网络】Socket套接字
目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API (1)socket (2)bind sockaddr结构 (3)listen (4)a…...
蓝桥杯[每日一题] 真题:连连看
题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中,每个格子中都有一个整数,第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等,且它…...
新手SEO优化实战快速入门
内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…...
Android面试总结之Glide源码级理解
当你的图片列表在低端机上白屏3秒、高端机因内存浪费导致FPS腰斩时,根源往往藏在Glide的内存分配僵化、磁盘混存、网络加载无优先级三大致命缺陷中。 本文从阿里P8级缓存改造方案出发,结合Glide源码实现动态内存扩容、磁盘冷热分区、智能预加载等黑科技&…...
基于类型属性的重载
算法重载 在一个泛型算法中引入更为特化的变体,这种设计和优化方式称为算法特化。之所以需要算法特化,原因有二: 针对特定类型使用更加合理的实现,对于const char *,less的第二个实现更加合理 template <typename…...
对称加密算法和非对称加密算法
在这个互联网普及的时代,在不同终端对敏感甚至机密数据进行传输是非常常见的场景,但是如何保证数据传输过程的安全性和高效性是一个值得深入探讨的问题。 为此,伟大的人类研究出了多种加密算法,我们可以大致将其分为两类…...
工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐
一、什么是工程数字建造管理系统平台? 工程数字建造管理系统平台是一种集成了先进信息技术(如云计算、大数据、物联网等)的综合性管理工具,它旨在通过数字化手段提升工程建造全过程的管理效率和决策水平。这一平台不仅覆盖了工程…...
CMake ERROR: arm-none-eabi-gcc is not able to compile a simple test program.
用 cmake 构建 STM32 工程问题【已解决】 环境信息 os: ubuntu22.04gcc: arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009cmake: cmake version 3.22.1ninja: 1.10.1 问题 log [main] 正在配置项目: Olidy [driver] 删除 /home/pomegr…...
容器主机CPU使用率突增问题一则
关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 业务一台容器服务器,近期经常收到cpu不定期抖动告警&#x…...
CTFshow【命令执行】web29-web40 做题笔记
web29----过滤关键字 正则匹配,过滤flag,可以使用通配符绕过 先查看目录 使用通配符?查看flag 点击查看源代码 web30---过滤函数和关键字 看到过滤了system执行系统命令和flag,php关键字 找一个与其功能差不多的执行函数passthr…...
L2正则化:优化模型的平滑之道
常见的正则化方法1. **L1正则化(Lasso)**1.1基本原理1.2特点1.3数学推导1.4参数更新1.5选择合适的正则化系数1.6优点1.7缺点1.8实际应用中的注意事项1.9示例 2. **L2正则化(Ridge)**L2正则化的定义L2正则化如何防止过拟合1. **限制…...
Golang 的 GMP 调度机制常见问题及解答
文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么?2. 为什么 Go 需要自己的调度器?3. GOMAXPROCS 的作用是什么? 调度流程4. Goroutine 如何被调度到 M 上执行?5. 系统调用会阻塞整个线程吗࿱…...
使用VSCODE导致CPU占用率过高的处理方法
1:cpptools 原因:原因是C/C会在全局搜索文件,可以快速进行跳转;当打开的文件过大,全局搜索文件会占用大量CPU; 处理方法: 1:每次只打开小文件夹; 2:打开大文…...
17--华为防火墙智能选路全解:网络世界的智能导航系统
华为防火墙智能选路全解:网络世界的智能导航系统 开篇故事:快递小哥的烦恼与网络世界的相似性 想象你是个快递站站长,每天要处理来自全国各地的包裹。突然某天遇到: 🚚 双11爆仓:如何把包裹最快送到客户手…...
CSS-BFC(块级格式化上下文)
一、BFC 的本质理解(快递仓库比喻) 想象一个快递分拣仓库(BFC容器),这个仓库有特殊的规则: 仓库内的包裹(内部元素)摆放不影响其他仓库包裹必须整齐堆叠,不能越界不同仓…...
Java 大视界 -- Java 大数据在智慧港口集装箱调度与物流效率提升中的应用创新(159)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划|文献速递-医学影像人工智能进展
Title 题目 ZygoPlanner: A three-stage graphics-based framework for optimal preoperative planning of zygomatic implant placement ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划 01 文献速递介绍 1.1 研究背景 颧…...
【2.项目管理】2.4 Gannt图【甘特图】
甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...
python学习笔记(1)
为什么要学python 目前在研究网站的搭建,想通过python搭建一个我的世界资源买卖的平台,然后就开始研究python了,其实这不是我第一次研究python了,之前学的都不咋样,现在温故而知新,好好研究一下python。 Python的变量 在此之前先简单的介绍一下变量,给第一次接触的小…...
刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
在金融科技高速发展的今天,股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口,帮助用户快速获取实时或历史市场数据,为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...
2025 年吉林省燃气企业从业人员考试:实用备考攻略与考试提分要点
2025 年吉林省燃气企业从业人员考试报名通过吉林燃气行业管理系统。报名资料包含企业的环保达标证明(燃气行业涉及环保要求)、个人的岗位任职证明等。实用备考攻略是,关注吉林在燃气分布式能源系统建设方面的进展,结合《燃气冷热电…...
dubbo http流量接入dubbo后端服务
简介 dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题: 多协议发布【推荐】,为dubbo协议服务暴…...
自动驾驶04:点云预处理03
点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…...
小程序中过滤苹果设备中的表情(即 emoji)
在小程序中过滤苹果设备中的表情(即 emoji),通常需要考虑以下几个方面:识别 emoji、处理用户输入、以及在显示或存储时进行过滤。以下是具体的实现思路和步骤: 1. 理解苹果中的表情(Emoji) 苹果…...
软件性能测试中的“假阳性”陷阱
软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…...
现代优雅品牌杂志包装徽标设计衬线英文字体安装包 Relish – Aesthetic Font
CS Relish – 美学字体:优雅与现代简约的结合 永恒的现代 Serif 字体 CS Relish 是一种现代衬线字体,将极简主义美学与精致精致融为一体。凭借其时尚、干净的字体和平衡的结构,它给人一种优雅和现代的印象。这款字体专为那些欣赏微妙和优雅的…...
《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略
正在学习或者是使用 Oracle 数据库的小伙伴,是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢?而且即使是手动去开关也显得即为麻烦,所以基于我之前所学习到的方法,我在此重新整理,让大家动动手指就能完成开…...
《寒门枭雄传》章回目录与核心故事设计(36回)
《寒门枭雄传》章回目录与核心故事设计(36回) 主线:寒门崛起→权力异化→制度轮回 核心冲突:个人奋斗 vs 制度性压迫 第一卷京口草鞋摊的野望(第1-12回) 主题:寒门之困始于生存,终…...
C语言学习笔记(抱佛脚版)
毕业一年,发现记性是真的差,每次想起之前的知识总是想不全,看别人写的资料也懵懵懂懂。于是我索性自己再学一遍,并且记录一下。希望对你们也有所帮助。 正片开始! 前面的什么if for都不难理解,嵌套的话也…...
DeepSeek-V3-0324 模型发布:开源 AI 性能再攀高峰,推理与编码能力逼近顶级闭源模型
2025 年 3 月 24 日,国内 AI 公司深度求索(DeepSeek)悄然推出 V3 模型的升级版本 DeepSeek-V3-0324。尽管此次更新并非市场期待的 V4 或 R2 版本,但其在推理速度、编码能力、数学推理及开源生态上的突破,仍迅速引发全球…...
清晰易懂的Cursor实现AI编程从安装到实战TodoList开发
一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…...
(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门
引言 AVFoundation 是 Apple 提供的强大多媒体框架,支持音视频播放、录制、处理等功能。在 iOS 开发中,AVFoundation 是实现视频播放的核心技术之一。 本篇文章将简单介绍如何使用 AVPlayer、AVPlayerItem 和 AVPlayerLayer 进行视频播放,并…...
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案! 稳联技术Profinet转CANopen网关应运而生——它如同一座智能桥梁☺,打通两大主流工业协议,让异构网络无缝互联,助您释放设备潜力,实现真正的“万物互联”&…...
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
问题描述 在Linux安装conda下的python环境时候,修改了~/.bashrc文件,修改完成后,再次进入服务器后,登录时候显示的不是正常的[rootlocalhost ~]#,而是-bash-4.2# 原因分析: 网上原因有:/root下…...
关于deepseek
DeepSeek:领先的人工智能研究与创新公司 公司简介 DeepSeek(深度求索)是一家专注于人工智能(AI)技术研发的创新公司,致力于推动大模型、自然语言处理(NLP)、机器学习(M…...
EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路
一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…...
李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念
机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值:label MAE MSE 几率分布,cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小,找导数为零的点 单独考虑w,w…...
RAG生成中的多文档动态融合及去重加权策略探讨
目录 RAG生成中的多文档动态融合及去重加权策略探讨 一、RAG生成概述 二、多文档动态融合策略 1. 拼接与分段编码 2. 独立编码与后续融合 3. 基于查询的动态加权 三、检索结果的去重与加权策略 1. 去重策略 2. 加权策略 四、实践中的挑战与思考 五、结语 RAG生成中的…...
对匿名认证的理解
概述:在 Spring Security 中,** 匿名认证(Anonymous Authentication)** 是一种特殊的认证机制,用于处理未提供有效凭证的请求。 匿名认证的本质 目的:允许未认证用户访问特定资源。原理: 当请求…...
leetcoed0044. 通配符匹配 hard
1 题目:通配符匹配 官方难度:难 给你一个输入字符串 (s) 和一个字符模式 ( p ) ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序…...