<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>留言</title>
<style type="text/css">
body,div,h2,h3,ul,li,p{margin:0;padding:0;}
a{text-decoration:none;}
a:hover{text-decoration:underline;}
ul{list-style-type:none;}
body{color:#333;background:#3c3a3b;font:12px/1.5 \5b8b\4f53;}
#msgBox{width:500px;background:#fff;border-radius:5px;margin:10px auto;padding-top:10px;}
#msgBox form h2{font-weight:400;font:400 18px/1.5 \5fae\8f6f\96c5\9ed1;}
#msgBox form{background:url() repeat-x 0 bottom;padding:0 20px 15px;}
#userName,#conBox{color:#777;border:1px solid #d0d0d0;border-radius:6px;background:#fff url(img/inputBG.png) repeat-x;padding:3px 5px;font:14px/1.5 arial;}
#userName.active,#conBox.active{border:1px solid #7abb2c;}
#userName{height:20px;}
#conBox{width:448px;resize:none;height:65px;overflow:auto;}
#msgBox form div{position:relative;color:#999;margin-top:10px;}
#msgBox img{border-radius:3px;}
#face{position:absolute;top:0;left:172px;}
#face img{width:30px;height:30px;cursor:pointer;margin-right:6px;opacity:0.5;filter:alpha(opacity=50);}
#face img.hover,#face img.current{width:28px;height:28px;border:1px solid #f60;opacity:1;filter:alpha(opacity=100);}
#sendBtn{border:0;width:112px;height:30px;cursor:pointer;margin-left:10px;background:url(img/btn.png) no-repeat;}
#sendBtn.hover{background-position:0 -30px;}
#msgBox form .maxNum{font:26px/30px Georgia, Tahoma, Arial;padding:0 5px;}
#msgBox .list{padding:10px;}
#msgBox .list h3{position:relative;height:33px;font-size:14px;font-weight:400;background:#e3eaec;border:1px solid #dee4e7;}
#msgBox .list h3 span{position:absolute;left:6px;top:6px;background:#fff;line-height:28px;display:inline-block;padding:0 15px;}
#msgBox .list ul{overflow:hidden;zoom:1;}
#msgBox .list ul li{float:left;clear:both;width:100%;border-bottom:1px dashed #d8d8d8;padding:10px 0;background:#fff;overflow:hidden;}
#msgBox .list ul li.hover{background:#f5f5f5;}
#msgBox .list .userPic{float:left;width:50px;height:50px;display:inline;margin-left:10px;border:1px solid #ccc;border-radius:3px;}
#msgBox .list .content{float:left;width:400px;font-size:14px;margin-left:10px;font-family:arial;word-wrap:break-word;}
#msgBox .list .userName{display:inline;padding-right:5px;}
#msgBox .list .userName a{color:#2b4a78;}
#msgBox .list .msgInfo{display:inline;word-wrap:break-word;}
#msgBox .list .times{color:#889db6;font:12px/18px arial;margin-top:5px;overflow:hidden;zoom:1;}
#msgBox .list .times span{float:left;}
#msgBox .list .times a{float:right;color:#889db6;display:none;}
.tr{overflow:hidden;zoom:1;}
.tr p{float:right;line-height:30px;}
.tr *{float:left;}
</style>
<script type="text/javascript">
var get = {
byId: function(id) {
return typeof id === "string" ? document.getElementById(id) : id
},
byClass: function(sClass, oParent) {
var aClass = [];
var reClass = new RegExp("(^| )" + sClass + "( |$)");
var aElem = this.byTagName("*", oParent);
for (var i = 0; i < aElem.length; i++) reClass.test(aElem[i].className) && aClass.push(aElem[i]);
return aClass
},
byTagName: function(elem, obj) {
return (obj || document).getElementsByTagName(elem)
}
};
/*-------------------------- +
事件绑定, 删除
+-------------------------- */
var EventUtil = {
addHandler: function (oElement, sEvent, fnHandler) {
oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : (oElement["_" + sEvent + fnHandler] = fnHandler, oElement[sEvent + fnHandler] = function () {oElement["_" + sEvent + fnHandler]()}, oElement.attachEvent("on" + sEvent, oElement[sEvent + fnHandler]))
},
removeHandler: function (oElement, sEvent, fnHandler) {
oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, oElement[sEvent + fnHandler])
},
addLoadHandler: function (fnHandler) {
this.addHandler(window, "load", fnHandler)
}
};
/*-------------------------- +
设置css样式
读取css样式
+-------------------------- */
function css(obj, attr, value)
{
switch (arguments.length)
{
case 2:
if(typeof arguments[1] == "object")
{
for (var i in attr) i == "opacity" ? (obj.style["filter"] = "alpha(opacity=" + attr[i] + ")", obj.style[i] = attr[i] / 100) : obj.style[i] = attr[i];
}
else
{
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj, null)[attr]
}
break;
case 3:
attr == "opacity" ? (obj.style["filter"] = "alpha(opacity=" + value + ")", obj.style[attr] = value / 100) : obj.style[attr] = value;
break;
}
};
EventUtil.addLoadHandler(function ()
{
var oMsgBox = get.byId("msgBox");
var oUserName = get.byId("userName");
var oConBox = get.byId("conBox");
var oSendBtn = get.byId("sendBtn");
var oMaxNum = get.byClass("maxNum")[0];
var oCountTxt = get.byClass("countTxt")[0];
var oList = get.byClass("list")[0];
var oUl = get.byTagName("ul", oList)[0];
var aLi = get.byTagName("li", oList);
var aFtxt = get.byClass("f-text", oMsgBox);
var aImg = get.byTagName("img", get.byId("face"));
var bSend = false;
var timer = null;
var oTmp = "";
var i = 0;
var maxNum = 140;
//禁止表单提交
EventUtil.addHandler(get.byTagName("form", oMsgBox)[0], "submit", function () {return false});
//为广播按钮绑定发送事件
EventUtil.addHandler(oSendBtn, "click", fnSend);
//为Ctrl+Enter快捷键绑定发送事件
EventUtil.addHandler(document, "keyup", function(event)
{
var event = event || window.event;
event.ctrlKey && event.keyCode == 13 && fnSend()
});
//发送广播函数
function fnSend ()
{
var reg = /^\s*$/g;
if(reg.test(oUserName.value))
{
alert("\u8bf7\u586b\u5199\u60a8\u7684\u59d3\u540d");
oUserName.focus()
}
else if(!/^[u4e00-\u9fa5\w]{2,8}$/g.test(oUserName.value))
{
alert("\u59d3\u540d\u75312-8\u4f4d\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6c49\u5b57\u7ec4\u6210\uff01");
oUserName.focus()
}
else if(reg.test(oConBox.value))
{
alert("\u968f\u4fbf\u8bf4\u70b9\u4ec0\u4e48\u5427\uff01");
oConBox.focus()
}
else if(!bSend)
{
alert("\u4f60\u8f93\u5165\u7684\u5185\u5bb9\u5df2\u8d85\u51fa\u9650\u5236\uff0c\u8bf7\u68c0\u67e5\uff01");
oConBox.focus()
}
else
{
var oLi = document.createElement("li");
var oDate = new Date();
oLi.innerHTML = "<div class=\"userPic\"><img src=\"" + get.byClass("current", get.byId("face"))[0].src + "\"></div>\
<div class=\"content\">\
<div class=\"userName\"><a href=\"javascript:;\">" + oUserName.value + "</a>:</div>\
<div class=\"msgInfo\">" + oConBox.value.replace(/<[^>]*>| /ig, "") + "</div>\
<div class=\"times\"><span>" + format(oDate.getMonth() + 1) + "\u6708" + format(oDate.getDate()) + "\u65e5 " + format(oDate.getHours()) + ":" + format(oDate.getMinutes()) + "</span><a class=\"del\" href=\"javascript:;\">\u5220\u9664</a></div>\
</div>";
//插入元素
aLi.length ? oUl.insertBefore(oLi, aLi[0]) : oUl.appendChild(oLi);
//重置表单
get.byTagName("form", oMsgBox)[0].reset();
for (i = 0; i < aImg.length; i++) aImg[i].className = "";
aImg[0].className = "current";
//将元素高度保存
var iHeight = oLi.clientHeight - parseFloat(css(oLi, "paddingTop")) - parseFloat(css(oLi, "paddingBottom"));
var alpah = count = 0;
css(oLi, {"opacity" : "0", "height" : "0"});
timer = setInterval(function ()
{
css(oLi, {"display" : "block", "opacity" : "0", "height" : (count += 8) + "px"});
if (count > iHeight)
{
clearInterval(timer);
css(oLi, "height", iHeight + "px");
timer = setInterval(function ()
{
css(oLi, "opacity", (alpah += 10));
alpah > 100 && (clearInterval(timer), css(oLi, "opacity", 100))
},30)
}
},30);
//调用鼠标划过/离开样式
liHover();
//调用删除函数
delLi()
}
};
//事件绑定, 判断字符输入
EventUtil.addHandler(oConBox, "keyup", confine);
EventUtil.addHandler(oConBox, "focus", confine);
EventUtil.addHandler(oConBox, "change", confine);
//输入字符限制
function confine ()
{
var iLen = 0;
for (i = 0; i < oConBox.value.length; i++) iLen += oConBox.value.charAt(i).charCodeAt() > 255 ? 1 : 0.5;
oMaxNum.innerHTML = Math.abs(maxNum - Math.floor(iLen));
maxNum - Math.floor(iLen) >= 0 ? (css(oMaxNum, "color", ""), oCountTxt.innerHTML = "\u8fd8\u80fd\u8f93\u5165", bSend = true) : (css(oMaxNum, "color", "#f60"), oCountTxt.innerHTML = "\u5df2\u8d85\u51fa", bSend = false)
}
//加载即调用
confine();
//广播按钮鼠标划过样式
EventUtil.addHandler(oSendBtn, "mouseover", function () {this.className = "hover"});
//广播按钮鼠标离开样式
EventUtil.addHandler(oSendBtn, "mouseout", function () {this.className = ""});
//li鼠标划过/离开处理函数
function liHover()
{
for (i = 0; i < aLi.length; i++)
{
//li鼠标划过样式
EventUtil.addHandler(aLi[i], "mouseover", function (event)
{
this.className = "hover";
oTmp = get.byClass("times", this)[0];
var aA = get.byTagName("a", oTmp);
if (!aA.length)
{
var oA = document.createElement("a");
oA.innerHTML = "删除";
oA.className = "del";
oA.href = "javascript:;";
oTmp.appendChild(oA)
}
else
{
aA[0].style.display = "block";
}
});
//li鼠标离开样式
EventUtil.addHandler(aLi[i], "mouseout", function ()
{
this.className = "";
var oA = get.byTagName("a", get.byClass("times", this)[0])[0];
oA.style.display = "none"
})
}
}
liHover();
//删除功能
function delLi()
{
var aA = get.byClass("del", oUl);
for (i = 0; i < aA.length; i++)
{
aA[i].onclick = function ()
{
var oParent = this.parentNode.parentNode.parentNode;
var alpha = 100;
var iHeight = oParent.offsetHeight;
timer = setInterval(function ()
{
css(oParent, "opacity", (alpha -= 10));
if (alpha < 0)
{
clearInterval(timer);
timer = setInterval(function ()
{
iHeight -= 10;
iHeight < 0 && (iHeight = 0);
css(oParent, "height", iHeight + "px");
iHeight == 0 && (clearInterval(timer), oUl.removeChild(oParent))
},30)
}
},30);
this.onclick = null
}
}
}
delLi();
//输入框获取焦点时样式
for (i = 0; i < aFtxt.length; i++)
{
EventUtil.addHandler(aFtxt[i], "focus", function () {this.className = "active"});
EventUtil.addHandler(aFtxt[i], "blur", function () {this.className = ""})
}
//格式化时间, 如果为一位数时补0
function format(str)
{
return str.toString().replace(/^(\d)$/,"0$1")
}
//头像
for (i = 0; i < aImg.length; i++)
{
aImg[i].onmouseover = function ()
{
this.className += " hover"
};
aImg[i].onmouseout = function ()
{
this.className = this.className.replace(/\s?hover/,"")
};
aImg[i].onclick = function ()
{
for (i = 0; i < aImg.length; i++) aImg[i].className = "";
this.className = "current"
}
}
});
</script>
</head>
<body>
<div id="msgBox">
<form>
<h2>说点什么?</h2>
<div>
<input id="userName" class="f-text" value="" />
<p id="face"><img src="/jscss/demoimg/201110/face1.gif" class="current" /><img src="/jscss/demoimg/201110/face2.gif" /><img src="/jscss/demoimg/201110/face1.gif" /><img src="/jscss/demoimg/201110/face2.gif" /></p>
</div>
<div><input id="conBox" class="f-text"></div>
<div class="tr">
<p>
<span class="countTxt">还能输入</span><strong class="maxNum">140</strong><span>个字</span>
<input id="sendBtn" type="button" value="" title="快捷键 Ctrl+Enter" />
</p>
</div>
</form>
<div class="list">
<h3><span>已发表</span></h3>
<ul>
<li>
<div class="userPic"><img src="/jscss/demoimg/201110/face.gif" /></div>
<div class="content">
<div class="userName"><a href="javascript:;">日丶久生情</a>:</div>
<div class="msgInfo">新增Ctrl+Enter快捷键发送广播。</div>
<div class="times"><span>07月05日 12:20</span><a class="del" href="javascript:;">删除</a></div>
</div>
</li>
<li>
<div class="userPic"><img src="/jscss/demoimg/201110/face.gif" /></div>
<div class="content">
<div class="userName"><a href="javascript:;">日丶久生情</a>:</div>
<div class="msgInfo">新增选择头像功能。</div>
<div class="times"><span>07月05日 12:08</span><a class="del" href="javascript:;">删除</a></div>
</div>
</li>
<li>
<div class="userPic"><img src="/jscss/demoimg/201110/face.gif" /></div>
<div class="content">
<div class="userName"><a href="javascript:;">日丶久生情</a>:</div>
<div class="msgInfo">增加了记录广播时间的功能。</div>
<div class="times"><span>07月04日 16:55</span><a class="del" href="javascript:;">删除</a></div>
</div>
</li>
</ul>
</div>
</div>
</body>
</html>相关推荐
Python Selenium自动化爬虫实战:QQ空间数据抓取与备份方案
网络爬虫作为数据采集的核心技术,其原理是通过模拟浏览器行为自动获取网页信息。在动态网页日益普及的今天,传统静态爬虫面临JavaScript渲染内容的挑战,此时浏览器自动化工具的价值凸显。Selenium作为主流的Web自动化框架,能够驱动真实浏览器执行点击、滚动等交互操作,完美解决动态内容加载问题,在数据采集、自动化测试等领域应用广泛。结合Python生态的数据处理库,可以构建稳健的爬虫系统,实现大规模数据采集与结构化存储。本文以QQ空间数据备份为具体场景,详细解析如何利用Selenium应对动态页面、模拟
Js仿腾讯微博效果,无刷新删除微博
[code="html"] 仿腾讯微博效果 body,div,h2,h3,ul,li,p{margin:0;padding:0;} a{text-decoration:none;} a:hover{text-decoration:underline;} ul{list-style-type:none;} body{color:#333;background:#3c3a3b;...
生存网络与mlr3proba
通过结合生存网络和mlr3proba,可以使用生存网络模型来预测个体在给定时间点发生事件的概率,并使用mlr3proba提供的工具进行模型的训练、评估和选择最佳模型。iii)基本的机器学习(ML)方法,如重新排序和调整。在本文中,我们将只讨论前五种,因为它们在文献中得到了更好的建立,并且它们具有相同的接口,这简化了调优,我们将在下面看到。我们不会为模型指定自定义架构,而是使用默认架构,如果你熟悉PyTorch,那么你可以选择创建自己的架构,如果你愿意的话,通过将其传递给模型中的custom_net参数。
高仿精仿新浪微博客户端完整版源码
给大家分享一款非常不错的,高仿精仿新浪微博客户端完整版源码,现在网上很少有这个源码,喜欢的朋友可以下载学习一下吧。 下载地址: http://code.662p.com/view/345.html...
Mellanox ASAP2技术揭秘:如何通过硬件卸载提升OVS性能?
本文深入解析Mellanox ASAP2技术如何通过硬件卸载显著提升Open vSwitch(OVS)性能。通过将数据平面操作转移到ConnectX智能网卡处理,ASAP2实现了10倍吞吐量提升和90%延迟降低,同时大幅减少CPU占用。文章包含技术原理剖析、实战配置指南及性能对比数据,为网络虚拟化优化提供关键解决方案。
Intel RealSense D435深度相机实战:从数据采集到点云生成的完整避坑指南
本文详细介绍了Intel RealSense D435深度相机的实战应用,从数据采集到点云生成的完整流程,并提供了避坑指南。内容包括环境配置、硬件调优、数据采集技巧、点云生成核心技术及典型场景解决方案,帮助开发者高效利用D435进行机器人导航、三维重建等应用。
使用原生JS实现QQ好友、QQ空间、新浪微博、腾讯微博分享功能
使用原生JS实现QQ好友、QQ空间、新浪微博、腾讯微博分享功能。
FPGA时序约束--实战篇(读懂Vivado时序报告)
本文将详细介绍如何读懂Vivado时序报告,包括报告的基本结构和如何分析报告。
html5仿微博弹出,JS 仿腾讯发表微博的效果代码
/*** 仿腾讯发表微博的效果* 1.目前没有发ajax请求 后台没有记录 所以刷新页面 会清掉* 2. 时间是用的是客户端时间 假如客户端时间错误的话 那么时间也会受影响。* 目前就这样交互 具体的思路不太复杂 如果项目中用到这样的 可以根据具体的需求更改* @constructor Microblog* @date 2013-12-23* @author tugenhua* @email 87...
[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档
摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。
Xilinx FPGA资源解析与使用系列——Transceiver(六)关键时钟梳理之TXOUTCLK和RXOUTCLK
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA资源解析与使用系列——Transceiver(六)transceiver内部关键时钟梳理之TXOUTCLK和RXOUTCLK前言TXOUTCLKRXOUTCLK 前言 前面我们已经研读了 transceiver的参考时钟 和复位的相关内容。 但是随着内容的深入,越来越多的信号出现在我的面前。 例如 TXOUTCLK、TXUSERCLK、TXUSERCLK2 RXOUTCLK、RXUSERCLK、RXUSERCLK2
Python自动化脚本实现QQ创意表白:技术浪漫的完整实践指南
自动化脚本是计算机编程中实现任务自动执行的核心技术,其原理是通过预设指令序列控制软件或系统行为,从而提升效率与体验。在技术实践中,Python因其简洁语法与丰富库生态,成为开发自动化工具的优选语言,广泛应用于数据处理、网络爬虫、GUI操作等场景。结合即时通讯软件QQ的广泛用户基础,Python自动化脚本能够模拟人工交互,实现创意性、仪式感强的个性化表达。本文聚焦于利用pyautogui等库实现QQ消息的**自动化发送**与**多媒体控制**,通过模拟打字、播放音乐、发送链接等操作,构建一套完整的情感表达流程
SAP Business Technology Platform 支持的技术栈
SAP Business Technology Platform(简称 BTP)是 SAP 提供的一个综合技术平台,旨在帮助企业实现业务转型和创新。BTP 融合了数据库管理、应用开发、集成、分析和智能技术,为企业提供从基础架构到端到端应用的全面服务。
qq机器人自动回复带脚本可以实现吗_利用机器人(Script)进行日常办公的解决方案(一)...
最近国内疫情逐渐好转,但仍不可掉以轻心。在此期间以往的大部分工作都转移到线上,人们对网络的访问量暴增,这可让国内的互联网巨头高兴坏了,可是对不少使用网络服务的人们可谓头疼不已线上会议,线上教学线上办公线上打卡、问卷但是很多人都会发现,有许多工作大部分都是点一下,划两下,打几个字,点一下,划两下,点几个字,点一下,划两下,点几个字,非常简单,但是每天无脑重复刷,日复一日,搞得你心情烦躁。也行每天你可...
行业变革下的功能安全落地痛点3:高阶智驾安全责任转移 —— 从 “人为中心” 到 “机器主责” 的产业阵痛
文章围绕高阶智驾(L3 级)落地挑战,探讨安全责任从 “人控” 向 “机控” 转移的本质、技术短板导致的责任模糊、全球法规实践及技术 - 法规 - 保险的破局路径。
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
自己写个QQ微博申请工具
微博从4月初开始内侧,看着新浪,网易,搜狐都相继在twitter模式的微博上布局,腾讯也坐不住了.其实在这之前腾讯就有三个微博产品,一个是最初的滔滔,一个是QQ空间的心情,还有一个是QQ邮箱的广播.其中只有心情得到了广泛应用,而且用户群与日俱增,大家越来越习惯在自己的QQ空间或签名上留下几句话供好友玩味.只是心情较之传统的微博还是有很大区别,最显著的区别就是心情不具备辐射性.心情的分享
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
爬虫技术(二)-客户端爬虫
在上一篇文章《一篇文章了解爬虫技术现状》中,我们总结了目前后台爬虫所面临的交互困难、javascript解析麻烦、以及ip限制三大问题。本期,我们不妨换一种思路来重新思考,说不定会别开生面、柳暗花明。 承上 书接上文,我们说明了目前后台爬虫所面临的三大问题,此三点对于后台爬虫来说基本条条都是硬伤,当然,现在有些网站安全性考虑的不够,安全策略并非太过复杂,在有些场景下,对后端爬虫来说不至于会致命...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
(附源码)ssm学生管理系统-毕业设计 课程设计 141543
本设计主要实现集人性化、高效率、便捷等优点于一身的学生管理系统,完成首页、用户管理(管理员、学生)更多管理(学院管理、专业管理、班级管理、课程安排、学生选课、课程成绩、学生请假、健康申报、通知公告)系统通过浏览器与服务器进行通信,实现数据的交互与变更。只需通过一台电脑,动动手指就可以操作系统,实现数据通信管理。整个系统的设计过程都充分考虑了数据的安全、稳定及可靠等问题,而且操作过程简单。本系统通过科学的管理方式、便捷的服务提高了工作效率,减少了数据存储上的错误和遗漏。...
Notion API与音乐平台集成:打造个人音乐库的自动化方案
API(应用程序编程接口)是现代软件系统间通信和数据交换的核心技术,它定义了不同服务之间交互的规则和格式。通过调用API,开发者可以便捷地获取外部数据或触发特定功能,从而实现系统集成与自动化。这一技术价值在于极大地提升了数据流转效率和个性化工作流的构建能力,广泛应用于数据同步、内容管理和自动化办公等场景。本文聚焦于利用Notion API和音乐平台API,实现音乐信息的自动化抓取与结构化存储,构建一个可检索、可扩展的个人音乐库。通过Python脚本和轻量级工具链,用户可以轻松地将网易云音乐等平台的歌曲信息(
OpenClaw部署避坑指南:轻量服务器自托管实战
AI Agent不是单个可执行程序,而是由模型服务、向量数据库、消息中间件等组成的微服务集合体。其稳定运行依赖于合理的部署架构——本地直跑缺乏网络可达性与持久性,SaaS托管牺牲可控性与私有集成能力,而轻量服务器自托管则在运维成本、安全边界与定制自由度之间取得关键平衡。它支持HTTPS反向代理、Webhook签名验证、系统级日志监控与自动化备份,是实现微信/飞书等IM通道7×24小时可靠接入的工程基线。本文聚焦OpenClaw在真实业务场景下的生产级部署路径,覆盖实例选型、Caddy反向代理配置、Webho
开源免费AI桌宠AIRI:二次元女友陪你玩游戏,本地部署教程
AI对话技术正在从冰冷的文本框走向更具陪伴感的桌面应用。开源项目通过将语言模型与虚拟角色形象结合,构建出能在日常场景中互动的智能体,这种形态也被称为“AI桌宠”。其技术原理并不复杂:本地服务加载角色模型与对话引擎,通过接口与用户交互,既能提供实时聊天,又能以二次元形象常驻桌面。这类项目的技术价值在于免费、开源、可扩展,用户不仅能直接使用,还能通过替换PMX模型或调整提示词来定制角色人设。应用场景也颇为广泛,从游戏伴侣到桌面互动助手,甚至可作为本地AI服务的调试入口。本文以开源桌宠项目my_ai_town为例
工作中使用到的单词(软件开发)
1.エイリアス alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート promote 促进,提升 开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................
从零到一构建情感疗愈应用:暖屿 (Warm Isle) 全栈技术架构深度解析
摘要 《暖屿技术实现讲解文档》详细介绍了情感疗愈应用暖屿的全栈技术架构。项目基于FastAPI+Vue3前后端分离架构,采用Docker容器化部署,核心功能包含情绪管理、AI陪伴等。文档系统讲解了后端基础设施(配置管理、依赖注入)、业务逻辑、实时通信等设计,以及前端Vue3的状态管理、组件化实践。关键技术包括异步架构、AI集成、支付系统等,并涵盖测试、代码规范及扩展建议。目标读者为开发者、技术学习者和项目维护者,提供了现代Web应用的完整技术实现参考。
CnOpenData 线上招聘网站信息数据
CnOpenData线上招聘网站信息数据库是一个覆盖中国主流招聘平台、时间跨度长、更新频率高的劳动力市场需求侧大数据集合。本数据库汇集了,为学术界和业界提供了一扇实时观察中国劳动力市场动态的窗口。
js实现留言板 localStorage
js使用localStorage实现简易留言板
JavaScript之留言板制作
本文主要介绍留言板的制作,用户可对新闻消息进行评论,发表之后评论会被置于顶端,点击相应删除按钮即可删除。本文主要介绍两种方式,区别在于如何实现评论的删除。1.在函数的局部作用域内完成删除事件的绑定,可以实现“点哪个删哪个评论”的效果。代码如下: 2.通过事件委托的方式,给评论模块的父级绑定事件,通过e.target属性的应用完成删除功能。代码如下:......
275



被折叠的 条评论
为什么被折叠?



