-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 185 KB
/
content.json
File metadata and controls
1 lines (1 loc) · 185 KB
1
{"meta":{"title":"HongLiu的小站","subtitle":"做自己所爱的事,爱自己所做的事","description":"HongLiu的赛博自建房","author":"HongLiu","url":"https://hongliu.icu","root":"/"},"pages":[{"title":"","date":"2026-01-14T16:06:32.889Z","updated":"2026-01-14T16:06:32.889Z","comments":true,"path":"custom.css","permalink":"https://hongliu.icu/custom.css","excerpt":"","text":":root { /* 仅修改主色调和对应的背景色 */ --color-primary: #98e14f; /* 蓝绿色 */ --color-primary-bg: rgba(102, 230, 181, 0.15); /* 同步调整透明度背景 */ /* 其他变量保持默认,无需重复声明 */ } /* 友情链接样式 */ .widget-friends { margin-bottom: 20px; } .widget-friends .widget-title { font-size: 1.0em; font-weight: medium; margin-bottom: 15px; color: #98e14f; border-bottom: 2px solid var(--primary-cyan); padding-bottom: 5px; } .friends-list { list-style: none; padding: 0 0 12px 0; margin: 0; } .friend-item { margin-bottom: 12px; padding: 8px; border-radius: 8px; min-height: 60px; display: flex; align-items: center; } /* 移除最下方容器的底部间距 */ .friend-item:last-child { margin-bottom: 0; } .friend-link { display: flex; align-items: center; text-decoration: none; color: inherit; width: 100%; } .friend-link:hover { text-decoration: none; color: inherit; } .friend-avatar { width: 40px; height: 40px; border-radius: 50%; margin-right: 12px; object-fit: cover; border: 2px solid var(--primary-cyan); flex-shrink: 0; } .friend-info { flex: 1; display: flex; flex-direction: column; justify-content: center; min-width: 0; } .friend-name { font-weight: bold; color: var(--text-color); text-decoration: none; display: block; margin-bottom: 4px; font-size: 0.95em; line-height: 1.2; } .friend-desc { font-size: 0.85em; color: var(--text-muted); line-height: 1.3; word-wrap: break-word; overflow-wrap: break-word; } /* 确保所有图标都使用相同的基线 */ .nexmoe-social a i, .nexmoe-social a [class*=\"icon-\"] { display: flex !important; align-items: center !important; justify-content: center !important; width: 100% !important; height: 100% !important; } .nexmoe-social a:hover { background-color: var(--color-primary) !important; color: white !important; transform: scale(1.05); box-shadow: 0 4px 12px rgba(34, 217, 223, 0.3); } /* 响应式优化 */ @media (max-width: 768px) { .container { padding: 0 15px; } .image-row { flex-direction: column; } .image-row img { max-width: 100%; } .friend-avatar { width: 35px; height: 35px; margin-right: 10px; } .friend-name { font-size: 0.9em; } } /* MathJax 数学公式样式 */ .MathJax { outline: 0; } .MathJax_Display { text-align: center !important; margin: 1em 0 !important; } .MathJax_SVG_Display { text-align: center !important; margin: 1em 0 !important; } /* 行内公式样式 */ .MathJax_SVG { display: inline !important; vertical-align: middle !important; } /* 块级公式样式 */ .MathJax_Display .MathJax_SVG { display: block !important; text-align: center !important; } /* 确保数学公式在暗色主题下可见 */ .MathJax_SVG * { color: inherit !important; } /* 数学公式容器样式 */ .math { text-align: center; margin: 1.2em 0; } /* 行内数学公式 */ .math.inline { display: inline; margin: 0; } /* 块级数学公式 */ .math.display { display: block; text-align: center; margin: 1.2em 0; } /* Ensure Font Awesome icons render even if theme forces `nexmoefont` */ /* Solid icons */ .nexmoefont.fa-solid, .nexmoefont.fas, .nexmoefont.fa-solid:before, .nexmoefont.fas:before { font-family: \"Font Awesome 6 Free\" !important; font-weight: 900 !important; } /* Regular icons */ .nexmoefont.fa-regular, .nexmoefont.far, .nexmoefont.fa-regular:before, .nexmoefont.far:before { font-family: \"Font Awesome 6 Free\" !important; font-weight: 400 !important; } /* Brand icons */ .nexmoefont.fa-brands, .nexmoefont.fab, .nexmoefont.fa-brands:before, .nexmoefont.fab:before { font-family: \"Font Awesome 6 Brands\" !important; font-weight: 400 !important; } /* Fallback: if an element has any fa-* class, prefer Font Awesome fonts */ .nexmoefont[class*=\"fa-\"] { font-family: \"Font Awesome 6 Free\", \"Font Awesome 6 Brands\", sans-serif !important; } /* === 高亮色自定义(新增) === 定义新的高亮色变量,替换页面选择/mark/搜索关键词等的默认主题高亮。 修改下面的颜色值即可达到你想要的高亮色。 */ :root { --color-highlight: #ffd54f; /* 高亮背景色(用于 等) */ --color-highlight-text: #386c05; /* 高亮文字颜色 */ --color-highlight-bg: rgba(69, 78, 20, 0.351); /* 选择(selection)使用的半透明背景 */ } /* 文本选择(用户拖选文本时的高亮) */ ::selection { background: var(--color-highlight-bg); color: var(--color-highlight-text); } ::-moz-selection { background: var(--color-highlight-bg); color: var(--color-highlight-text); } /* 标记和搜索关键词高亮 */ mark, .mdui-typo mark, mark.search-keyword { background: var(--color-highlight); color: var(--color-highlight-text); padding: 0.08em 0.2em; border-radius: 3px; } /* 代码块/行内代码选择时也使用相同的选择背景 */ pre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection, code[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection { background: var(--color-highlight-bg); } /* 如果主题在某些地方强制使用 --color-primary 作为高亮,可用更高优先级的选择器覆盖 */ .post-content a.highlighted, /* 假设类名为 highlighted,仅示例 */ .post-content .search-highlight { background: var(--color-highlight) !important; color: var(--color-highlight-text) !important; }"},{"title":"朋友","date":"2026-01-06T16:21:37.000Z","updated":"2026-02-15T16:59:59.294Z","comments":true,"path":"PY.html","permalink":"https://hongliu.icu/PY.html","excerpt":"","text":"著以长相思,缘以结不解。 开往-Travelling“开往”项目可以使你随机跳转到一个已加入该项目的博客网站。 挺好玩的我熬夜的时候最爱刷这个 朋友 若欲添加本网站的友情链接,请满足条件: 尽量长期更新哦 请添加本站链接至友链再联系我哦,本网站信息如下: 网站名称:HongLiu的小站 网站链接:https://hongliu.icu 网站头图:https://hongliu.icu/image/avator_1.jpg 请通过邮箱联系我:2120690085@qq.com 请在邮件中附上你的网站信息(网站名称、网站链接、网站头图) 最后更新于:2026-01-21"},{"title":"About","date":"2025-08-15T06:26:38.000Z","updated":"2026-02-06T08:38:43.419Z","comments":true,"path":"about/index.html","permalink":"https://hongliu.icu/about/index.html","excerpt":"","text":"Hello! 做自己所爱的事,爱自己所做的事。 关于我物种:人类 等级:大三 职业:机器人工程 栖息地:西安(学)/广东(假) 存活状态:活着 目标:活着 属性:INFJ 技术栈不是很想转码的(预备役)机器人工程师,技术栈以硬件设计/嵌入式为主,项目经验基本是电源。打RM的;当技术研发造过超级电容,现在在干管理和搞无线充。梦想成为硬件大神() 入门了业余无线电,呼号BG7OFD。 媒体技能:平面设计&摄影&视频制作,时不时搓点周边/海报等小玩意。 前化学实验党&化竞党&晶体制作党,已淡坑。 生活栈明日方舟、文明六、百合/轻百番、日常番、音游(淡坑)。国际象棋回坑中。 终末地要开服了可能会玩玩看? 联系方式你可以通过该网站导航栏(电脑端页面左侧/手机端左上角打开)的social链接联系到我。或使用QQ邮箱2120690085@qq.com. 网站相关建站时间:2025.08 主要内容: RM和不RM的相关想法/杂谈 课内外相关学习笔记分享 硬件/嵌入式日志记录 其他潜在发电记录 我们是被互联网世界伴随的一代。或许是买房焦虑从现实世界传递到互联网世界,混合想要有个地方存放一些乱七八糟文档的想法,诞生了这个赛博自建房。生活是一个时时被凝视的剧场,有的时候我们需要一些阳光照射不太到的角落来存放自己的内心。 目前的几个专栏内容: 杂谈:存储各种形成文章的想法和复盘,大多会在知乎上同步投稿。 知识笔记:因为本人的课内学习习惯是考前几天突击,并且形成了记笔记辅助记忆的习惯,所以在许多科目都基于Obsidian记了知识笔记;因此借有了网站把笔记也放上来。因为是考前突击的,所以并不会很系统很深入,可能只是一个辅助提示的作用。一部分转化成了笔记发在本网站上,整个Ob知识库已开源(?)在Github上。 技术文档:玩硬件/嵌入式/其他任何技术领域的记录,目前内容不多。可能会放下上赛季超电的相关文档。 日常:日常生活。 其他:其他。 该网站使用Hexo和Github Pages和网络知识苦手的本人搭建,你看到这条的时候或许还在优化中。该网站是我接触的第一个网络类项目,借此学到了很多东西。 写的文档没有意外的话会在此小站首发更新。赞赏、讨论、批评我都需要。 网站部分图片等资源来源网络,侵权可联系删除。 一些也许会做的todo: 文档归档 改个优雅点的域名 内网直接访问 文档搜索功能 建站时长统计 流量监测 评论系统 做一个置顶文章更新最新动态 文档创建日期:2025-08-16 最后更新日期:2026-02-06"},{"title":"文章归档","date":"2025-08-21T16:34:45.997Z","updated":"2025-08-21T16:34:45.997Z","comments":true,"path":"archive.html","permalink":"https://hongliu.icu/archive.html","excerpt":"","text":""},{"title":"","date":"2026-01-14T07:20:49.083Z","updated":"2026-01-14T07:20:49.083Z","comments":true,"path":"js/twikoo.all.min.js","permalink":"https://hongliu.icu/js/twikoo.all.min.js","excerpt":"","text":"/*! For license information please see twikoo.all.min.js.LICENSE.txt */ var e,t;e=this,t=function(){return function(){var e={3485:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(8190);Object.keys(r).forEach((function(e){\"default\"!==e&&\"__esModule\"!==e&&(e in t&&t[e]===r[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}}))}));var i=n(9565);Object.keys(i).forEach((function(e){\"default\"!==e&&\"__esModule\"!==e&&(e in t&&t[e]===i[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return i[e]}}))}))},8190:function(e,t){\"use strict\";var n;Object.defineProperty(t,\"__esModule\",{value:!0}),t.StorageType=t.AbstractStorage=t.AbstractSDKRequest=void 0,function(e){e.local=\"local\",e.none=\"none\",e.session=\"session\"}(n||(t.StorageType=n={})),t.AbstractSDKRequest=function(){},t.AbstractStorage=function(){}},9565:function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.formatUrl=function(e,t,n){void 0===n&&(n={});var r=/\\?/.test(t),i=\"\";for(var o in n)\"\"===i?!r&&(t+=\"?\"):i+=\"&\",i+=o+\"=\"+encodeURIComponent(n[o]);return/^http(s)?\\:\\/\\//.test(t+=i)?t:\"\"+e+t}},8152:function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.LOGINTYPE=t.DATA_VERSION=void 0,t.getEndPoint=function(){return{BASE_URL:l,PROTOCOL:c}},t.getSdkName=function(){return s},t.getSdkVersion=function(){return a},t.setEndPoint=d,t.setRegionLevelEndpoint=function(e,t,n){d(t?\"//\"+e+\".\"+t+\".tcb-api.tencentcloudapi.com/web\":\"//\"+e+\".ap-shanghai.tcb-api.tencentcloudapi.com/web\",n)},t.setSdkName=function(e){s=e,i(e)},t.setSdkVersion=function(e){a=e};var r=n(5508),i=r.constants.setSdkName,o=r.constants.setProtocol,a=\"\",s=\"@cloudbase/js-sdk\";t.DATA_VERSION=\"2020-01-10\";var u,c=\"undefined\"!=typeof location&&\"http:\"===location.protocol?\"http:\":\"https:\",l=\"//tcb-api.tencentcloudapi.com/web\";function d(e,t){l=e,t&&(c=t,o(t))}!function(e){e.ANONYMOUS=\"ANONYMOUS\",e.WECHAT=\"WECHAT\",e.CUSTOM=\"CUSTOM\",e.NULL=\"NULL\"}(u||(t.LOGINTYPE=u={}))},6631:function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.EVENTS=void 0,t.EVENTS={LOGIN_STATE_CHANGED:\"loginStateChanged\",LOGIN_STATE_EXPIRED:\"loginStateExpire\",LOGIN_TYPE_CHANGED:\"loginTypeChanged\",ANONYMOUS_CONVERTED:\"anonymousConverted\",ACCESS_TOKEN_REFRESHD:\"refreshAccessToken\"}},2183:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"__esModule\",{value:!0}),t[\"default\"]=t.cloudbase=void 0;var i=r(n(9767)),o=n(5508),a=r(n(9636)),s=n(9540),u=n(2341),c=n(6592),l=n(437),d=n(8152),f=function(){return f=Object.assign||function(e){for(var t,n=1,r=arguments.length;n3&&s&&Object.defineProperty(t,n,s),s},h=function(e,t){if(\"object\"===(\"undefined\"==typeof Reflect?\"undefined\":(0,i[\"default\"])(Reflect))&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},g=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{u(r.next(e))}catch(t){o(t)}}function s(e){try{u(r[\"throw\"](e))}catch(t){o(t)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},m=function(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),\"throw\":s(1),\"return\":s(2)},\"function\"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(n=1,r&&(i=2&o[0]?r[\"return\"]:o[0]?r[\"throw\"]||((i=r[\"return\"])&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]2]>>>24-i%4*8&255;r.push((o>>>4).toString(16)),r.push((15&o).toString(16))}return r.join(\"\")},parse:function(e){for(var t=e.length,n=[],r=0;r>>3]|=parseInt(e.substr(r,2),16)2]>>>24-i%4*8&255;r.push(String.fromCharCode(o))}return r.join(\"\")},parse:function(e){for(var t=e.length,n=[],r=0;r>>2]|=(255&e.charCodeAt(r))>>24-o%4*8&255)>2]>>>24-(o+1)%4*8&255)>2]>>>24-(o+2)%4*8&255,s=0;s>6*(3-s)&63));var u=r.charAt(64);if(u)for(;i.length%4;)i.push(u);return i.join(\"\")},parse:function(e){var t=e.length,r=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var o=0;o>>2]|=(s|u)19)^m>>>10;c[p]=g+c[p-7]+v+c[p-16]}var _=r&i^r&o^i&o,y=(r>2)^(r>13)^(r>22),b=f+((s>6)^(s>11)^(s>25))+(s&l^~s&d)+u[p]+c[p];f=d,d=l,l=s,s=a+b|0,a=o,o=i,i=r,r=b+(y+_)|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+s|0,n[5]=n[5]+l|0,n[6]=n[6]+d|0,n[7]=n[7]+f|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128>9>92&&arguments[2]!==undefined?arguments[2]:null;u||(u=document.createElement(\"textarea\"),document.body.appendChild(u));var r=function(e){var t=window.getComputedStyle(e),n=t.getPropertyValue(\"box-sizing\"),r=parseFloat(t.getPropertyValue(\"padding-bottom\"))+parseFloat(t.getPropertyValue(\"padding-top\")),i=parseFloat(t.getPropertyValue(\"border-bottom-width\"))+parseFloat(t.getPropertyValue(\"border-top-width\"));return{contextStyle:c.map((function(e){return e+\":\"+t.getPropertyValue(e)})).join(\";\"),paddingSize:r,borderSize:i,boxSizing:n}}(e),i=r.paddingSize,o=r.borderSize,a=r.boxSizing,s=r.contextStyle;u.setAttribute(\"style\",s+\";\\n height:0 !important;\\n visibility:hidden !important;\\n overflow:hidden !important;\\n position:absolute !important;\\n z-index:-1000 !important;\\n top:0 !important;\\n right:0 !important\\n\"),u.value=e.value||e.placeholder||\"\";var l=u.scrollHeight,d={};\"border-box\"===a?l+=o:\"content-box\"===a&&(l-=i),u.value=\"\";var f=u.scrollHeight-i;if(null!==t){var p=f*t;\"border-box\"===a&&(p=p+i+o),l=Math.max(p,l),d.minHeight=p+\"px\"}if(null!==n){var h=f*n;\"border-box\"===a&&(h=h+i+o),l=Math.min(h,l)}return d.height=l+\"px\",u.parentNode&&u.parentNode.removeChild(u),u=null,d}var d=n(9),f=n.n(d),p=n(21),h={name:\"ElInput\",componentName:\"ElInput\",mixins:[o.a,s.a],inheritAttrs:!1,inject:{elForm:{\"default\":\"\"},elFormItem:{\"default\":\"\"}},data:function(){return{textareaCalcStyle:{},hovering:!1,focused:!1,isComposing:!1,passwordVisible:!1}},props:{value:[String,Number],size:String,resize:String,form:String,disabled:Boolean,readonly:Boolean,type:{type:String,\"default\":\"text\"},autosize:{type:[Boolean,Object],\"default\":!1},autocomplete:{type:String,\"default\":\"off\"},autoComplete:{type:String,validator:function(e){return!0}},validateEvent:{type:Boolean,\"default\":!0},suffixIcon:String,prefixIcon:String,label:String,clearable:{type:Boolean,\"default\":!1},showPassword:{type:Boolean,\"default\":!1},showWordLimit:{type:Boolean,\"default\":!1},tabindex:String},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},validateState:function(){return this.elFormItem?this.elFormItem.validateState:\"\"},needStatusIcon:function(){return!!this.elForm&&this.elForm.statusIcon},validateIcon:function(){return{validating:\"el-icon-loading\",success:\"el-icon-circle-check\",error:\"el-icon-circle-close\"}[this.validateState]},textareaStyle:function(){return f()({},this.textareaCalcStyle,{resize:this.resize})},inputSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},inputDisabled:function(){return this.disabled||(this.elForm||{}).disabled},nativeInputValue:function(){return null===this.value||this.value===undefined?\"\":String(this.value)},showClear:function(){return this.clearable&&!this.inputDisabled&&!this.readonly&&this.nativeInputValue&&(this.focused||this.hovering)},showPwdVisible:function(){return this.showPassword&&!this.inputDisabled&&!this.readonly&&(!!this.nativeInputValue||this.focused)},isWordLimitVisible:function(){return this.showWordLimit&&this.$attrs.maxlength&&(\"text\"===this.type||\"textarea\"===this.type)&&!this.inputDisabled&&!this.readonly&&!this.showPassword},upperLimit:function(){return this.$attrs.maxlength},textLength:function(){return\"number\"==typeof this.value?String(this.value).length:(this.value||\"\").length},inputExceed:function(){return this.isWordLimitVisible&&this.textLength>this.upperLimit}},watch:{value:function(e){this.$nextTick(this.resizeTextarea),this.validateEvent&&this.dispatch(\"ElFormItem\",\"el.form.change\",[e])},nativeInputValue:function(){this.setNativeInputValue()},type:function(){var e=this;this.$nextTick((function(){e.setNativeInputValue(),e.resizeTextarea(),e.updateIconOffset()}))}},methods:{focus:function(){this.getInput().focus()},blur:function(){this.getInput().blur()},getMigratingConfig:function(){return{props:{icon:\"icon is removed, use suffix-icon / prefix-icon instead.\",\"on-icon-click\":\"on-icon-click is removed.\"},events:{click:\"click is removed.\"}}},handleBlur:function(e){this.focused=!1,this.$emit(\"blur\",e),this.validateEvent&&this.dispatch(\"ElFormItem\",\"el.form.blur\",[this.value])},select:function(){this.getInput().select()},resizeTextarea:function(){if(!this.$isServer){var e=this.autosize;if(\"textarea\"===this.type)if(e){var t=e.minRows,n=e.maxRows;this.textareaCalcStyle=l(this.$refs.textarea,t,n)}else this.textareaCalcStyle={minHeight:l(this.$refs.textarea).minHeight}}},setNativeInputValue:function(){var e=this.getInput();e&&e.value!==this.nativeInputValue&&(e.value=this.nativeInputValue)},handleFocus:function(e){this.focused=!0,this.$emit(\"focus\",e)},handleCompositionStart:function(e){this.$emit(\"compositionstart\",e),this.isComposing=!0},handleCompositionUpdate:function(e){this.$emit(\"compositionupdate\",e);var t=e.target.value,n=t[t.length-1]||\"\";this.isComposing=!Object(p.isKorean)(n)},handleCompositionEnd:function(e){this.$emit(\"compositionend\",e),this.isComposing&&(this.isComposing=!1,this.handleInput(e))},handleInput:function(e){this.isComposing||e.target.value!==this.nativeInputValue&&(this.$emit(\"input\",e.target.value),this.$nextTick(this.setNativeInputValue))},handleChange:function(e){this.$emit(\"change\",e.target.value)},calcIconOffset:function(e){var t=[].slice.call(this.$el.querySelectorAll(\".el-input__\"+e)||[]);if(t.length){for(var n=null,r=0;r0&&arguments[0]!==undefined?arguments[0]:{};if(!i.a.prototype.$isServer){if(\"string\"==typeof(e=_()({},b,e)).target&&(e.target=document.querySelector(e.target)),e.target=e.target||document.body,e.target!==document.body?e.fullscreen=!1:e.body=!0,e.fullscreen&&k)return k;var t=e.body?document.body:e.target,n=new y({el:document.createElement(\"div\"),data:e});return function(e,t,n){var r={};e.fullscreen?(n.originalPosition=Object(l.getStyle)(document.body,\"position\"),n.originalOverflow=Object(l.getStyle)(document.body,\"overflow\"),r.zIndex=d.PopupManager.nextZIndex()):e.body?(n.originalPosition=Object(l.getStyle)(document.body,\"position\"),[\"top\",\"left\"].forEach((function(t){var n=\"top\"===t?\"scrollTop\":\"scrollLeft\";r[t]=e.target.getBoundingClientRect()[t]+document.body[n]+document.documentElement[n]+\"px\"})),[\"height\",\"width\"].forEach((function(t){r[t]=e.target.getBoundingClientRect()[t]+\"px\"}))):n.originalPosition=Object(l.getStyle)(t,\"position\"),Object.keys(r).forEach((function(e){n.$el.style[e]=r[e]}))}(e,t,n),\"absolute\"!==n.originalPosition&&\"fixed\"!==n.originalPosition&&\"sticky\"!==n.originalPosition&&Object(l.addClass)(t,\"el-loading-parent--relative\"),e.fullscreen&&e.lock&&Object(l.addClass)(t,\"el-loading-parent--hidden\"),t.appendChild(n.$el),i.a.nextTick((function(){n.visible=!0})),e.fullscreen&&(k=n),n}};t[\"default\"]={install:function(e){e.use(m),e.prototype.$loading=w},directive:m,service:w}},9:function(e,t){e.exports=n(7002)}})},6262:function(e,t){\"use strict\";function n(e,t,r){this.$children.forEach((function(i){i.$options.componentName===e?i.$emit.apply(i,[t].concat(r)):n.apply(i,[e,t].concat([r]))}))}t.__esModule=!0,t[\"default\"]={methods:{dispatch:function(e,t,n){for(var r=this.$parent||this.$root,i=r.$options.componentName;r&&(!i||i!==e);)(r=r.$parent)&&(i=r.$options.componentName);r&&r.$emit.apply(r,[t].concat(n))},broadcast:function(e,t,r){n.call(this,e,t,r)}}}},7177:function(e,t,n){\"use strict\";t.__esModule=!0,n(964),t[\"default\"]={mounted:function(){},methods:{getMigratingConfig:function(){return{props:{},events:{}}}}}},3751:function(e,t){\"use strict\";t.__esModule=!0,t[\"default\"]=function(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:300,r=arguments.length>3&&arguments[3]!==undefined&&arguments[3];if(!e||!t)throw new Error(\"instance & callback is required\");var i=!1,o=function(){i||(i=!0,t&&t.apply(null,arguments))};r?e.$once(\"after-leave\",o):e.$on(\"after-leave\",o),setTimeout((function(){o()}),n+100)}},4210:function(e,t,n){\"use strict\";var r=n(3330)(n(9767));t.__esModule=!0,t.isInContainer=t.getScrollContainer=t.isScroll=t.getStyle=t.once=t.off=t.on=undefined;var i=\"function\"==typeof Symbol&&\"symbol\"===(0,r[\"default\"])(Symbol.iterator)?function(e){return(0,r[\"default\"])(e)}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":(0,r[\"default\"])(e)};t.hasClass=g,t.addClass=function(e,t){if(e){for(var n=e.className,r=(t||\"\").split(\" \"),i=0,o=r.length;i=0;i--)if(t[i].id===e){t.splice(i,1);break}}0===t.length&&(this.modalFade&&(0,a.addClass)(n,\"v-modal-leave\"),setTimeout((function(){0===t.length&&(n.parentNode&&n.parentNode.removeChild(n),n.style.display=\"none\",f.modalDom=undefined),(0,a.removeClass)(n,\"v-modal-leave\")}),200))}};Object.defineProperty(f,\"zIndex\",{configurable:!0,get:function(){return u||(c=c||(o[\"default\"].prototype.$ELEMENT||{}).zIndex||2e3,u=!0),c},set:function(e){c=e}}),o[\"default\"].prototype.$isServer||window.addEventListener(\"keydown\",(function(e){if(27===e.keyCode){var t=function(){if(!o[\"default\"].prototype.$isServer&&f.modalStack.length>0){var e=f.modalStack[f.modalStack.length-1];if(!e)return;return f.getInstance(e.id)}}();t&&t.closeOnPressEscape&&(t.handleClose?t.handleClose():t.handleAction?t.handleAction(\"cancel\"):t.close())}})),t[\"default\"]=f},8166:function(e,t,n){\"use strict\";t.__esModule=!0,t[\"default\"]=function(){if(o[\"default\"].prototype.$isServer)return 0;if(a!==undefined)return a;var e=document.createElement(\"div\");e.className=\"el-scrollbar__wrap\",e.style.visibility=\"hidden\",e.style.width=\"100px\",e.style.position=\"absolute\",e.style.top=\"-9999px\",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow=\"scroll\";var n=document.createElement(\"div\");n.style.width=\"100%\",e.appendChild(n);var r=n.offsetWidth;return e.parentNode.removeChild(e),a=t-r};var r,i=n(1848),o=(r=i)&&r.__esModule?r:{\"default\":r},a=void 0},1636:function(e,t){\"use strict\";t.__esModule=!0,t.isDef=function(e){return e!==undefined&&null!==e},t.isKorean=function(e){return/([(\\uAC00-\\uD7AF)|(\\u3130-\\u318F)])+/gi.test(e)}},7634:function(e,t,n){\"use strict\";var r=n(3330)(n(9767));t.__esModule=!0,t.isDefined=t.isUndefined=t.isFunction=undefined;var i=\"function\"==typeof Symbol&&\"symbol\"===(0,r[\"default\"])(Symbol.iterator)?function(e){return(0,r[\"default\"])(e)}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":(0,r[\"default\"])(e)};t.isString=function(e){return\"[object String]\"===Object.prototype.toString.call(e)},t.isObject=function(e){return\"[object Object]\"===Object.prototype.toString.call(e)},t.isHtmlElement=function(e){return e&&e.nodeType===Node.ELEMENT_NODE};var o,a=n(1848),s=(o=a)&&o.__esModule?o:{\"default\":o},u=function(e){return e&&\"[object Function]\"==={}.toString.call(e)};\"object\"===(\"undefined\"==typeof Int8Array?\"undefined\":i(Int8Array))||!s[\"default\"].prototype.$isServer&&\"function\"==typeof document.childNodes||(t.isFunction=u=function(e){return\"function\"==typeof e||!1}),t.isFunction=u,t.isUndefined=function(e){return void 0===e},t.isDefined=function(e){return e!==undefined&&null!==e}},964:function(e,t,n){\"use strict\";var r=n(3330)(n(9767));t.__esModule=!0,t.isMac=t.isEmpty=t.isEqual=t.arrayEquals=t.looseEqual=t.capitalize=t.kebabCase=t.autoprefixer=t.isFirefox=t.isEdge=t.isIE=t.coerceTruthyValueToArray=t.arrayFind=t.arrayFindIndex=t.escapeRegexpString=t.valueEquals=t.generateId=t.getValueByPath=undefined;var i=\"function\"==typeof Symbol&&\"symbol\"===(0,r[\"default\"])(Symbol.iterator)?function(e){return(0,r[\"default\"])(e)}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":(0,r[\"default\"])(e)};t.noop=function(){},t.hasOwn=function(e,t){return c.call(e,t)},t.toObject=function(e){for(var t={},n=0;nd.reach&&(d.reach=R.reach)}}}}}}function u(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,i={value:n,prev:t,next:r};return t.next=i,r.prev=i,e.length++,i}function l(e,t,n){for(var r=t.next,i=0;i/i,greedy:!0,inside:{\"internal-subset\":{pattern:/(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/\"[^\"]*\"|'[^']*'/,greedy:!0},punctuation:/^$|[[\\]]/,\"doctype-tag\":/^DOCTYPE/i,name:/[^\\s'\"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/\\/=$\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,greedy:!0,inside:{tag:{pattern:/^\\/]+/,inside:{punctuation:/^\\/:]+:/}},\"special-attr\":[],\"attr-value\":{pattern:/=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:\"attr-equals\"},{pattern:/^(\\s*)[\"']|[\"']$/,lookbehind:!0}]}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:[{pattern:/&[\\da-z]{1,8};/i,alias:\"named-entity\"},/&#x?[\\da-f]{1,8};/i]},r.languages.markup.tag.inside[\"attr-value\"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside[\"internal-subset\"].inside=r.languages.markup,r.hooks.add(\"wrap\",(function(e){\"entity\"===e.type&&(e.attributes.title=e.content.replace(/&/,\"&\"))})),Object.defineProperty(r.languages.markup.tag,\"addInlined\",{value:function(e,t){var n={};n[\"language-\"+t]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^$/i;var i={\"included-cdata\":{pattern://i,inside:n}};i[\"language-\"+t]={pattern:/[\\s\\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(]*>)(?:))*\\]\\]>|(?!|&&=?|\\|\\|=?|[!=]==|>?=?|[-+*/%&|^!=]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/}),r.languages.javascript[\"class-name\"][0].pattern=/(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/,r.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:RegExp(/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source+/\\//.source+\"(?:\"+/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source+\"|\"+/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+\")\"+/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source),lookbehind:!0,greedy:!0,inside:{\"regex-source\":{pattern:/^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,lookbehind:!0,alias:\"language-regex\",inside:r.languages.regex},\"regex-delimiter\":/^\\/|\\/$/,\"regex-flags\":/^[a-z]+$/}},\"function-variable\":{pattern:/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,alias:\"function\"},parameter:[{pattern:/(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/}),r.languages.insertBefore(\"javascript\",\"string\",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:\"comment\"},\"template-string\":{pattern:/`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,greedy:!0,inside:{\"template-punctuation\":{pattern:/^`|`$/,alias:\"string\"},interpolation:{pattern:/((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,lookbehind:!0,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{|\\}$/,alias:\"punctuation\"},rest:r.languages.javascript}},string:/[\\s\\S]+/}},\"string-property\":{pattern:/((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,lookbehind:!0,greedy:!0,alias:\"property\"}}),r.languages.insertBefore(\"javascript\",\"operator\",{\"literal-property\":{pattern:/((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,lookbehind:!0,alias:\"property\"}}),r.languages.markup&&(r.languages.markup.tag.addInlined(\"script\",\"javascript\"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\"javascript\")),r.languages.js=r.languages.javascript,function(){if(void 0!==r&&\"undefined\"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:\"javascript\",py:\"python\",rb:\"ruby\",ps1:\"powershell\",psm1:\"powershell\",sh:\"bash\",bat:\"batch\",h:\"c\",tex:\"latex\"},t=\"data-src-status\",n=\"loading\",i=\"loaded\",o=\"pre[data-src]:not([\"+t+'=\"'+i+'\"]):not(['+t+'=\"'+n+'\"])';r.hooks.add(\"before-highlightall\",(function(e){e.selector+=\", \"+o})),r.hooks.add(\"before-sanity-check\",(function(a){var s=a.element;if(s.matches(o)){a.code=\"\",s.setAttribute(t,n);var u=s.appendChild(document.createElement(\"CODE\"));u.textContent=\"Loading…\";var c=s.getAttribute(\"data-src\"),l=a.language;if(\"none\"===l){var d=(/\\.(\\w+)$/.exec(c)||[,\"none\"])[1];l=e[d]||d}r.util.setLanguage(u,l),r.util.setLanguage(s,l);var f=r.plugins.autoloader;f&&f.loadLanguages(l),function(e,t,n){var r=new XMLHttpRequest;r.open(\"GET\",e,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status=400?n(\"✖ Error \"+r.status+\" while fetching file: \"+r.statusText):n(\"✖ Error: File does not exist or is empty\"))},r.send(null)}(c,(function(e){s.setAttribute(t,i);var n=function(e){var t=/^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(e||\"\");if(t){var n=Number(t[1]),r=t[2],i=t[3];return r?i?[n,Number(i)]:[n,undefined]:[n,n]}return undefined}(s.getAttribute(\"data-range\"));if(n){var o=e.split(/\\r\\n?|\\n/g),a=n[0],c=null==n[1]?o.length:n[1];a0?\"\".concat(this.repliesCount):\"\"}},methods:{onLike:function(e){e.preventDefault(),this.$emit(\"like\")},onReply:function(e){e.preventDefault(),this.$emit(\"reply\")}}}},4577:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var i=r(n(818)),o=r(n(8711)),a=r(n(2290)),s=r(n(9726)),u=r(n(255)),c=r(n(3388)),l=r(n(9942)),d=n(2304),f=r(n(7848));t.Z={components:{TkAdminComment:s[\"default\"],TkAdminConfig:u[\"default\"],TkAdminImport:c[\"default\"],TkAdminExport:l[\"default\"]},props:{show:Boolean},data:function(){return{iconClose:f[\"default\"],loading:!0,version:\"\",needUpdate:!1,isLogin:!1,isSetPassword:!0,isSetCredentials:!1,credentials:\"\",password:\"\",passwordConfirm:\"\",loginErrorMessage:\"\",activeTabName:\"comment\"}},computed:{canRegist:function(){return!this.isSetPassword&&!!this.password&&this.password===this.passwordConfirm&&(this.isSetCredentials||this.credentials)}},methods:{t:d.t,onLogin:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n,r;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e.password){t.next=3;break}return e.loginErrorMessage=(0,d.t)(\"ADMIN_PASSWORD_REQUIRED\"),t.abrupt(\"return\");case 3:return e.loading=!0,e.loginErrorMessage=\"\",n=(0,a[\"default\"])(e.password),t.next=8,(0,d.call)(e.$tcb,\"LOGIN\",{password:n});case 8:if(!(r=t.sent).result.message){t.next=13;break}e.loginErrorMessage=r.result.message,t.next=28;break;case 13:if(!r.result.ticket){t.next=27;break}return t.prev=14,t.next=17,e.$tcb.auth.customAuthProvider().signIn(r.result.ticket);case 17:d.logger.log(\"登录成功\"),e.password=\"\",e.checkAuth(),t.next=25;break;case 22:t.prev=22,t.t0=t[\"catch\"](14),d.logger.error(\"登录失败\",t.t0);case 25:t.next=28;break;case 27:0===r.result.code&&(d.logger.log(\"登录成功\"),localStorage.setItem(\"twikoo-access-token\",n),e.password=\"\",e.checkAuth());case 28:e.loading=!1;case 29:case\"end\":return t.stop()}}),t,null,[[14,22]])})))()},onLogout:function(e){var t=this;return(0,o[\"default\"])(i[\"default\"].mark((function n(){return i[\"default\"].wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e.preventDefault(),t.loading=!0,!t.$tcb){n.next=9;break}return n.next=5,t.$tcb.auth.signOut();case 5:return n.next=7,t.$tcb.auth.anonymousAuthProvider().signIn();case 7:n.next=10;break;case 9:localStorage.removeItem(\"twikoo-access-token\");case 10:t.isLogin=!1,t.loading=!1;case 12:case\"end\":return n.stop()}}),n)})))()},onRegist:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n,r;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,n=(0,a[\"default\"])(e.password),t.next=4,(0,d.call)(e.$tcb,\"SET_PASSWORD\",{password:n,credentials:e.credentials});case 4:(r=t.sent).result.code?(e.loginErrorMessage=(0,d.t)(\"ADMIN_REGIST_FAILED\"),r.result.message&&(e.loginErrorMessage+=\",\"+r.result.message),d.logger.warn(\"Twikoo 注册失败\",r)):(e.passwordMd5=\"\",e.isSetPassword=!0,e.onLogin()),e.loading=!1;case 7:case\"end\":return t.stop()}}),t)})))()},onShow:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,t.next=3,e.checkAuth();case 3:if(e.isLogin){t.next=7;break}return t.next=6,e.checkIfPasswordSet();case 6:e.focusPassword();case 7:e.loading=!1;case 8:case\"end\":return t.stop()}}),t)})))()},focusPassword:function(){var e=this;setTimeout((function(){e.$refs.focusme&&e.$refs.focusme.focus()}),500)},checkAuth:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n,r;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!e.$tcb){t.next=7;break}return t.next=3,e.$tcb.auth.getCurrenUser();case 3:n=t.sent,e.isLogin=\"CUSTOM\"===n.loginType,t.next=11;break;case 7:return t.next=9,(0,d.call)(e.$tcb,\"GET_CONFIG\");case 9:(r=t.sent)&&r.result&&r.result.config&&(e.isLogin=r.result.config.IS_ADMIN);case 11:case\"end\":return t.stop()}}),t)})))()},checkIfPasswordSet:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,(0,d.call)(e.$tcb,\"GET_PASSWORD_STATUS\");case 3:n=t.sent,e.version=n.result.version,e.isSetPassword=n.result.status,e.isSetCredentials=!e.$tcb,t.next=14;break;case 9:throw t.prev=9,t.t0=t[\"catch\"](0),e.needUpdate=!0,e.loading=!1,t.t0;case 14:case\"end\":return t.stop()}}),t,null,[[0,9]])})))()},onClose:function(e){e.preventDefault(),this.$emit(\"close\")}},watch:{show:function(e){e&&this.onShow()}}}},9434:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var i=r(n(818)),o=r(n(8711)),a=n(7588),s=n(2304),u=n(8521),c=r(n(906)),l=r(n(4620));t.Z={components:{TkAvatar:c[\"default\"],TkPagination:l[\"default\"]},data:function(){return{loading:!0,comments:[],serverConfig:{},serverVersion:this.$twikoo.serverConfig.VERSION,clientVersion:u.version,count:0,pageSize:5,currentPage:1,filter:{keyword:\"\",type:\"\"}}},methods:{t:s.t,displayCreated:function(e){return(0,s.timeago)(e.created)},convertLink:function(e){return(0,s.convertLink)(e)},getComments:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,t.next=3,(0,s.call)(e.$tcb,\"COMMENT_GET_FOR_ADMIN\",{per:e.pageSize,page:e.currentPage,keyword:e.filter.keyword,type:e.filter.type});case 3:(n=t.sent).result&&!n.result.code&&(e.count=n.result.count,e.comments=n.result.data),e.$nextTick((function(){(0,s.renderLinks)(e.$refs.comments),(0,s.renderMath)(e.$refs[\"comment-list\"],e.$twikoo.katex),e.highlightCode()})),e.loading=!1;case 7:case\"end\":return t.stop()}}),t)})))()},getConfig:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,(0,s.call)(e.$tcb,\"GET_CONFIG_FOR_ADMIN\");case 2:(n=t.sent).result&&!n.result.code&&(e.serverConfig=n.result.config,e.checkConfig());case 4:case\"end\":return t.stop()}}),t)})))()},checkConfig:function(){var e=this;this.serverConfig.HIGHLIGHT||(this.serverConfig.HIGHLIGHT=\"true\");var t={},n=localStorage.getItem(\"twikoo\");n&&(t=JSON.parse(n)),[\"nick\",\"mail\",\"avatar\"].forEach((function(n){t[n]?e.serverConfig[n]=t[n]:e.serverConfig[n]=\"\"})),!t.nick&&this.serverConfig.BLOGGER_NICK&&(t.nick=this.serverConfig.BLOGGER_NICK),!t.mail&&this.serverConfig.BLOGGER_EMAIL&&(t.mail=this.serverConfig.BLOGGER_EMAIL),!t.link&&this.serverConfig.SITE_URL&&(t.link=this.serverConfig.SITE_URL),localStorage.setItem(\"twikoo\",JSON.stringify(t)),a.app.$emit(\"initMeta\")},onPageSizeChange:function(e){this.pageSize=e,this.getComments()},switchPage:function(e){this.currentPage=e,this.getComments()},handleView:function(e){window.open(\"\".concat(e.url,\"#\").concat(e._id))},handleDelete:function(e){var t=this;return(0,o[\"default\"])(i[\"default\"].mark((function n(){return i[\"default\"].wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(confirm((0,s.t)(\"ADMIN_COMMENT_DELETE_CONFIRM\"))){n.next=2;break}return n.abrupt(\"return\");case 2:return t.loading=!0,n.next=5,(0,s.call)(t.$tcb,\"COMMENT_DELETE_FOR_ADMIN\",{id:e._id});case 5:return n.next=7,t.getComments();case 7:t.loading=!1;case 8:case\"end\":return n.stop()}}),n)})))()},handleSpam:function(e,t){this.setComment(e,{isSpam:t})},handleTop:function(e,t){this.setComment(e,{top:t})},setComment:function(e,t){var n=this;return(0,o[\"default\"])(i[\"default\"].mark((function r(){return i[\"default\"].wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return n.loading=!0,r.next=3,(0,s.call)(n.$tcb,\"COMMENT_SET_FOR_ADMIN\",{id:e._id,set:t});case 3:return r.next=5,n.getComments();case 5:n.loading=!1;case 6:case\"end\":return r.stop()}}),r)})))()},highlightCode:function(){\"true\"===this.serverConfig.HIGHLIGHT&&(0,s.renderCode)(this.$refs[\"comment-list\"],this.serverConfig.HIGHLIGHT_THEME)}},mounted:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Promise.all([e.getConfig(),e.getComments()]);case 2:e.highlightCode();case 3:case\"end\":return t.stop()}}),t)})))()}}},9859:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var i=r(n(818)),o=r(n(8711)),a=n(2304),s=n(8521);function u(e,t){var n=\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if(\"string\"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===n&&e.constructor&&(n=e.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(e):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}var o,a=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==n[\"return\"]||n[\"return\"]()}finally{if(s)throw o}}}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&this.$refs[\"tk-replies\"]&&(this.hasExpand=this.$refs[\"tk-replies\"].scrollHeight>236)},scrollToComment:function(){-1!==window.location.hash.indexOf(this.comment.id)&&(this.$refs[\"tk-comment\"].scrollIntoView(),this.$emit(\"expand\"))},onLike:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!e.likeLoading){t.next=2;break}return t.abrupt(\"return\");case 2:return e.likeLoading=!0,t.next=5,(0,a.call)(e.$tcb,\"COMMENT_LIKE\",{id:e.comment.id});case 5:e.liked?e.like--:e.like++,e.liked=!e.liked,e.likeLoading=!1;case 8:case\"end\":return t.stop()}}),t)})))()},onReply:function(){this.$emit(\"reply\",this.comment.id)},onReplyReply:function(e){this.pid=e,this.$emit(\"reply\",this.comment.id)},onCancel:function(){this.pid=\"\",this.$emit(\"reply\",\"\")},onLoad:function(){this.pid=\"\",this.$emit(\"reply\",\"\"),this.$emit(\"load\"),this.onExpand()},onExpand:function(){this.isExpanded=!0},onCollapse:function(){this.isExpanded=!1},checkAuth:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!e.$tcb){t.next=7;break}return t.next=3,e.$tcb.auth.getCurrenUser();case 3:n=t.sent,e.isLogin=\"CUSTOM\"===n.loginType,t.next=8;break;case 7:e.isLogin=e.$twikoo.serverConfig&&e.$twikoo.serverConfig.IS_ADMIN;case 8:case\"end\":return t.stop()}}),t)})))()},handleSpam:function(e,t){t.preventDefault(),this.setComment({isSpam:e})},handleTop:function(e,t){t.preventDefault(),this.setComment({top:e})},setComment:function(e){var t=this;return(0,o[\"default\"])(i[\"default\"].mark((function n(){return i[\"default\"].wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return t.loading=!0,n.next=3,(0,a.call)(t.$tcb,\"COMMENT_SET_FOR_ADMIN\",{id:t.comment.id,set:e});case 3:t.loading=!1,t.$emit(\"load\");case 5:case\"end\":return n.stop()}}),n)})))()}},mounted:function(){var e=this;this.$nextTick(this.showExpandIfNeed),this.$nextTick(this.scrollToComment),this.$nextTick((function(){(0,a.renderLinks)(e.$refs.comment),(0,a.renderMath)(e.$refs.comment,e.$twikoo.katex)})),this.checkAuth()},watch:{\"comment.like\":{handler:function(e){this.like=this.comment.like,this.liked=this.comment.liked},immediate:!0},\"config.HIGHLIGHT\":{handler:function(e){var t=this;\"true\"===e&&this.$nextTick((function(){(0,a.renderCode)(t.$refs.comment,t.config.HIGHLIGHT_THEME)}))},immediate:!0}}}},315:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var i=r(n(818)),o=r(n(8711)),a=n(2304),s=r(n(6673)),u=r(n(5915)),c=r(n(2561)),l=r(n(6342)),d=r(n(1848));t.Z={components:{TkSubmit:s[\"default\"],TkComment:u[\"default\"]},props:{showAdminEntry:Boolean},data:function(){return{loading:!0,loadingMore:!1,errorMessage:\"\",config:{},comments:[],showExpand:!0,count:0,replyId:\"\",iconSetting:c[\"default\"],iconRefresh:l[\"default\"]}},methods:{t:a.t,initConfig:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,(0,a.call)(e.$tcb,\"GET_CONFIG\");case 2:(n=t.sent)&&n.result&&n.result.config&&(e.config=n.result.config,d[\"default\"].prototype.$twikoo.serverConfig=n.result.config);case 4:case\"end\":return t.stop()}}),t)})))()},initComments:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.loading=!0,n=(0,a.getUrl)(e.$twikoo.path),t.next=4,e.getComments({url:n});case 4:e.loading=!1;case 5:case\"end\":return t.stop()}}),t)})))()},refresh:function(){this.comments=[],this.initComments()},onExpand:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n,r;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!e.loadingMore){t.next=2;break}return t.abrupt(\"return\");case 2:return e.loadingMore=!0,n=(0,a.getUrl)(e.$twikoo.path),r=e.comments.filter((function(e){return!e.top})).map((function(e){return e.created})).sort((function(e,t){return e-t}))[0],t.next=7,e.getComments({url:n,before:r});case 7:e.loadingMore=!1;case 8:case\"end\":return t.stop()}}),t)})))()},onCommentLoaded:function(){\"function\"==typeof this.$twikoo.onCommentLoaded&&this.$twikoo.onCommentLoaded()},getComments:function(e){var t=this;return(0,o[\"default\"])(i[\"default\"].mark((function n(){var r;return i[\"default\"].wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,(0,a.call)(t.$tcb,\"COMMENT_GET\",e);case 3:(r=n.sent)&&r.result&&r.result.data&&(t.comments=e.before?t.comments.concat(r.result.data):r.result.data,t.showExpand=r.result.more,t.count=r.result.count||t.comments.length||0,t.$nextTick(t.onCommentLoaded)),n.next=10;break;case 7:n.prev=7,n.t0=n[\"catch\"](0),t.errorMessage=n.t0.message;case 10:case\"end\":return n.stop()}}),n,null,[[0,7]])})))()},onReply:function(e){this.replyId=e},openAdmin:function(){this.$emit(\"admin\")}},mounted:function(){this.initConfig(),this.initComments()}}},6056:function(e,t,n){\"use strict\";var r=n(3330);Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var i=r(n(818)),o=r(n(8711)),a=n(8521),s=n(2304);t.Z={data:function(){return{version:a.version,counter:{}}},methods:{getCounter:function(){var e=this;return(0,o[\"default\"])(i[\"default\"].mark((function t(){var n,r,o,a;return i[\"default\"].wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=document.getElementById(\"twikoo_visitors\")){t.next=3;break}return t.abrupt(\"return\");case 3:if(-1===[\"localhost\",\"127.0.0.1\",\"0.0.0.0\"].indexOf(window.location.hostname)){t.next=5;break}return t.abrupt(\"return\");case 5:return r=(0,s.getUrl)(e.$twikoo.path),o=(0,s.getHref)(e.$twikoo.href),t.next=9,(0,s.call)(e.$tcb,\"COUNTER_GET\",{url:r,href:o,title:document.title});case 9:a=t.sent,e.counter=a.result,(e.counter.time||0===e.counter.time)&&(n.innerHTML=e.counter.time);case 12:case\"end\":return t.stop()}}),t)})))()}},mounted:function(){this.getCounter()}}},1749:function(e,t,n){\"use strict\";Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var r=n(7588),i=n(2304),o=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;t.Z={props:{nick:String,mail:String,link:String,config:Object},data:function(){return{metaInputs:[{key:\"nick\",locale:(0,i.t)(\"META_INPUT_NICK\"),name:\"nick\",type:\"text\"},{key:\"mail\",locale:(0,i.t)(\"META_INPUT_MAIL\"),name:\"mail\",type:\"email\"},{key:\"link\",locale:(0,i.t)(\"META_INPUT_LINK\"),name:\"link\",type:\"text\"}],metaData:{nick:\"\",mail:\"\",link:\"\"}}},computed:{displayedFields:function(){var e=this.config.DISPLAYED_FIELDS;return{nick:!e||-1!==e.indexOf(\"nick\"),mail:!e||-1!==e.indexOf(\"mail\"),link:!e||-1!==e.indexOf(\"link\")}},displayedInputs:function(){var e=this;return this.metaInputs.filter((function(t){return!!e.displayedFields[t.key]}))},requiredFields:function(){var e=this.config.REQUIRED_FIELDS;return{nick:!e||-1!==e.indexOf(\"nick\"),mail:!e||-1!==e.indexOf(\"mail\"),link:!!e&&-1!==e.indexOf(\"link\")}}},methods:{t:i.t,initMeta:function(){var e=localStorage.getItem(\"twikoo\");if(e){var t=JSON.parse(e);this.metaData.nick=t.nick,this.metaData.mail=t.mail,this.metaData.link=t.link}this.updateMeta()},updateMeta:function(){localStorage.setItem(\"twikoo\",JSON.stringify(this.metaData)),this.$emit(\"update\",{meta:this.metaData,valid:this.checkValid()})},checkValid:function(){var e=o.test(this.metaData.mail);return(this.metaData.nick||!this.requiredFields.nick)&&(e||!this.requiredFields.mail)&&(this.metaData.link||!this.requiredFields.link)},checkQQ:function(){if((0,i.isQQ)(this.metaData.nick)){var e=this.metaData.nick.replace(/@qq.com/gi,\"\"),t=\"\".concat(e,\"@qq.com\");this.metaData.mail=t,this.getQQNick(e)}},getQQNick:function(e){var t=this,n=\"https://api.qjqq.cn/api/qqinfo?qq=\".concat(e),r=new XMLHttpRequest;r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){var e=JSON.parse(r.responseText);t.metaData.nick=e.name,t.updateMeta()}},r.open(\"GET\",n),r.send()},checkAdminCrypt:function(){var e=this.$root.$children[0],t=!this.config.HIDE_ADMIN_CRYPT||this.config.HIDE_ADMIN_CRYPT===this.metaData.nick;e.onShowAdminEntry(t)},onMetaChange:function(){this.checkQQ(),this.updateMeta(),this.checkAdminCrypt()}},watch:{nick:function(e){this.metaData.nick=e},mail:function(e){this.metaData.mail=e},link:function(e){this.metaData.link=e},requiredFields:{handler:function(e,t){this.$emit(\"update\",{meta:this.metaData,valid:this.checkValid()})},deep:!0},\"config.VERSION\":function(){this.checkAdminCrypt()}},mounted:function(){r.app.$on(\"initMeta\",this.initMeta),this.initMeta()}}},7181:function(e,t,n){\"use strict\";Object.defineProperty(t,\"X\",{value:!0}),t.Z=void 0;var r=n(2304);t.Z={props:{pageSize:{type:Number,\"default\":10},total:{type:Number,\"default\":0}},data:function(){return{currentPage:1,userInput:0,userPageSize:0,pagers:[]}},computed:{pageCount:function(){return Math.ceil(this.total/this.pageSize)}},methods:{t:r.t,generatePager:function(){for(var e=[],t=1;t1?t.pop():\"\";if(-1!==h.indexOf(n.toLowerCase())){var r=this.getUserId(),i=\"\".concat(Date.now(),\"-\").concat(r),o=t.join(\".\");this.paste(this.getImagePlaceholder(i,n));var a=this.config.IMAGE_CDN;!this.$tcb||a&&\"qcloud\"!==a?a?this.uploadPhotoToThirdParty(i,o,n,e):this.uploadFailed(i,n,(0,f.t)(\"IMAGE_UPLOAD_FAILED_NO_CONF\")):this.uploadPhotoToQcloud(i,o,n,e)}}},getUserId:function(){return this.$tcb?this.$tcb.auth.currentUser.uid:localStorage.getItem(\"twikoo-access-token\")},uploadPhotoToQcloud:function(e,t,n,r){var a=this;return(0,o[\"default\"])(i[\"default\"].mark((function s(){var o,u,c;return i[\"default\"].wrap((function(i){for(;;)switch(i.prev=i.next){case 0:return i.prev=0,i.next=3,a.$tcb.app.uploadFile({cloudPath:\"tk-img/\".concat(e,\".\").concat(n),filePath:r});case 3:if(!(o=i.sent).fileID){i.next=10;break}return i.next=7,a.$tcb.app.getTempFileURL({fileList:[o.fileID]});case 7:u=i.sent,c=u.fileList[0].tempFileURL,a.uploadCompleted(e,t,n,c);case 10:i.next=16;break;case 12:i.prev=12,i.t0=i[\"catch\"](0),console.error(i.t0),a.uploadFailed(e,n,i.t0.message);case 16:case\"end\":return i.stop()}}),s,null,[[0,12]])})))()},uploadPhotoToThirdParty:function(e,t,n,r){var a=this;return(0,o[\"default\"])(i[\"default\"].mark((function s(){var o,u,c;return i[\"default\"].wrap((function(i){for(;;)switch(i.prev=i.next){case 0:return i.prev=0,i.t0=f.call,i.t1=a.$tcb,i.t2=\"\".concat(e,\".\").concat(n),i.next=6,(0,f.blobToDataURL)(r);case 6:return i.t3=i.sent,i.t4={fileName:i.t2,photo:i.t3},i.next=10,(0,i.t0)(i.t1,\"UPLOAD_IMAGE\",i.t4);case 10:u=i.sent,(c=u.result).data?a.uploadCompleted(e,t,n,c.data.url):1040===c.code&&c.err&&(o=c.err.match(/this image exists at: (http[^ ]+)/))?(console.warn(c),a.uploadCompleted(e,t,n,o[1])):(console.error(c),a.uploadFailed(e,n,c.err)),i.next=19;break;case 15:i.prev=15,i.t5=i[\"catch\"](0),console.error(i.t5),a.uploadFailed(e,n,i.t5.message);case 19:case\"end\":return i.stop()}}),s,null,[[0,15]])})))()},uploadCompleted:function(e,t,n,r){t=t.replace(/[[\\]]/g,\"_\"),this.comment=this.comment.replace(this.getImagePlaceholder(e,n),\".concat(r,\")\")),this.$refs.inputFile.value=\"\"},uploadFailed:function(e,t,n){this.comment=this.comment.replace(this.getImagePlaceholder(e,t),\"_\".concat((0,f.t)(\"IMAGE_UPLOAD_FAILED\"),\": \").concat(n,\"_\")),this.$refs.inputFile.value=\"\"},paste:function(e){if(document.selection)document.selection.createRange().text=e;else if(this.textarea.selectionStart||0===this.textarea.selectionStart){var t=this.textarea.selectionStart,n=this.textarea.selectionEnd;this.comment=this.comment.substring(0,t)+e+this.comment.substring(n,this.comment.length),this.textarea.selectionStart=t+e.length,this.textarea.selectionEnd=t+e.length}else this.comment+=e},getImagePlaceholder:function(e,t){return\"![\".concat((0,f.t)(\"IMAGE_UPLOAD_PLACEHOLDER\"),\" \").concat(e,\".\").concat(t,\"]()\")}},mounted:function(){this.initDraft(),this.initOwo(),this.addEventListener(),this.onBgImgChange()},watch:{\"config.SHOW_EMOTION\":function(){this.initOwo()},\"config.COMMENT_BG_IMG\":function(){this.onBgImgChange()}}}},4965:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"twikoo\",attrs:{id:\"twikoo\"}},[t(\"tk-comments\",{attrs:{\"show-admin-entry\":e.showAdminEntry},on:{admin:function(t){e.showAdmin=!0}}}),e._v(\" \"),t(\"tk-footer\"),e._v(\" \"),t(\"tk-admin\",{attrs:{show:e.showAdmin},on:{close:function(t){e.showAdmin=!1}}})],1)},t.xk=[]},7534:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-action\"},[t(\"a\",{staticClass:\"tk-action-link\",\"class\":{\"tk-liked\":e.liked},attrs:{href:\"#\"},on:{click:e.onLike}},[t(\"span\",{staticClass:\"tk-action-icon\",domProps:{innerHTML:e._s(e.iconLike)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-action-icon tk-action-icon-solid\",domProps:{innerHTML:e._s(e.iconLikeSolid)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-action-count\"},[e._v(e._s(e.likeCountStr))])]),e._v(\" \"),t(\"a\",{staticClass:\"tk-action-link\",attrs:{href:\"#\"},on:{click:e.onReply}},[t(\"span\",{staticClass:\"tk-action-icon\",domProps:{innerHTML:e._s(e.iconComment)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-action-icon tk-action-icon-solid\",domProps:{innerHTML:e._s(e.iconCommentSolid)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-action-count\"},[e._v(e._s(e.repliesCountStr))])])])},t.xk=[]},3530:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-admin-container\"},[t(\"div\",{directives:[{name:\"loading\",rawName:\"v-loading\",value:e.loading,expression:\"loading\"}],staticClass:\"tk-admin\",\"class\":{__show:e.show}},[t(\"a\",{staticClass:\"tk-admin-close\",attrs:{href:\"#\"},domProps:{innerHTML:e._s(e.iconClose)},on:{click:e.onClose}}),e._v(\" \"),e.needUpdate?t(\"div\",{staticClass:\"tk-login-title\"},[t(\"div\",[e._v(e._s(e.t(\"ADMIN_NEED_UPDATE\")))]),e._v(\" \"),t(\"a\",{attrs:{href:\"https://twikoo.js.org/update.html\",target:\"_blank\"}},[e._v(\"https://twikoo.js.org/update.html\")])]):e._e(),e._v(\" \"),e.needUpdate?e._e():t(\"div\",[!e.isLogin&&e.isSetPassword?t(\"div\",{staticClass:\"tk-login\"},[t(\"div\",{staticClass:\"tk-login-title\"},[e._v(e._s(e.t(\"ADMIN_LOGIN_TITLE\")))]),e._v(\" \"),t(\"input\",{attrs:{type:\"hidden\"}}),e._v(\" \"),t(\"el-input\",{ref:\"focusme\",staticClass:\"tk-password\",attrs:{placeholder:e.t(\"ADMIN_PASSWORD_PLACEHOLDER\"),\"show-password\":\"\"},nativeOn:{keyup:function(t){return!t.type.indexOf(\"key\")&&e._k(t.keyCode,\"enter\",13,t.key,\"Enter\")?null:e.onLogin.apply(null,arguments)}},model:{value:e.password,callback:function(t){e.password=t},expression:\"password\"}},[t(\"template\",{slot:\"prepend\"},[e._v(e._s(e.t(\"ADMIN_PASSWORD\")))]),e._v(\" \"),t(\"el-button\",{attrs:{slot:\"append\"},on:{click:e.onLogin},slot:\"append\"},[e._v(e._s(e.t(\"ADMIN_LOGIN\")))])],2),e._v(\" \"),e.loginErrorMessage?t(\"div\",{staticClass:\"tk-login-msg\"},[e._v(\"\\n \"+e._s(e.loginErrorMessage)+\"\\n \"),t(\"a\",{attrs:{href:\"https://twikoo.js.org/faq.html\",rel:\"noopener noreferrer\",target:\"_blank\"}},[e._v(e._s(e.t(\"ADMIN_FORGOT\")))])]):e._e()],1):e._e(),e._v(\" \"),e.isLogin||e.isSetPassword?e._e():t(\"div\",{staticClass:\"tk-regist\"},[t(\"div\",{staticClass:\"tk-login-title\"},[e._v(e._s(e.t(\"ADMIN_LOGIN_TITLE\")))]),e._v(\" \"),e.isSetCredentials?e._e():t(\"el-input\",{ref:\"focusme\",staticClass:\"tk-password\",attrs:{placeholder:e.t(\"ADMIN_CREDENTIALS_PLACEHOLDER\")},model:{value:e.credentials,callback:function(t){e.credentials=t},expression:\"credentials\"}},[t(\"template\",{slot:\"prepend\"},[e._v(e._s(e.t(\"ADMIN_CREDENTIALS\")))])],2),e._v(\" \"),t(\"el-input\",{staticClass:\"tk-password\",attrs:{placeholder:e.t(\"ADMIN_SET_PASSWORD_PLACEHOLDER\"),\"show-password\":\"\"},model:{value:e.password,callback:function(t){e.password=t},expression:\"password\"}},[t(\"template\",{slot:\"prepend\"},[e._v(e._s(e.t(\"ADMIN_SET_PASSWORD\")))])],2),e._v(\" \"),t(\"el-input\",{staticClass:\"tk-password\",attrs:{placeholder:e.t(\"ADMIN_SET_PASSWORD_CONFIRM_PLACEHOLDER\"),\"show-password\":\"\"},model:{value:e.passwordConfirm,callback:function(t){e.passwordConfirm=t},expression:\"passwordConfirm\"}},[t(\"template\",{slot:\"prepend\"},[e._v(e._s(e.t(\"ADMIN_SET_PASSWORD_CONFIRM\")))])],2),e._v(\" \"),t(\"el-button\",{staticClass:\"tk-regist-button\",attrs:{disabled:!e.canRegist},on:{click:e.onRegist}},[e._v(e._s(e.t(\"ADMIN_REGIST\")))]),e._v(\" \"),e.loginErrorMessage?t(\"div\",{staticClass:\"tk-login-msg\"},[e._v(e._s(e.loginErrorMessage))]):e._e(),e._v(\" \"),e.isSetCredentials?e._e():t(\"div\",{staticClass:\"tk-login-msg\"},[t(\"a\",{attrs:{href:\"https://twikoo.js.org/faq.html\",rel:\"noopener noreferrer\",target:\"_blank\"}},[e._v(e._s(e.t(\"ADMIN_CREDENTIALS_FAQ\")))])])],1),e._v(\" \"),e.isLogin?t(\"div\",{staticClass:\"tk-panel\"},[t(\"div\",{staticClass:\"tk-panel-title\"},[t(\"div\",[e._v(e._s(e.t(\"ADMIN_TITLE\")))]),e._v(\" \"),t(\"a\",{staticClass:\"tk-panel-logout\",attrs:{href:\"#\"},on:{click:e.onLogout}},[e._v(e._s(e.t(\"ADMIN_LOGOUT\")))])]),e._v(\" \"),t(\"div\",{staticClass:\"tk-tabs\"},[t(\"div\",{staticClass:\"tk-tab\",\"class\":{__active:\"comment\"===e.activeTabName},on:{click:function(t){e.activeTabName=\"comment\"}}},[e._v(e._s(e.t(\"ADMIN_COMMENT\")))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-tab\",\"class\":{__active:\"config\"===e.activeTabName},on:{click:function(t){e.activeTabName=\"config\"}}},[e._v(e._s(e.t(\"ADMIN_CONFIG\")))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-tab\",\"class\":{__active:\"import\"===e.activeTabName},on:{click:function(t){e.activeTabName=\"import\"}}},[e._v(e._s(e.t(\"ADMIN_IMPORT\")))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-tab\",\"class\":{__active:\"export\"===e.activeTabName},on:{click:function(t){e.activeTabName=\"export\"}}},[e._v(e._s(e.t(\"ADMIN_EXPORT\")))])]),e._v(\" \"),t(\"tk-admin-comment\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"comment\"===e.activeTabName,expression:\"activeTabName === 'comment'\"}]}),e._v(\" \"),t(\"tk-admin-config\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"config\"===e.activeTabName,expression:\"activeTabName === 'config'\"}]}),e._v(\" \"),t(\"tk-admin-import\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"import\"===e.activeTabName,expression:\"activeTabName === 'import'\"}]}),e._v(\" \"),t(\"tk-admin-export\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"export\"===e.activeTabName,expression:\"activeTabName === 'export'\"}]})],1):e._e()])])])},t.xk=[]},7229:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{directives:[{name:\"loading\",rawName:\"v-loading\",value:e.loading,expression:\"loading\"}],staticClass:\"tk-admin-comment\"},[e.clientVersion!==e.serverVersion?t(\"div\",{staticClass:\"tk-admin-warn\"},[t(\"span\",[e._v(e._s(e.t(\"ADMIN_CLIENT_VERSION\"))+e._s(e.clientVersion)+\",\")]),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"ADMIN_SERVER_VERSION\"))+e._s(e.serverVersion)+\",\")]),e._v(\" \"),e._m(0)]):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-comment-filter\"},[t(\"el-input\",{staticClass:\"tk-admin-comment-filter-keyword\",attrs:{size:\"small\",placeholder:e.t(\"ADMIN_COMMENT_SEARCH_PLACEHOLDER\")},nativeOn:{keyup:function(t){return!t.type.indexOf(\"key\")&&e._k(t.keyCode,\"enter\",13,t.key,\"Enter\")?null:e.getComments.apply(null,arguments)}},model:{value:e.filter.keyword,callback:function(t){e.$set(e.filter,\"keyword\",t)},expression:\"filter.keyword\"}}),e._v(\" \"),t(\"select\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.filter.type,expression:\"filter.type\"}],staticClass:\"tk-admin-comment-filter-type\",on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return\"_value\"in e?e._value:e.value}));e.$set(e.filter,\"type\",t.target.multiple?n:n[0])}}},[t(\"option\",{attrs:{value:\"\"}},[e._v(e._s(e.t(\"ADMIN_COMMENT_FILTER_ALL\")))]),e._v(\" \"),t(\"option\",{attrs:{value:\"VISIBLE\"}},[e._v(e._s(e.t(\"ADMIN_COMMENT_FILTER_VISIBLE\")))]),e._v(\" \"),t(\"option\",{attrs:{value:\"HIDDEN\"}},[e._v(e._s(e.t(\"ADMIN_COMMENT_FILTER_HIDDEN\")))])]),e._v(\" \"),t(\"el-button\",{attrs:{size:\"small\",type:\"primary\"},on:{click:e.getComments}},[e._v(e._s(e.t(\"ADMIN_COMMENT_SEARCH\")))])],1),e._v(\" \"),t(\"div\",{ref:\"comment-list\",staticClass:\"tk-admin-comment-list\"},e._l(e.comments,(function(n){return t(\"div\",{key:n._id,staticClass:\"tk-admin-comment-item\"},[t(\"div\",{staticClass:\"tk-admin-comment-meta\"},[t(\"tk-avatar\",{attrs:{config:e.serverConfig,avatar:n.avatar,mail:n.mail,link:n.link}}),e._v(\" \"),n.link?e._e():t(\"span\",[e._v(e._s(n.nick)+\" \")]),e._v(\" \"),n.link?t(\"a\",{attrs:{href:e.convertLink(n.link),target:\"_blank\"}},[e._v(e._s(n.nick)+\" \")]):e._e(),e._v(\" \"),n.mail?t(\"span\",[e._v(\"(\"),t(\"a\",{attrs:{href:\"mailto:\".concat(n.mail)}},[e._v(e._s(n.mail))]),e._v(\") \")]):e._e(),e._v(\" \"),n.isSpam?t(\"span\",[e._v(e._s(e.t(\"ADMIN_COMMENT_IS_SPAM_SUFFIX\"))+\" \")]):e._e(),e._v(\" \"),t(\"span\",{staticClass:\"tk-time\"},[e._v(e._s(e.displayCreated(n))+\" \")]),e._v(\" \"),t(\"span\",{attrs:{title:n.ua}},[e._v(e._s(n.ipRegion))])],1),e._v(\" \"),t(\"div\",{ref:\"comments\",refInFor:!0,staticClass:\"tk-content\",domProps:{innerHTML:e._s(n.comment)}}),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-actions\"},[t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleView(n)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_VIEW\")))]),e._v(\" \"),n.isSpam?t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleSpam(n,!1)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_SHOW\")))]):e._e(),e._v(\" \"),n.isSpam?e._e():t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleSpam(n,!0)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_HIDE\")))]),e._v(\" \"),!n.rid&&n.top?t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleTop(n,!1)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_UNTOP\")))]):e._e(),e._v(\" \"),n.rid||n.top?e._e():t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleTop(n,!0)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_TOP\")))]),e._v(\" \"),t(\"el-button\",{attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){return e.handleDelete(n)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_DELETE\")))])],1)])})),0),e._v(\" \"),t(\"tk-pagination\",{attrs:{\"page-size\":e.pageSize,total:e.count},on:{\"page-size-change\":e.onPageSizeChange,\"current-change\":e.switchPage}})],1)},t.xk=[function(){var e=this,t=e._self._c;return t(\"span\",[e._v(\"请参考 \"),t(\"a\",{attrs:{href:\"https://twikoo.js.org/update.html\",target:\"_blank\"}},[e._v(\"版本更新\")]),e._v(\" 进行升级\")])}]},3922:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{directives:[{name:\"loading\",rawName:\"v-loading\",value:e.loading,expression:\"loading\"}],staticClass:\"tk-admin-config\"},[e.clientVersion!==e.serverVersion?t(\"div\",{staticClass:\"tk-admin-warn\"},[t(\"span\",[e._v(e._s(e.t(\"ADMIN_CLIENT_VERSION\"))+e._s(e.clientVersion)+\",\")]),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"ADMIN_SERVER_VERSION\"))+e._s(e.serverVersion)+\",\")]),e._v(\" \"),e._m(0)]):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-groups\"},[e._l(e.settings,(function(n){return t(\"details\",{key:n.name,staticClass:\"tk-admin-config-group\"},[t(\"summary\",{staticClass:\"tk-admin-config-group-title\"},[e._v(e._s(n.name))]),e._v(\" \"),e._l(n.items,(function(n){return t(\"div\",{key:n.key,staticClass:\"tk-admin-config-item\"},[t(\"div\",{staticClass:\"tk-admin-config-title\",attrs:{title:n.key}},[e._v(e._s(n.key))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-input\"},[t(\"el-input\",{attrs:{placeholder:n.ph,size:\"small\",\"show-password\":n.secret},model:{value:n.value,callback:function(t){e.$set(n,\"value\",t)},expression:\"setting.value\"}})],1),e._v(\" \"),t(\"div\"),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-desc\"},[e._v(e._s(n.desc))])])}))],2)})),e._v(\" \"),t(\"details\",{staticClass:\"tk-admin-config-group\"},[t(\"summary\",{staticClass:\"tk-admin-config-group-title\"},[e._v(e._s(e.t(\"ADMIN_CONFIG_EMAIL_TEST\")))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-email-test\"},[t(\"div\",{staticClass:\"tk-admin-config-email-test-desc\"},[e._v(e._s(e.t(\"ADMIN_CONFIG_EMAIL_TEST_HELP\")))]),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-input\"},[t(\"el-input\",{attrs:{size:\"small\"},model:{value:e.emailTestAddress,callback:function(t){e.emailTestAddress=t},expression:\"emailTestAddress\"}},[t(\"el-button\",{attrs:{slot:\"append\",type:\"info\"},on:{click:e.testEmail},slot:\"append\"},[e._v(e._s(e.t(\"ADMIN_CONFIG_EMAIL_TEST_BTN\")))])],1)],1),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-email-test-desc\"},[e._v(e._s(e.t(\"ADMIN_CONFIG_EMAIL_TEST_RESULT\"))+e._s(e.emailTestResult))])])])],2),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-actions\"},[t(\"el-button\",{attrs:{size:\"small\",type:\"primary\"},on:{click:e.saveConfig}},[e._v(e._s(e.t(\"ADMIN_CONFIG_SAVE\")))]),e._v(\" \"),t(\"el-button\",{attrs:{size:\"small\",type:\"info\"},on:{click:e.resetConfig}},[e._v(e._s(e.t(\"ADMIN_CONFIG_RESET\")))])],1),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-config-message\"},[e._v(e._s(e.message))])])},t.xk=[function(){var e=this,t=e._self._c;return t(\"span\",[e._v(\"请参考 \"),t(\"a\",{attrs:{href:\"https://twikoo.js.org/update.html\",target:\"_blank\"}},[e._v(\"版本更新\")]),e._v(\" 进行升级\")])}]},9528:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-admin-export\"},[t(\"div\",{staticClass:\"tk-admin-warn tk-admin-import-warn\"},[t(\"p\",[e._v(e._s(e.t(\"ADMIN_EXPORT_WARN\")))])]),e._v(\" \"),t(\"el-button\",{attrs:{size:\"small\",disabled:e.loading},on:{click:function(t){return e.doExport(\"comment\")}}},[e._v(e._s(e.t(\"ADMIN_EXPORT_COMMENT\")))]),e._v(\" \"),t(\"el-button\",{attrs:{size:\"small\",disabled:e.loading},on:{click:function(t){return e.doExport(\"counter\")}}},[e._v(e._s(e.t(\"ADMIN_EXPORT_COUNTER\")))])],1)},t.xk=[]},5954:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-admin-import\"},[t(\"div\",{staticClass:\"tk-admin-warn tk-admin-import-warn\"},[t(\"p\",[e._v(e._s(e.t(\"ADMIN_IMPORT_WARN\")))]),e._v(\" \"),t(\"p\",[e._v(e._s(e.warnText[e.source]))])]),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-import-label\"},[e._v(e._s(e.t(\"ADMIN_IMPORT_SELECT_SOURCE\")))]),e._v(\" \"),t(\"select\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.source,expression:\"source\"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return\"_value\"in e?e._value:e.value}));e.source=t.target.multiple?n:n[0]}}},[t(\"option\",{attrs:{disabled:\"\",value:\"\"}},[e._v(e._s(e.t(\"ADMIN_IMPORT_SELECT\")))]),e._v(\" \"),t(\"option\",{attrs:{value:\"valine\"}},[e._v(\"Valine (JSON)\")]),e._v(\" \"),t(\"option\",{attrs:{value:\"disqus\"}},[e._v(\"Disqus (XML)\")]),e._v(\" \"),t(\"option\",{attrs:{value:\"artalk\"}},[e._v(\"Artalk v1 (JSON)\")]),e._v(\" \"),t(\"option\",{attrs:{value:\"artalk2\"}},[e._v(\"Artalk v2 (Artrans)\")]),e._v(\" \"),t(\"option\",{attrs:{value:\"twikoo\"}},[e._v(\"Twikoo (JSON)\")])]),e._v(\" \"),t(\"div\",{staticClass:\"tk-admin-import-label\"},[e._v(e._s(e.t(\"ADMIN_IMPORT_SELECT_FILE\")))]),e._v(\" \"),t(\"input\",{ref:\"inputFile\",attrs:{type:\"file\",value:\"\"}}),e._v(\" \"),t(\"el-button\",{attrs:{size:\"small\",disabled:e.loading},on:{click:e.uploadFile}},[e._v(e._s(e.t(\"ADMIN_IMPORT_START\")))]),e._v(\" \"),t(\"el-input\",{ref:\"logTextArea\",attrs:{type:\"textarea\",rows:10,placeholder:e.t(\"ADMIN_IMPORT_LOG\"),readonly:\"\"},model:{value:e.logText,callback:function(t){e.logText=t},expression:\"logText\"}})],1)},t.xk=[]},7870:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-avatar\",\"class\":{\"tk-clickable\":!!e.link,\"tk-has-avatar\":!!e.avatarInner},on:{click:e.onClick}},[e.avatarInner?e._e():t(\"div\",{staticClass:\"tk-avatar-img\",domProps:{innerHTML:e._s(e.iconUser)}}),e._v(\" \"),e.avatarInner?t(\"img\",{staticClass:\"tk-avatar-img\",attrs:{src:e.avatarInner,alt:\"\"}}):e._e()])},t.xk=[]},6814:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{ref:\"tk-comment\",staticClass:\"tk-comment\",\"class\":{\"tk-master\":e.comment.master},attrs:{id:e.comment.id}},[t(\"tk-avatar\",{attrs:{config:e.config,nick:e.comment.nick,avatar:e.comment.avatar,\"mail-md5\":e.comment.mailMd5,link:e.convertedLink}}),e._v(\" \"),t(\"div\",{staticClass:\"tk-main\"},[t(\"div\",{staticClass:\"tk-row\"},[t(\"div\",{staticClass:\"tk-meta\"},[e.convertedLink?e._e():t(\"strong\",{staticClass:\"tk-nick\"},[e._v(e._s(e.comment.nick))]),e._v(\" \"),e.convertedLink?t(\"a\",{staticClass:\"tk-nick tk-nick-link\",attrs:{href:e.convertedLink,target:\"_blank\",rel:\"noopener noreferrer\"}},[t(\"strong\",[e._v(e._s(e.comment.nick))])]):e._e(),e._v(\" \"),e.comment.master?t(\"span\",{staticClass:\"tk-tag tk-tag-green\"},[e._v(e._s(e.config.MASTER_TAG||e.t(\"COMMENT_MASTER_TAG\")))]):e._e(),e._v(\" \"),e.comment.top?t(\"span\",{staticClass:\"tk-tag tk-tag-red\"},[e._v(e._s(e.t(\"COMMENT_TOP_TAG\")))]):e._e(),e._v(\" \"),e.comment.isSpam?t(\"span\",{staticClass:\"tk-tag tk-tag-yellow\"},[e._v(e._s(e.t(\"COMMENT_REVIEWING_TAG\")))]):e._e(),e._v(\" \"),t(\"small\",{staticClass:\"tk-time\"},[t(\"time\",{attrs:{datetime:e.jsonTimestamp,title:e.localeTime}},[e._v(e._s(e.displayCreated))])]),e._v(\" \"),e.isLogin?t(\"small\",{staticClass:\"tk-actions\"},[e.comment.isSpam?t(\"a\",{attrs:{href:\"#\"},on:{click:function(t){return e.handleSpam(!1,t)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_SHOW\")))]):e._e(),e._v(\" \"),e.comment.isSpam?e._e():t(\"a\",{attrs:{href:\"#\"},on:{click:function(t){return e.handleSpam(!0,t)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_HIDE\")))]),e._v(\" \"),!e.comment.rid&&e.comment.top?t(\"a\",{attrs:{href:\"#\"},on:{click:function(t){return e.handleTop(!1,t)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_UNTOP\")))]):e._e(),e._v(\" \"),e.comment.rid||e.comment.top?e._e():t(\"a\",{attrs:{href:\"#\"},on:{click:function(t){return e.handleTop(!0,t)}}},[e._v(e._s(e.t(\"ADMIN_COMMENT_TOP\")))])]):e._e()]),e._v(\" \"),t(\"tk-action\",{attrs:{liked:e.liked,\"like-count\":e.like,\"replies-count\":e.comment.replies.length},on:{like:e.onLike,reply:e.onReply}})],1),e._v(\" \"),t(\"div\",{staticClass:\"tk-content\"},[e.comment.pid?t(\"span\",[e._v(e._s(e.t(\"COMMENT_REPLIED\"))+\" \"),t(\"a\",{staticClass:\"tk-ruser\",attrs:{href:\"#\".concat(e.comment.pid)}},[e._v(\"@\"+e._s(e.comment.ruser))]),e._v(\" :\")]):e._e(),e._v(\" \"),t(\"span\",{ref:\"comment\",domProps:{innerHTML:e._s(e.comment.comment)}})]),e._v(\" \"),e.comment.ipRegion||e.comment.os||e.comment.browser?t(\"div\",{staticClass:\"tk-extras\"},[e.comment.ipRegion?t(\"div\",{staticClass:\"tk-extra\"},[t(\"span\",{staticClass:\"tk-icon __comment\",domProps:{innerHTML:e._s(e.iconLocation)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-extra-text\"},[e._v(\" \"+e._s(e.comment.ipRegion))])]):e._e(),e._v(\" \"),e.comment.os?t(\"div\",{staticClass:\"tk-extra\"},[t(\"span\",{staticClass:\"tk-icon __comment\",domProps:{innerHTML:e._s(e.iconOs)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-extra-text\"},[e._v(\" \"+e._s(e.comment.os))])]):e._e(),e._v(\" \"),e.comment.browser?t(\"div\",{staticClass:\"tk-extra\"},[t(\"span\",{staticClass:\"tk-icon __comment\",domProps:{innerHTML:e._s(e.iconBrowser)}}),e._v(\" \"),t(\"span\",{staticClass:\"tk-extra-text\"},[e._v(\" \"+e._s(e.comment.browser))])]):e._e()]):e._e(),e._v(\" \"),t(\"div\",{ref:\"tk-replies\",staticClass:\"tk-replies\",\"class\":{\"tk-replies-expand\":e.isExpanded||!e.showExpand}},e._l(e.comment.replies,(function(n){return t(\"tk-comment\",{key:n.id,attrs:{comment:n,config:e.config},on:{expand:e.onExpand,load:e.onLoad,reply:e.onReplyReply}})})),1),e._v(\" \"),e.replying?t(\"tk-submit\",{attrs:{\"reply-id\":e.comment.id,pid:e.pid,config:e.config},on:{load:e.onLoad,cancel:e.onCancel}}):e._e(),e._v(\" \"),e.showExpand?t(\"div\",{staticClass:\"tk-expand\",on:{click:e.onExpand}},[e._v(e._s(e.t(\"COMMENT_EXPAND\")))]):e._e(),e._v(\" \"),e.showCollapse?t(\"div\",{staticClass:\"tk-expand _collapse\",on:{click:e.onCollapse}},[e._v(e._s(e.t(\"COMMENT_COLLAPSE\")))]):e._e()],1)],1)},t.xk=[]},1505:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-comments\"},[t(\"tk-submit\",{attrs:{config:e.config},on:{load:e.initComments}}),e._v(\" \"),t(\"div\",{directives:[{name:\"loading\",rawName:\"v-loading\",value:e.loading,expression:\"loading\"}],staticClass:\"tk-comments-container\"},[t(\"div\",{staticClass:\"tk-comments-title\"},[t(\"span\",{staticClass:\"tk-comments-count\",\"class\":{__hidden:!e.comments.length}},[t(\"span\",[e._v(e._s(e.count))]),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"COMMENTS_COUNT_SUFFIX\")))])]),e._v(\" \"),t(\"span\",[e.loading||e.loadingMore?e._e():t(\"span\",{staticClass:\"tk-icon __comments\",domProps:{innerHTML:e._s(e.iconRefresh)},on:{click:e.refresh}}),e.showAdminEntry?t(\"span\",{staticClass:\"tk-icon __comments\",domProps:{innerHTML:e._s(e.iconSetting)},on:{click:e.openAdmin}}):e._e()])]),e._v(\" \"),e.loading||e.comments.length?e._e():t(\"div\",{staticClass:\"tk-comments-no\"},[e.errorMessage?e._e():t(\"span\",[e._v(e._s(e.t(\"COMMENTS_NO_COMMENTS\")))]),e._v(\" \"),e.errorMessage?t(\"span\",{staticClass:\"tk-comments-error\"},[e._v(e._s(e.errorMessage))]):e._e()]),e._v(\" \"),e._l(e.comments,(function(n){return t(\"tk-comment\",{key:n.id,attrs:{comment:n,replying:e.replyId===n.id,config:e.config},on:{reply:e.onReply,load:e.initComments}})})),e._v(\" \"),e.showExpand&&!e.loading?t(\"div\",{directives:[{name:\"loading\",rawName:\"v-loading\",value:e.loadingMore,expression:\"loadingMore\"}],staticClass:\"tk-expand\",on:{click:e.onExpand}},[e._v(e._s(e.t(\"COMMENTS_EXPAND\")))]):e._e()],2)],1)},t.xk=[]},1613:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-footer\"},[e._v(\"\\n Powered by \"),t(\"a\",{attrs:{href:\"https://twikoo.js.org\",target:\"_blank\"}},[e._v(\"Twikoo\")]),e._v(\"\\n v\"+e._s(e.version)+\"\\n\")])},t.xk=[]},6252:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-meta-input\"},e._l(e.displayedInputs,(function(n){return t(\"el-input\",{key:n.key,attrs:{name:n.name,type:n.type,placeholder:e.requiredFields[n.key]?e.t(\"META_INPUT_REQUIRED\"):e.t(\"META_INPUT_NOT_REQUIRED\"),size:\"small\"},on:{change:e.onMetaChange},model:{value:e.metaData[n.key],callback:function(t){e.$set(e.metaData,n.key,t)},expression:\"metaData[metaInput.key]\"}},[t(\"template\",{slot:\"prepend\"},[e._v(e._s(n.locale))])],2)})),1)},t.xk=[]},978:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-pagination\"},[e.pageCount?t(\"div\",{staticClass:\"tk-pagination-options\"},[t(\"div\",[t(\"span\",[e._v(e._s(e.t(\"PAGINATION_COUNT_PREFIX\")))]),e._v(\" \"),t(\"span\",[e._v(e._s(e.total))]),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"PAGINATION_COUNT_SUFFIX\")))])]),e._v(\" \"),t(\"el-input\",{attrs:{type:\"number\",min:\"1\",max:\"100\",value:e.userPageSize?e.userPageSize:e.pageSize},on:{input:e.handleInputPageSize,change:e.pageSizeChamge}}),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"PAGINATION_PAGESIZE\")))])],1):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"tk-pagination-pagers\"},e._l(e.pagers,(function(n){return t(\"div\",{key:n.page,staticClass:\"tk-pagination-pager\",\"class\":{__current:n.page===e.currentPage},on:{click:function(t){return e.currentChange(n.page)}}},[e._v(e._s(n.title))])})),0),e._v(\" \"),e.pageCount?t(\"div\",{staticClass:\"tk-pagination-options\"},[t(\"span\",[e._v(e._s(e.t(\"PAGINATION_GOTO_PREFIX\")))]),e._v(\" \"),t(\"el-input\",{attrs:{type:\"number\",min:\"1\",max:e.pageCount,value:e.userInput?e.userInput:e.currentPage},on:{input:e.handleInput,change:e.currentChange}}),e._v(\" \"),t(\"span\",[e._v(e._s(e.t(\"PAGINATION_GOTO_SUFFIX\")))])],1):e._e()])},t.xk=[]},3681:function(e,t){\"use strict\";t.xk=t.sY=void 0,t.sY=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"tk-submit\"},[t(\"div\",{staticClass:\"tk-row\"},[t(\"tk-avatar\",{attrs:{config:e.config,mail:e.mail}}),e._v(\" \"),t(\"div\",{staticClass:\"tk-col\"},[t(\"tk-meta-input\",{attrs:{nick:e.nick,mail:e.mail,link:e.link,config:e.config},on:{update:e.onMetaUpdate}}),e._v(\" \"),t(\"el-input\",{ref:\"textarea\",staticClass:\"tk-input\",attrs:{type:\"textarea\",\"show-word-limit\":\"\",placeholder:e.commentPlaceholder,autosize:{minRows:3},maxlength:e.maxLength},on:{input:e.onCommentInput},nativeOn:{keyup:function(t){return!t.type.indexOf(\"key\")&&e._k(t.keyCode,\"enter\",13,t.key,\"Enter\")?null:e.onEnterKeyUp(t)}},model:{value:e.comment,callback:function(t){e.comment=t},expression:\"comment\"}})],1)],1),e._v(\" \"),t(\"div\",{staticClass:\"tk-row actions\"},[t(\"div\",{staticClass:\"tk-row-actions-start\"},[t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"true\"===e.config.SHOW_EMOTION,expression:\"config.SHOW_EMOTION === 'true'\"},{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.closeOwo,expression:\"closeOwo\"}],ref:\"owo\",staticClass:\"tk-submit-action-icon OwO\",domProps:{innerHTML:e._s(e.iconEmotion)}}),e._v(\" \"),t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"true\"===e.config.SHOW_IMAGE,expression:\"config.SHOW_IMAGE === 'true'\"}],staticClass:\"tk-submit-action-icon\",domProps:{innerHTML:e._s(e.iconImage)},on:{click:e.openSelectImage}}),e._v(\" \"),t(\"input\",{ref:\"inputFile\",staticClass:\"tk-input-image\",attrs:{type:\"file\",accept:\"image/*\",value:\"\"},on:{change:e.onSelectImage}}),e._v(\" \"),t(\"div\",{staticClass:\"tk-error-message\"},[e._v(e._s(e.errorMessage))])]),e._v(\" \"),t(\"a\",{staticClass:\"tk-submit-action-icon __markdown\",attrs:{alt:\"Markdown is supported\",href:\"https://guides.github.com/features/mastering-markdown/\",target:\"_blank\",rel:\"noopener noreferrer\"},domProps:{innerHTML:e._s(e.iconMarkdown)}}),e._v(\" \"),e.replyId?t(\"el-button\",{staticClass:\"tk-cancel\",attrs:{size:\"small\"},on:{click:e.cancel}},[e._v(e._s(e.t(\"SUBMIT_CANCEL\")))]):e._e(),e._v(\" \"),t(\"el-button\",{staticClass:\"tk-preview\",attrs:{size:\"small\"},on:{click:e.preview}},[e._v(e._s(e.t(\"SUBMIT_PREVIEW\")))]),e._v(\" \"),t(\"el-button\",{staticClass:\"tk-send\",attrs:{type:\"primary\",size:\"small\",disabled:!e.canSend},on:{click:e.send}},[e._v(e._s(e.isSending?e.t(\"SUBMIT_SENDING\"):e.t(\"SUBMIT_SEND\")))])],1),e._v(\" \"),e.isPreviewing?t(\"div\",{ref:\"comment-preview\",staticClass:\"tk-preview-container\",domProps:{innerHTML:e._s(e.commentHtml)}}):e._e()])},t.xk=[]},8666:function(e,t){\"use strict\";t.Z=function(e,t){for(var n=[],r={},i=0;i=0&&Math.floor(t)===t&&isFinite(e)}function _(e){return l(e)&&\"function\"==typeof e.then&&\"function\"==typeof e[\"catch\"]}function y(e){return null==e?\"\":Array.isArray(e)||m(e)&&e.toString===g?JSON.stringify(e,null,2):String(e)}function b(e){var t=parseFloat(e);return isNaN(t)?e:t}function k(e,t){for(var n=Object.create(null),r=e.split(\",\"),i=0;i-1)return e.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function A(e,t){return x.call(e,t)}function C(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var D=/-(\\w)/g,I=C((function(e){return e.replace(D,(function(e,t){return t?t.toUpperCase():\"\"}))})),O=C((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),S=/\\B([A-Z])/g,T=C((function(e){return e.replace(S,\"-$1\").toLowerCase()})),M=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function N(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function P(e,t){for(var n in t)e[n]=t[n];return e}function F(e){for(var t={},n=0;n0;X&&X.indexOf(\"android\");var te=X&&/iphone|ipad|ipod|ios/.test(X);X&&/chrome\\/\\d+/.test(X),X&&/phantomjs/.test(X);var ne,re=X&&X.match(/firefox\\/(\\d+)/),ie={}.watch,oe=!1;if(Y)try{var ae={};Object.defineProperty(ae,\"passive\",{get:function(){oe=!0}}),window.addEventListener(\"test-passive\",null,ae)}catch(s){}var se=function(){return void 0===ne&&(ne=!Y&&\"undefined\"!=typeof n.g&&n.g.process&&\"server\"===n.g.process.env.VUE_ENV),ne},ue=Y&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ce(e){return\"function\"==typeof e&&/native code/.test(e.toString())}var le,de=\"undefined\"!=typeof Symbol&&ce(Symbol)&&\"undefined\"!=typeof Reflect&&ce(Reflect.ownKeys);le=\"undefined\"!=typeof Set&&ce(Set)?Set:function(){function e(){(0,i[\"default\"])(this,e),this.set=Object.create(null)}return(0,o[\"default\"])(e,[{key:\"has\",value:function(e){return!0===this.set[e]}},{key:\"add\",value:function(e){this.set[e]=!0}},{key:\"clear\",value:function(){this.set=Object.create(null)}}]),e}();var fe=null;function pe(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;e||fe&&fe._scope.off(),fe=e,e&&e._scope.on()}var he=function(){function e(t,n,r,o,a,s,u,c){(0,i[\"default\"])(this,e),this.tag=t,this.data=n,this.children=r,this.text=o,this.elm=a,this.ns=void 0,this.context=s,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=n&&n.key,this.componentOptions=u,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=c,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return(0,o[\"default\"])(e,[{key:\"child\",get:function(){return this.componentInstance}}]),e}(),ge=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:\"\",t=new he;return t.text=e,t.isComment=!0,t};function me(e){return new he(void 0,void 0,void 0,String(e))}function ve(e){var t=new he(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var _e=0,ye=[],be=function(){function e(){(0,i[\"default\"])(this,e),this._pending=!1,this.id=_e++,this.subs=[]}return(0,o[\"default\"])(e,[{key:\"addSub\",value:function(e){this.subs.push(e)}},{key:\"removeSub\",value:function(e){this.subs[this.subs.indexOf(e)]=null,this._pending||(this._pending=!0,ye.push(this))}},{key:\"depend\",value:function(t){e.target&&e.target.addDep(this)}},{key:\"notify\",value:function(e){for(var t=this.subs.filter((function(e){return e})),n=0,r=t.length;n2&&arguments[2]!==undefined&&arguments[2];if((0,i[\"default\"])(this,e),this.value=t,this.shallow=n,this.mock=r,this.dep=r?Se:new be,this.vmCount=0,W(t,\"__ob__\",this),u(t)){if(!r)if(Z)t.__proto__=Ae;else for(var o=0,a=Ce.length;o"}],"posts":[{"title":"【知识笔记】机器人操作系统","slug":"Note-ROS","date":"2026-03-04T14:08:49.000Z","updated":"2026-03-04T14:16:19.001Z","comments":true,"path":"2026/03/Note-ROS/","permalink":"https://hongliu.icu/2026/03/Note-ROS/","excerpt":"","text":"内容:机器人操作系统 使用课本:无 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码3508 ROS_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets完整各科笔记可前往Github笔记仓库查看 下面提供部分笔记预览。","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"机器人","slug":"机器人","permalink":"https://hongliu.icu/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA/"},{"name":"计算机","slug":"计算机","permalink":"https://hongliu.icu/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"}]},{"title":"【知识笔记】数据结构与算法","slug":"Note-shusuan","date":"2026-03-03T15:08:57.000Z","updated":"2026-03-03T15:15:45.387Z","comments":true,"path":"2026/03/Note-shusuan/","permalink":"https://hongliu.icu/2026/03/Note-shusuan/","excerpt":"","text":"内容:数据结构与算法 使用课本:《数据结构——C语言描述》;ISBN 978-7-5606-6301-2 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码3508 数算_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets完整各科笔记可前往Github笔记仓库查看 下面提供部分笔记预览。","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"},{"name":"计算机","slug":"计算机","permalink":"https://hongliu.icu/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"}]},{"title":"【知识笔记】数字电子技术基础","slug":"Note-shudian","date":"2026-02-24T07:58:32.000Z","updated":"2026-03-03T15:13:23.302Z","comments":true,"path":"2026/02/Note-shudian/","permalink":"https://hongliu.icu/2026/02/Note-shudian/","excerpt":"","text":"内容:数字电路技术基础 使用课本:《数字电子技术基础》;ISBN 978-7-5606-5618-2 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码3508 数电_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets完整各科笔记可前往Github笔记仓库查看 下面提供部分笔记预览。","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"},{"name":"数电","slug":"数电","permalink":"https://hongliu.icu/tags/%E6%95%B0%E7%94%B5/"}]},{"title":"纪念三位不再见的老师","slug":"My-Teachers","date":"2026-02-17T09:19:48.000Z","updated":"2026-02-17T09:44:39.462Z","comments":true,"path":"2026/02/My-Teachers/","permalink":"https://hongliu.icu/2026/02/My-Teachers/","excerpt":"","text":"我想用这篇文章讲述三位在我的记忆中深刻的老师,或者说我和他们的已经成为过去的现实。更多是我的回忆,但也许是一点纪念。 国际象棋-谢老师大概是在小学一年级左右,我的父母带领我第一次来到谢老师的潮州市国际象棋培训中心,尝试国际象棋培训班。经由拥挤的吉怡路和带着新鲜混乱气味的菜市场,令我对这里感到独特的,是培训中心散发着的木质气味,或许来自于简单装修使用的三合板,或来自于一套套木质国际象棋散发出来的真木头味道,或二楼楼上观音像前总是点着的香的味道,或者谢老师和家长总是燃起的香烟,总之,这款奇妙的木质香味始终伴随着我在这里的时间。也是我对于国际象棋最有特征和回忆的味道。这个晚上,我和诸多年纪相仿的陌生朋友一起上完了第一节课,然后和爸妈说“好”,自主又不自主地开始了国际象棋的学习。 谢老师的教学,特别是针对这样的一群刚刚学龄的儿童,一定是合理且尽职尽责的。但比起怎样的教学方式,他所教授的更多的是所谓“棋德”。大家对于中国象棋的印象往往是公园或广场里的一群老头,彼此指指点点以至于直接抢棋代下,但这在这里截然不同。“落子无悔”“落地生根”“观棋不语”,谢老师从最初的几节课就开始持续规训着这些守则,其比社会的各种礼貌守则对我来说更早输入。这是微不足道的,这是难能可贵的。 我在国象的道路上成长不慢。虽然没有像那些最好的学生那样快速跃升到一级棋手、大师称号级别,更没有因此给我带来什么真正值得功利系统去评价的比赛荣誉或者什么升学功用,但讨论这些东西对于一个小学初中的孩子未免太早,也太庸俗。不管世界到底是不是俗套的,国际象棋带我在学习的几年时间中,令我十分有幸从潮州这个省尾国角的三线小城,来到广州、深圳、珠海、佛山等珠三角城市,窥见世界的更广阔一角。国际象棋这个在中国八分冷门一分高端的棋类运动,这样通过缘分和概率改变了一个小城市孩子的视野。2019年,经过广州黄埔的一次比赛,我被认证为三级棋士,这是我至今最后一次参加正式国象比赛。 后来,我和家里慢慢地不再把国际象棋作为一个全力去推进的技能,再后来,因为各种原因,我停下了国际象棋培训班。谢老师此时已经渐渐越来越多受到疾病的困扰,腰上挂起了带有医院味道的袋子。在这培训生活末期的有一天,谢老师招呼我和他下棋,他的棋力已经不如我这个业余棋手,他沉默不语,有时悔棋撤回,但一盘或者两盘,我取得了赢棋。我和谢老师的直接对话很少,我现在也不知他的身体与精神最后到了怎么样的地步,但那时的我走出象棋教室,和爸宣告了我的胜利。 再后来有一天,爸在微信发了一条消息,谢老师已因癌症去世。 国际象棋是一项我能够掌握的技能或者运动,我也乐意运行其中,但触手可得的经常是最遥远的。离开了谢老师的培训班之后,没有比赛也没有作为业余爱好,我在好几年的时间里完全没有再碰到国际象棋。 现在是2026年,可能是某种旧事的感召,或是探索过程中必然但令人神奇的回头路,我在这个学期末重新回到了国象联盟和lichess的在线棋盘,“回坑”了国际象棋,当然,这是作为业余娱乐。历史总是被看到是一个圈,但是这样上升的螺旋让我们总是和自己的故人故事重逢。 愿为潮郡育英才 金中-化学-黄老师从初中接触化学开始,就一直对于化学这门学科比较感兴趣。这可能和我遇到的化学老师都质量很高有关。初三做了化学课代表,高一也是,加入了探索实验社化学组,这是另一个令我总是魂牵梦萦的故事。 高一-下,初夏或者大概很热的一个夏天,时任我的化学老师的黄老师在高一教学楼走廊叫住了我,问我是否有意愿参加化学竞赛。我没有参加过学科竞赛。潮州市金山中学也完全没有任何竞赛培养体系,学生报了竞赛,就只是自行看书然后年复一年地去参加初赛送死,基本是这样的。但是在前几天,听说了化学竞赛报名的事情之后,我还是想去参与看看,但是不知道难度,不知道学习路径,不敢报名。直到黄老师主动问我。过了一个晚上,我和他说我要报名。 后续并没有什么奇迹发生,报名的时候距离初赛只有大概三个月了,中间暑假两个月也什么都没干,开学一个月内我尽一个新高二生的能力翻来翻去几本大学教材,然后在九月或十月的一天,坐上前往省城的大巴,坐一上午车到了广州,第二天于广州二中考了初赛就回潮了。最终获得了省三,作为参与过化竞但没有什么卵用的证明。 高二的时候换了一个化学老师,我再也没见过黄老师,后来知道他走了。第二年我又报名了化学竞赛,同样的短时间突击和广州二中,这一年我获得了省二,不过也没什么用。但,和国际象棋赛事一样,化学竞赛在我的高中生活中是一种调剂,顶着一个正经比赛的名号,可以使我部分逃逸于学业压力或者各种烦恼的事情之外,还能看看广州大城市,和大城市漂亮的高中。2023年,我开始正式就读于自动化类专业,这之后我与化学也没什么联系了。但是有些故事和情感可以跨越专业之类的分隔,存在心里。 金中-语文-杨老师其实我和杨老师的交集只有他来代过的一节课,他是一个高中语文老师,一个很特别的老师。他有一副大胡子,有古人风范,言思皆是飘逸的主义乃至暴论。我不太记得代课的那40分钟他讲了什么,更多地,是从其他人的讨论中了解了他,和下面附上的他的这篇文章。 后来有一天,听说他自杀了。 还学生一片真正的蓝天 End一个人死了,或许会有四面八方微小的怀念;这座小城里的人走了,并不会有如歌似泣的挽歌。只剩下微信里永远再不说话的账号,以及记忆与印象。只有他们来过的痕迹,说明了他们来过。 今天是2026年农历大年初一,这篇文章从大约一两周前冒出想法,今天完工了。明天我要去深圳旅行,两周后我要继续去西安读书。“我要去寻找属于我的美妙人生了”。 写于 2026-02-17","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/tags/%E6%9D%82%E8%B0%88/"},{"name":"回忆","slug":"回忆","permalink":"https://hongliu.icu/tags/%E5%9B%9E%E5%BF%86/"}]},{"title":"新年快乐!","slug":"Happy-NewYear-2026","date":"2026-02-16T17:09:42.000Z","updated":"2026-02-16T17:11:43.765Z","comments":true,"path":"2026/02/Happy-NewYear-2026/","permalink":"https://hongliu.icu/2026/02/Happy-NewYear-2026/","excerpt":"","text":"新年快乐!新年快乐。","categories":[{"name":"日常","slug":"日常","permalink":"https://hongliu.icu/categories/%E6%97%A5%E5%B8%B8/"}],"tags":[{"name":"生活","slug":"生活","permalink":"https://hongliu.icu/tags/%E7%94%9F%E6%B4%BB/"},{"name":"新年","slug":"新年","permalink":"https://hongliu.icu/tags/%E6%96%B0%E5%B9%B4/"}]},{"title":"Lichess实时数据显示","slug":"Lichess-Data","date":"2026-02-06T08:38:48.000Z","updated":"2026-02-06T08:48:45.801Z","comments":true,"path":"2026/02/Lichess-Data/","permalink":"https://hongliu.icu/2026/02/Lichess-Data/","excerpt":"","text":".lichess-card { max-width: 800px; margin: 30px auto; padding: 24px; border: 1px solid #e5e7eb; border-radius: 12px; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); background: #fff; font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif; position: relative; overflow: hidden; } .lichess-card::before { content: ''; position: absolute; top: 20px; right: 20px; width: 350px; height: 350px; background-image: url('/image/Lichess-Data/lichess_logo2.png'); background-size: contain; background-repeat: no-repeat; background-position: center; opacity: 0.2; pointer-events: none; z-index: 0; } .lichess-card h2 { margin: 0 0 16px; font-size: 24px; color: #111827; position: relative; z-index: 1; } .lichess-section { margin: 24px 0; padding: 20px; background: rgba(249, 250, 251, 0.55); border-radius: 10px; border-left: 4px solid #111827; position: relative; z-index: 1; } .lichess-section-title { font-size: 18px; font-weight: 600; color: #111827; margin: 0 0 16px; display: flex; align-items: center; gap: 8px; } .lichess-info { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; } .lichess-item { padding: 12px; background: #fff; border-radius: 8px; border: 1px solid #e5e7eb; } .lichess-label { font-size: 12px; color: #6b7280; margin-bottom: 4px; } .lichess-value { font-size: 20px; font-weight: 600; color: #111827; } .lichess-highlight { color: #059669; } .lichess-online-badge { display: inline-block; padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 600; background: #10b981; color: white; } .lichess-offline-badge { display: inline-block; padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 600; background: #6b7280; color: white; } .lichess-chart { margin: 16px 0; padding: 16px; background: #fff; border-radius: 8px; } .lichess-game { padding: 16px; background: #fff; border-radius: 8px; border: 1px solid #e5e7eb; margin-bottom: 12px; display: flex; gap: 16px; align-items: stretch; } .lichess-game-info { flex: 1; display: flex; flex-direction: column; justify-content: space-between; } .lichess-game-board { width: 120px; height: 120px; flex-shrink: 0; overflow: hidden; } .lichess-game-board img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 0 !important; } .lichess-game-result { font-weight: 600; padding: 8px; border-radius: 4px; font-size: 16px; display: flex; align-items: center; justify-content: center; min-width: 40px; flex-shrink: 0; } .lichess-game-win { background: #d1fae5; color: #065f46; } .lichess-game-loss { background: #fee2e2; color: #991b1b; } .lichess-game-draw { background: #e5e7eb; color: #374151; } .lichess-status { text-align: center; padding: 12px; color: #6b7280; font-size: 14px; } .lichess-link { display: inline-block; margin-top: 16px; padding: 10px 20px; background: #111827; color: #fff; text-decoration: none; border-radius: 8px; font-size: 14px; } .lichess-link:hover { background: #374151; } ♞ Lichess 账户数据 加载中... (function() { const username = \"HongLiu\"; const statusEl = document.getElementById(\"lichess-status\"); const contentEl = document.getElementById(\"lichess-content\"); async function loadData() { try { const res = await fetch(\"https://lichess.org/api/user/\" + username); if (!res.ok) throw new Error(\"请求失败\"); const data = await res.json(); statusEl.style.display = \"none\"; const winRate = data.count?.rated ? ((data.count.win / data.count.rated) * 100).toFixed(1) : 0; const html = ` 👤 基本信息 用户名 ${data.username} 国家/地区 ${data.profile?.flag || \"🌍\"} 账户创建 ${new Date(data.createdAt).toLocaleDateString(\"zh-CN\")} 最后在线 ${new Date(data.seenAt).toLocaleDateString(\"zh-CN\")} 总游戏时长 ${Math.floor((data.playTime?.total || 0) / 3600)}小时 ${Math.floor(((data.playTime?.total || 0) % 3600) / 60)}分 主页链接 访问主页 → 📊 对局统计 总对局数 ${data.count?.all || 0} 计分对局 ${data.count?.rated || 0} 胜局 ${data.count?.win || 0} 负局 ${data.count?.loss || 0} 和局 ${data.count?.draw || 0} 胜率 ${winRate}% 🏆 等级分 快棋 Rapid ${data.perfs?.rapid?.rating || \"未评级\"} ${data.perfs?.rapid ? ` 对局: ${data.perfs.rapid.games || 0} | 偏差: ${data.perfs.rapid.rd || 0} | 变化: ${data.perfs.rapid.prog > 0 ? '+' : ''}${data.perfs.rapid.prog || 0} ` : ''} 谜题 Puzzle ${data.perfs?.puzzle?.rating || \"未评级\"} ${data.perfs?.puzzle ? ` 题量: ${data.perfs.puzzle.games || 0} | 偏差: ${data.perfs.puzzle.rd || 0} | 变化: ${data.perfs.puzzle.prog > 0 ? '+' : ''}${data.perfs.puzzle.prog || 0} ` : ''} 📈 等级分历史 ♟️ 最近对局 加载中... `; contentEl.innerHTML = html; loadRatingHistory(); loadRecentGames(); } catch (err) { statusEl.textContent = \"加载失败:\" + err.message; statusEl.style.color = \"#ef4444\"; } } async function loadRatingHistory() { try { const res = await fetch(\"https://lichess.org/api/user/\" + username + \"/rating-history\"); const history = await res.json(); const rapidData = history.find(h => h.name === \"Rapid\"); const puzzleData = history.find(h => h.name === \"Puzzle\"); const twoWeeksAgo = new Date(); twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14); const filterRecent = (points) => { return points.filter(p => { const pointDate = new Date(p[0], p[1], p[2]); return pointDate >= twoWeeksAgo; }); }; const datasets = []; const allLabels = new Set(); if (rapidData && rapidData.points.length) { const recentRapid = filterRecent(rapidData.points); if (recentRapid.length) { recentRapid.forEach(p => allLabels.add(`${p[0]}-${String(p[1]+1).padStart(2,'0')}-${String(p[2]).padStart(2,'0')}`)); datasets.push({ label: '快棋', data: recentRapid.map(p => ({x: `${p[0]}-${String(p[1]+1).padStart(2,'0')}-${String(p[2]).padStart(2,'0')}`, y: p[3]})), borderColor: '#111827', backgroundColor: 'rgba(17, 24, 39, 0.1)', tension: 0 }); } } if (puzzleData && puzzleData.points.length) { const recentPuzzle = filterRecent(puzzleData.points); if (recentPuzzle.length) { recentPuzzle.forEach(p => allLabels.add(`${p[0]}-${String(p[1]+1).padStart(2,'0')}-${String(p[2]).padStart(2,'0')}`)); datasets.push({ label: '谜题', data: recentPuzzle.map(p => ({x: `${p[0]}-${String(p[1]+1).padStart(2,'0')}-${String(p[2]).padStart(2,'0')}`, y: p[3]})), borderColor: '#059669', backgroundColor: 'rgba(5, 150, 105, 0.1)', tension: 0 }); } } if (datasets.length === 0) { document.querySelector('.lichess-chart').innerHTML = '近两周无等级分变化'; return; } const sortedLabels = Array.from(allLabels).sort(); const ctx = document.getElementById('rating-chart'); new Chart(ctx, { type: 'line', data: { labels: sortedLabels, datasets: datasets }, options: { responsive: true, plugins: { legend: { display: true, position: 'top' } }, scales: { y: { beginAtZero: false } } } }); } catch (err) { document.querySelector('.lichess-chart').innerHTML = '加载失败'; } } async function loadRecentGames() { try { const res = await fetch(\"https://lichess.org/api/games/user/\" + username + \"?max=3&moves=false&opening=false\", { headers: { 'Accept': 'application/x-ndjson' } }); if (!res.ok) throw new Error(\"请求失败: \" + res.status); const text = await res.text(); if (text.length === 0 || text.trim().length === 0) { document.getElementById('recent-games').innerHTML = ` 无法获取对局记录 可能原因:对局记录未公开或API限制 `; return; } const lines = text.trim().split('\\n').filter(line => line.trim()); if (lines.length === 0) { document.getElementById('recent-games').innerHTML = '暂无对局记录'; return; } const gamesHtml = []; for (let i = 0; i < Math.min(3, lines.length); i++) { try { const gameData = JSON.parse(lines[i]); const isWhite = gameData.players.white.user?.id.toLowerCase() === username.toLowerCase(); const opponent = isWhite ? gameData.players.black : gameData.players.white; const myColor = isWhite ? 'white' : 'black'; let result = 'draw'; let resultText = '和'; if (gameData.winner) { result = gameData.winner === myColor ? 'win' : 'loss'; resultText = result === 'win' ? '胜' : '负'; } const resultClass = `lichess-game-${result}`; const opponentName = opponent.user?.name || opponent.user?.id || '匿名'; const opponentRating = opponent.rating || '?'; const speed = gameData.speed || '未知'; const date = new Date(gameData.createdAt).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }); const myPlayer = isWhite ? gameData.players.white : gameData.players.black; const ratingDiff = myPlayer.ratingDiff || 0; const ratingDiffText = ratingDiff > 0 ? `+${ratingDiff}` : ratingDiff; const statusMap = { 'mate': '将杀', 'resign': '认输', 'stalemate': '逼和', 'timeout': '超时', 'draw': '和棋', 'outoftime': '超时', 'cheat': '作弊', 'noStart': '未开始', 'unknownFinish': '异常结束', 'variantEnd': '变体结束' }; const statusText = statusMap[gameData.status] || gameData.status || '未知'; gamesHtml.push(` 对手:${opponentName} (${opponentRating}) ${speed} · ${statusText} · ${date} 等级分: ${ratingDiffText} 查看棋局 → ${resultText} `); } catch (parseErr) { // 跳过解析失败的对局 } } if (gamesHtml.length > 0) { document.getElementById('recent-games').innerHTML = gamesHtml.join(''); } else { document.getElementById('recent-games').innerHTML = '加载失败'; } } catch (err) { document.getElementById('recent-games').innerHTML = `加载失败: ${err.message}`; } } loadData(); })(); 📌 数据来源说明 本页面数据通过 Lichess Public API 实时获取,使用的接口包括: GET /api/user/{username} - 用户基本信息与等级分数据 GET /api/user/{username}/rating-history - 等级分历史数据(用于图表生成) GET /api/games/user/{username} - 用户对局记录 https://lichess1.org/game/export/png/{gameId}.png - 对局棋盘图片导出 图表生成:Chart.js v4.4.0 | 数据更新:页面加载时自动获取 | Lichess Logo © Lichess.org","categories":[{"name":"其他","slug":"其他","permalink":"https://hongliu.icu/categories/%E5%85%B6%E4%BB%96/"}],"tags":[{"name":"国际象棋","slug":"国际象棋","permalink":"https://hongliu.icu/tags/%E5%9B%BD%E9%99%85%E8%B1%A1%E6%A3%8B/"}]},{"title":"【知识笔记】自动控制原理","slug":"Note-zikong","date":"2026-02-01T16:43:45.000Z","updated":"2026-02-01T16:57:09.808Z","comments":true,"path":"2026/02/Note-zikong/","permalink":"https://hongliu.icu/2026/02/Note-zikong/","excerpt":"","text":"内容:自动控制原理 使用课本:《自动控制理论》;ISBN 978-7-111-39697-0 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码3508 自控_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets 下面提供部分笔记预览。","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"控制","slug":"控制","permalink":"https://hongliu.icu/tags/%E6%8E%A7%E5%88%B6/"}]},{"title":"【知识笔记】传感器与检测技术","slug":"Note-chuanganqi","date":"2026-01-03T09:17:49.000Z","updated":"2026-01-14T09:00:58.336Z","comments":true,"path":"2026/01/Note-chuanganqi/","permalink":"https://hongliu.icu/2026/01/Note-chuanganqi/","excerpt":"","text":"内容:传感器与检测技术 使用课本:《传感器与检测技术》;ISBN 978-7-302-23044-1 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码3508 传感器_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets 下面提供部分笔记预览。","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"}]},{"title":"【日常】元旦游记","slug":"Sce-20260101","date":"2026-01-02T09:45:07.000Z","updated":"2026-01-03T09:16:22.710Z","comments":true,"path":"2026/01/Sce-20260101/","permalink":"https://hongliu.icu/2026/01/Sce-20260101/","excerpt":"","text":"2025年的最后一天,下大雪了2025年的最后一天,西安的雪没有像之前无数次一样地爽约,而是在早上由雨转雪,越下越大,下了一整天。冷倒是不很冷,中午上完了最后一节数据机构,同时也是这学期最后一节课之后,绕着师生服务中心玩了一圈雪,拍了一圈照。就是玩久了确实很冷。下到晚上越来越厚,草地上全覆盖满了一层,还把试验场的防晒网清理走了,防止积雪。 早上起床和中午睡觉的时候一直在想,元旦到底要怎么过,到最后没做什么特别有准备的事,只是自然而然看看这看看那。不过这样自然的生活比起前阵子各种忙,已经是天堂了。也挺好,写写日记写写文档,再随缘出去吧。 元旦西电半部电台在长安公园搞了个通联活动,但是好远,于是懒得去了。 2026元旦游记元旦一觉睡到了中午,下午想了想,打算再吃一次上回桥梓口附近的那家潮汕粿条汤(好吃),然后顺便把上次没去成的广仁寺逛了。 去到门口发现排起了队,但是好在移动地很快,门口还送了暖手宝和金刚结(出来还送了书签),内部不特别大,但是挺好看的,名副其实。 最后晚饭还是去吃了粿条汤。我吃两碗😋 ……果然还是喜欢独自外出游玩啊。 (阮籍)时率意独驾,不由径路,车迹所穷,辄恸哭而反。 《晋书·阮籍传》","categories":[{"name":"日常","slug":"日常","permalink":"https://hongliu.icu/categories/%E6%97%A5%E5%B8%B8/"}],"tags":[{"name":"生活","slug":"生活","permalink":"https://hongliu.icu/tags/%E7%94%9F%E6%B4%BB/"},{"name":"西安","slug":"西安","permalink":"https://hongliu.icu/tags/%E8%A5%BF%E5%AE%89/"},{"name":"新年","slug":"新年","permalink":"https://hongliu.icu/tags/%E6%96%B0%E5%B9%B4/"}]},{"title":"【开源】PCB怪板子分享","slug":"PCB-weird-XD","date":"2025-12-26T07:48:32.000Z","updated":"2025-12-26T07:53:38.502Z","comments":true,"path":"2025/12/PCB-weird-XD/","permalink":"https://hongliu.icu/2025/12/PCB-weird-XD/","excerpt":"","text":"整理了自己制作的各种没有任何实际作用或者有一点实际作用但是作用不大只能做摆件的PCB设计,或者说各种PCB怪板子,开源分享到了Github上。 开源链接:PCB-weird-XD 本贴用于展示下各型板子,更详细的图片和文字介绍在github仓库中。 「兄啊,给我物板傻风牌的PCB」 「下两颗100nF、三个TypeC、四条陶瓷灯丝」 「再放个怪浪怪浪的丝印」 迷迭香NO WIS’ADEL 便携安全出口指示牌Exit 小夜灯VGD_light Keil牌牌 大炎通宝(制作中) VGD圣诞树NFC板 发布于2025/09/30修改于2025/12/26","categories":[{"name":"技术文档","slug":"技术文档","permalink":"https://hongliu.icu/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"}],"tags":[{"name":"硬件","slug":"硬件","permalink":"https://hongliu.icu/tags/%E7%A1%AC%E4%BB%B6/"},{"name":"开源","slug":"开源","permalink":"https://hongliu.icu/tags/%E5%BC%80%E6%BA%90/"}]},{"title":"【日常】大明宫遗址公园","slug":"Sce-Daminggong","date":"2025-11-16T16:05:52.000Z","updated":"2025-11-17T12:46:16.740Z","comments":true,"path":"2025/11/Sce-Daminggong/","permalink":"https://hongliu.icu/2025/11/Sce-Daminggong/","excerpt":"","text":"15号去了大明宫遗址公园。 丹凤门 原野 玄武门 粿条汤 整理于2025/11/17","categories":[{"name":"日常","slug":"日常","permalink":"https://hongliu.icu/categories/%E6%97%A5%E5%B8%B8/"}],"tags":[{"name":"生活","slug":"生活","permalink":"https://hongliu.icu/tags/%E7%94%9F%E6%B4%BB/"},{"name":"西安","slug":"西安","permalink":"https://hongliu.icu/tags/%E8%A5%BF%E5%AE%89/"}]},{"title":"【HAM】业余无线电入坑实录","slug":"Daily-HAM","date":"2025-11-08T14:36:12.000Z","updated":"2026-02-01T17:00:27.105Z","comments":true,"path":"2025/11/Daily-HAM/","permalink":"https://hongliu.icu/2025/11/Daily-HAM/","excerpt":"","text":"简介前几天考了A证操作证,今天操作证编号到了,开始搞设台的事情,于是开了本文章用于记录自己在业余无线电方面的日程经历。 操作证考试-25.11.8大概高中的时候就对业余无线电略有耳闻,这学期上来发现身边一堆HAM于是多了解了下业余无线电这个圈子,听说考试难度不高决定考个A证试试水玩一下。报了25年下半年西安的A证考试。 直到考前两天才开始刷题,刷题用的是微信小程序“业余无线电工具集”,体验还行。刷完直接去考试了,去了发现考完等半小时可以当场看成绩,以39/40的成绩过了=) 首次SSTV接收(from BA3PT)&首次通联(客席BI9CMB)-25.11.10考完试买的UVK6差不多也到了,到了其实不知道玩什么,正好BA3PT在学校里开了个SSTV接收活动,于是第一次尝试了接收和通联。 频率:438.1MHz模式:SSTV-robot36编码设备:泉盛UVK6,橡胶天线 然后当晚用BI9CMB的呼号和BA3PT进行了第一次通联,好玩=) 设台-25.11.17考完证就该设台了,据说西安设台贼慢要好几个月,于是找了BI7KHI,看了他的指南,填报申请了广州的设台,据说是三天左右能解决。 最终填报的潮州的设台审理,可能小城市原因速度极快,17号中午填的信息下午就给我两小时速通了,获得重要道具之呼号 BG7OFD XD 注册了QRZ网站账号。 QSL卡设计-25.11.23画了QSL卡。 首次卫星SSTV接收-RS40S-25.11.29通过推文了解到了信息,在29号晚九点半左右成功使用原装天线就收到了基本可用的图像,虽然有一些噪声。 频率:437.625 MHz模式:SSTV-robot36编码设备:设备:泉盛UVK6,橡胶天线 不过后续还是想搞个八木天线试试…… 买了八木天线-26.2.2买了个U2V3的八木天线,测试了中继台OK,改天测测卫星SSTV和通联。 -本文持续更新- 最后更新于:2026-02-02","categories":[{"name":"日常","slug":"日常","permalink":"https://hongliu.icu/categories/%E6%97%A5%E5%B8%B8/"}],"tags":[{"name":"日志","slug":"日志","permalink":"https://hongliu.icu/tags/%E6%97%A5%E5%BF%97/"},{"name":"生活","slug":"生活","permalink":"https://hongliu.icu/tags/%E7%94%9F%E6%B4%BB/"},{"name":"HAM","slug":"HAM","permalink":"https://hongliu.icu/tags/HAM/"}]},{"title":"【知识笔记】机器人学基础-运动学","slug":"Note-robotics","date":"2025-10-27T09:39:49.000Z","updated":"2025-11-06T09:22:42.436Z","comments":true,"path":"2025/10/Note-robotics/","permalink":"https://hongliu.icu/2025/10/Note-robotics/","excerpt":"","text":"取自我的Obsidian笔记,因为最近在做一个机械臂的课设发现比较常用所以取出来发一篇。 完整的笔记开源:General-M-P-Base 位姿描述位置描述点P在直角坐标系A中的位置描述: 姿态描述坐标系在坐标系中的姿态描述: 位姿描述综合以上二者.$${B}={B^AR\\quad {}^AP{BO}}$$ 运动坐标系描述运动坐标系的坐标轴单位矢量常用表述,故有 坐标变换平移坐标变换已知点P在坐标系B中的坐标,则P在坐标系A中坐标: 旋转坐标变换已知点P在坐标系B中的坐标,则P在坐标系A中坐标: 平移+旋转坐标变换已知点P在坐标系B中的坐标,则P在坐标系A中坐标:$${}^AP={}B^AR^BP+{}^AP{BO}$$ 齐次变换上一式的齐次变换形式:其简记为:其中$$ {}_B^A\\boldsymbol{T}=\\begin{bmatrix}{}B^A\\boldsymbol{R}&{}^A\\boldsymbol{P}{B0}\\ 0&1\\end{bmatrix}$$ 称为齐次变换矩阵. 要记住的齐次变换矩阵 平移齐次变换矩阵 旋转齐次坐标矩阵 正运动学 连杆的编号 连杆0(机架)->关节1->连杆1->关节2->连杆2->…… D-H参数 连杆长度: 就是两轴之间公垂线长度 连杆转角: 关节轴之间绕公垂线旋转的角度 偏距: 公垂线之间的距离 关节角: 公垂线之间的夹角 在实际结构确定后,一个关节就只有一个变量,、都是不会变的;旋转关节中,是变量,移动关节中,是变量。 D-H方法D-H方法就是通过上述四个参量和变换矩阵来进行运动学解算的方法。 最重要的要背的,变换矩阵:$$i^{i-1}\\boldsymbol{T}=\\mathrm{Rot}(x,a{i-1})\\times\\mathrm{Trans}(x,a_{i-1,})\\times\\mathrm{Rot}(z,\\theta_i)\\times\\mathrm{Trans}(z,d_i)$$ $$i^{i-1}\\boldsymbol{T}=\\begin{bmatrix}c\\theta_i&-s\\theta_i&0&a{i-1}\\ s\\theta_ic\\alpha_{i-1}&c\\theta_ic\\alpha_{i-1}&-s\\alpha_{i-1}&-d_is\\alpha_{i-1}\\ s\\theta_is\\alpha_{i-1}&c\\theta_is\\alpha_{i-1}&c\\alpha_{i-1}&d_ic\\alpha_{i-1}\\ 0&0&0&1\\end{bmatrix}$$ 雅可比公式定义:机器人的操作速度与关节速度的线性变换. 记六自由度机器人的运动方程为:其中为操作空间,为关节空间.则雅可比矩阵关系式: 针对六自由度机器人改一下变量名称,则有:机器人雅可比矩阵或计算题的话直接代入即可. 动力学方程(只考拉格朗日法)静态特性与动态特性静态特性力和力矩 动态特性 稳定性主要涉及系统与性能过程中振动 空间分辨度和精度空间分辨度指明了系统能够区别工作空间所需要的最小运动增量。机器人精度包含: 各控制部件的分辨度 各机械部件的偏差 某个任意的从未接近的固定位置 重复性即前面提到过的重复定位精度,指机器人自身重复到达同一目标位置的能力 固有频率固有频率是指系统在收到外界激励产生运动时发生自然振动的频率","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"机器人学","slug":"机器人学","permalink":"https://hongliu.icu/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%AD%A6/"}]},{"title":"读《自造》","slug":"Book-Zizao","date":"2025-10-03T01:16:52.000Z","updated":"2025-10-03T04:02:29.981Z","comments":true,"path":"2025/10/Book-Zizao/","permalink":"https://hongliu.icu/2025/10/Book-Zizao/","excerpt":"","text":"再读自造第一次看到自造这本书是在高中同桌那里。陶勇是在2020年北京朝阳医院暴力伤医事件中双手和身体被重伤的医生,已与23年5月重新开始进行手术。我的同桌很仰慕他,多多少少有他的原因吧,现在就读于一医学院,在医学的道路上一步步前进。高中的时候这本书成了我上课摸鱼和课余时间很喜欢看的一本书,它的语言舒畅,意义深刻,借用很多医学知识和临床经验,发掘了陶勇医生在医学实践、人生经历中的各种世界观、人生观。在两年多后再读这本书,更多的经历带来了更多共鸣,大学更不健康的生活习惯也在阅读中得到更深攻击()。 这一次的阅读不是实体书,而是在微信读书上,利用各种水课或者可以水的专业课阅读的。和实体书不一样的阅读感受也还是比较舒适的,熟悉又有些陌生的文字依然闪烁光辉. 自造人生观这是这本书第九章的标题,也是这本书的一个核心(个人认为)。陶勇显然是一个理想主义者,我也希望自己是一个理想主义者。他用医学理想推进成长,又用社会实践和社交巩固自己的人生目标。读医绝对是苦的,但是他能乐在其中,这是他强大人生观的作用;一个人如果能真正热爱自己所做的事,我想可能是人生中最大的幸福。 德国有个伟大的社会学家韦伯,他是现代社会学的三大奠基人之一,提出过“除魅”的说法。古时候,科技并不发达,神鬼妖魔等“具备”超自然神秘力量的超验物体成为人们的信仰,它们就是“魅”。随着自然科学的日益发展,人们逐渐养成了理性的思维习惯,于是对于“魅”的神秘信仰便在不知不觉中被破除。可是,问题在于,科学本身又不能成为传统意义上的信仰,无法起到替代作用,于是人们便集体面临精神荒芜的境地。 面临“精神荒芜”而需要选择和相信的烦恼,是现代人幸福的烦恼。 在书的最后,有数封陶勇医生与许多人的书信记录。如同对坐长谈,或者一次思想深刻的博客,他以解答问题的方式回答着许多迷茫的人的人生问题——哪怕“迷茫”是始终且普适的,包括他自己。 心身一体另一个从医学方面解剖我们内心想法的一个点,是书中所谓“心身一体”,即心理现象往往是生理现象的表征,而生理现象也有可能由心理状态引发,或者,叫主客观同一。在N年如一日的奋斗中,我们往往容易只顾着努力而忽略自己的内心,把心理健康乃至生理健康忘却。特别是打RM的 熬夜加班,心情烦躁,回来和父母吵架、和爱人拌嘴,摔锅摔碗,转过头第二天,就认定自己没有修养,认为自己不好,其实就是吃些甜点、提升血糖,睡一个好觉的事。 陶勇警醒我的是,照顾好自己身体不仅是有益的,而且是必要的,不是什么矫揉造作。 有的时候身边人发怒烦躁,不一定是什么事情或者人出了问题,或许只是几个激素、一点情绪在作用。更扩展的想,自己或他人出现情绪异常,也犯不着立马要对线或者矫正,或许就是天性使然,根本没什么大事。比起冷静看待或者“不放心上”,无故恐慌带来的次生灾害有时候更加有杀伤性。 能吃能睡,没心没肺。 多面世界作为医生,陶勇接触了形形色色的病人和病人家属,这是他写作灵感的重要来源,也是读者(我)窥见世界的窗口。我看到了身怀疑难杂症依然像没事人一样的乐观夫妇,有在不幸中更加不幸的穷人,有心病的专家、富人……在这本书中,有一个世界的人在医院这个中转点,有时候是终点站,汇合,交互,然后离开。","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"读书笔记","slug":"读书笔记","permalink":"https://hongliu.icu/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"},{"name":"书籍","slug":"书籍","permalink":"https://hongliu.icu/tags/%E4%B9%A6%E7%B1%8D/"}]},{"title":"看《窗外是蓝星》","slug":"Film-Tiangong","date":"2025-09-20T14:30:01.000Z","updated":"2025-09-24T11:17:39.698Z","comments":true,"path":"2025/09/Film-Tiangong/","permalink":"https://hongliu.icu/2025/09/Film-Tiangong/","excerpt":"","text":"今天晚上看了以中国空间站为主题的纪录电影《窗外是蓝星》。非常优秀的一部作品,一部自信的电影。 剧透警示:本文会详尽地涉及很多影片具体内容,请慎阅。 零 观看之前晚上九点踩着点进的电影院,进去的时候正在播龙头电影标,有点极限。进了电影院的第一眼就感觉不妙了:放映厅疑似是机器设备极其落后了,画质非常糊,连字幕都快看不清,仿佛回到了神舟五号拍摄画面。厅里全是小孩,全程都在吵。谁能管管我不行了 总之,后面肯定会自己再看一遍的。虽然播放环境不行,但电影的优秀表现可以让我很大部分忽略这些不利影响。 我是很喜欢纪录片/纪录电影的,从小时候就喜欢看CCTV9纪录台。在电影院看过的纪录电影似乎比较少,印象中能想到一个《里斯本丸沉没》。《蓝星》这部片最开始是在B站刷到的预告片介绍,刷到的时候就很期待(很巧的是,在我的生日首映的)。在知乎刷到了讨论,刻意没有看太多避免剧透。比较可惜的是,并没有看过《十六次日出》等其他在太空中拍摄的电影。 一 框架结构和技术内容这是一部纪录电影。以神舟十三号乘组,在中国空间站进行的六个月在轨任务为全部内容,使用第一次上天进入中国空间站的8K摄影机记录。纪录电影意味着它注重记录客观事实,而生活往往是无趣的,于是纪录电影往往也不会有太多跌宕起伏。于是我更喜欢把观看纪录片放在类似于“日常番”的位置。 没有精心设计的故事不等于流水账,电影主要以发射-引入介绍-出舱活动-日常-地空联系-地面风光-归家这些事件为主要表述内容,每一部分都很丰富,娓娓道来(内容凭回忆,可能有顺序出入)。确实是一个优秀纪录片应该有的结构编排,相信是制作组在大量的前期素材中花费了很多时间才解决的。 使我感到意外的是镜头的设计和拍摄水平。我没有想到三位没有专门从事过摄影训练,不知道有没有以拍摄为爱好的航天员,可以拍摄出如此水平的镜头。据导演在知乎的分享所说,制作组与航天员们的见面仅一次两个小时课的摄影机使用课。除了基本的横平竖直、稳定镜头之外,电影中很多镜头并没有出现普通人使用相机时出现的“手持感”,而是很好地充当了纪录片摄影机“观察者”的位置。许多镜头有专门的设计,如静态场景下的特写镜头、相互衔接的镜头(蒙太奇)、舱内各种空镜头(很有感觉!)……太棒了,完全符合我对未来太空纪录片的想象 电影结合了少量的CG动画,效果很好,不是那种完全渲染到看不出来的仿真好,而是与影片的实拍部分、节奏、表达衔接的很好,仿佛这里原本就应当有一架摄影机在实拍。与之相反的一些CG表现,我想应当点名一些新闻播放中的神必火箭发射演示动画,和一些过于炫技喧宾夺主的好莱坞电影。 二 故事性/叙事节奏/情感表达分享下我观影过程中印象比较深的几个片段。 影片理所当然的是以神州十三号飞天作为影片的开始的。火箭升天总是比较震撼人心的,哪怕拍摄不是特别出彩。从发射前的无线电确认,到点火发射,到助推器分离的科罗廖夫十字,确实是航天影像常见的镜头,但是奠定了影片宏大的感情基调。 影片中期有一组通过玻璃窗特写地球各地景色的镜头,和抒情表达。拍摄的内容有祖国的河山:辽东半岛、青藏高原、福建山丘,也有许多其他国家的景色:安第斯山脉、非洲大陆、日本北海道。空间站的高度是一个恰到好处的距离,比航拍要高得多,所以它没有太多“现实”的细节,比《暗淡蓝点》、或美国登月拍摄的从月球反望地球又近得多,不会直接将其视作一个“蓝色玻璃球”。这是一个宏观和具体的中间点,能看到整片海洋反射处的镜面般的光芒,也能看到人类的城镇聚居点和农田在地面上展开成花纹。于是思绪能够从我们的真实,到航拍级的俯瞰,到空间站的详略,又延伸到一整个地球。这段中王亚平的旁白台词也恰到好处,不过分渲染所谓的“宏大”,而是让观众的眼睛自己看看这个世界。海波粼粼,镜光射天上宫阙;风云梦远,卫星掠人间万物。 我在这里没有看到国境线,只有地球。 影片的结尾有一段空镜头很有感觉。全片基本以乘组三人为拍摄主体,在影片最后却特意留出了一段空间站的空镜头特写,或许是航天员的有心设计。照常熙熙攘攘的空间站舱内此时空无一人,像是主人出门远游的房子,也像是小时候带着神秘气息的「零点」钟声敲响后安安静静的家里。 影片末尾神州十三号返回地面是一个比较燃的片段,同样使用了恰到好处的CG,地面的跟拍镜头则在冷静中表现出优质和激情的情绪。 王亚平和女儿「摘星星」的感情线,源自导演/宇航员的剧情设计,我并不觉得这样的故事性设计和表达是不合理的。哪怕是在纪录片中,也有《大猫传奇》这样的先例,将多只大猫的纪录影片相缝合和设计,构造出一只作为主题的「大猫」主角。所以我认为,通过剧情设计来表达宇航员的家人联结这一块,很好地展现了以王亚平为代表的航天人和世界的联系。 电影的旁白配音是由王亚平完成的。有一点刻意设计感,但不多;更多的还是王亚平从自己的视角,领略太空生活和太空风景,更像是一个普通人的视角,有“日常”感,同时也是自信感。 三 情感内核 以前的镜头前你们都是完美英雄,但这一次我们导演摄影都不会在你们身边,你们要自己拍出自己身上活生生的人情味。 ——导演在知乎的分享 叶光富给翟志刚剃头那块有点搞,不戳破笑点所以我不说了();不管是王亚平,还是东北大哥翟志刚和西南小哥叶光富,都有不少镜头展现他们和家人的视频联络;王亚平和女儿的情感线可能带了一点设计,但是表现效果很不错。这或许是中国的家庭联结吧。 航天员在微重力下的生活日常很有意思,在天宫课堂进行的各种演示也很有意思(当时还看了直播),传递了一种工作日常中诞生的美好。 影片的最后以一个混剪MAD结尾,记录了新中国航天几十年的历史时间轴,很意外,因为这样的形式似乎在网络流媒体上更常见。混剪的质量不算特别突出,但是放在了一个很好的位置,历史影像与前面最新的科技表现相呼应,中国航天几十年的进步不证自明。 四「宏大叙事」的正确表达 我们工地上 披上了节日的盛装 /正面写着八个大字:自力更生奋发图强/动作像舞蹈,声音像合唱/真是珠联璧合 天衣无缝/敢教泰山随手转 敢教日月换新天/ 《万吨水压机》 《万吨水压机》是一个上世纪六七十年代的著名相声作品,我引用它想表达的是,「传统宏大叙事」可以做得很好,很震撼人心,但同时经过多年洗礼,绝大多数人已经出现了严重的审美疲劳。关于“奉献精神”“团结精神”,人们并不是以绝对拥护的态度去接受。一个新的时代呼唤美,呼唤更细致入微的,更带有美学设计的宣传表达。对于宣传来讲,只有有效的才是正确的。 在这部影片中,虽然有传统官方宣传方式的残留,但我可以看到,这部电影没有以一个强行灌输各种伟大精神的方式填满它的内容,而是纯粹记录中国空间站的生活,又不那么纯粹,无可置疑地让中国航天这个坚实基础成为整个故事发生的背景。不提举国体制,但处处都映射着中国航天这个宏大团体的背后大量工作。 大约一周后,本来已经死心的我突然收到了回复,对方表示可以试试,但绝对不能影响安全,要万无一失。太棒了,至少载人航天没有表示反对,反而认为在保证绝对安全的情况下可以试一试。至今我都觉得这是中国航天真正显示出它真正自信一面的重要时刻。 ——导演在知乎的分享","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"电影","slug":"电影","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%BD%B1/"},{"name":"太空","slug":"太空","permalink":"https://hongliu.icu/tags/%E5%A4%AA%E7%A9%BA/"}]},{"title":"【RM】VGD25超电CAN通信文档","slug":"SuperCap-CAN","date":"2025-09-18T17:50:51.000Z","updated":"2025-09-24T11:23:24.369Z","comments":true,"path":"2025/09/SuperCap-CAN/","permalink":"https://hongliu.icu/2025/09/SuperCap-CAN/","excerpt":"","text":"Version:1.0 对应软硬件:25超电硬件V0.3,软件V2.7 该文档写于25/01,现经过小修改小完善,发布于博客上,方便查阅和实时更新。 一 基本逻辑1.1 电路原理 增加了超级电容的底盘电路可以理解成上面的三端网络,由电管、底盘、电容三个端口组成,由基尔霍夫定律可知,电管功率等于底盘功率与电容功率之和;这个关系对于电容放电也是成立的,此时图中电容功率为负,底盘功率比电管功率大。 1.2 控制实现 超电发送的数据有底盘当前功率和电容目标功率。底盘当前功率是底盘电机消耗的功率,作为底盘主控那边的功率检测输入使用(25赛季开始要求裁判系统不给底盘功率数据,必须超电模块检测),电容目标功率就是底盘主控发送过来更新的功率,指的是电容充/放电的功率,用于检验超电这边确实更新了。超电模块状态目前只是个雏形,后面完善(咕咕咕)。电容电压指的是电容组当前剩余的电压,也就是指示电容组剩余能量。 关于当前功率-缓冲能量-限制功率之间关系的计算,有学校在超电主控上完成也有在底盘主控上完成,因为咱们底盘已经有功率控制代码了,设定为底盘那边计算,给超电只需要发送一个超电需要吸收/供给的目标功率即可。这里的基本逻辑是用电管允许的功率减去底盘实际消耗的能量(由上面的三端网络图可知),得到剩余的功率就是允许超电此时趁机吸收的能量;反之如果相减的值为负值,也就是说底盘消耗的功率比电管允许功率大,那么超电往外辅助放电,保证电管功率不超过限额。 二 数据格式2.1 CAN通信配置波特率: 1MBit/s 超电使用CAN ID: 0x211 底盘主控请使用CAN ID: 0x210 发送频率: 其使用的定时器中断频率是193Hz,实际发送没有测过,这个方便调节的. 2.2 超电发送数据格式发送的数据需要使用四个元素的uint16_t数组接收;但CAN通信是以一个字节(即8位)为单位发送数据的,因此一般来说CAN发送函数会要求你的发送数据数组只能放uint8_t类型,。那么有下面两种解决方案。 底盘主控接收代码示例(使用强制类型转换)对uint16_t数组直接进行强制类型转换,四个元素的uint16_t转换过来就是八个元素的uint8_t,然后按照正常的长度为8的CAN数据发送即可。 123456//接收数组定义uint16_t bsp_can_rxbuf[4];//下面是接收响应函数中的代码HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &rxconf, (uint8_t *)bsp_can_rxbuf); //这是我的程序,底盘使用的时候hcan,FIFO,header等按照自己的写! 在代码中的实际使用: 底盘主控接收代码示例(使用低位在前逻辑)这里的强制类型转换在效果上与低位在前的数据存储方式是一样的,C620电机是高位在前,与此相反;电控直接把读取C620的代码复制过来,把两个uint8_t变量的顺序倒换过来,变成低位在前,是一样的效果,全向用的就是这个方式读取,总之两种接收方式,二选一即可,效果都一样。 12345678910111213141516171819202122//存放数据的结构体的定义typedef struct{ uint16_t Chassis_Power; //底盘当前功率 uint16_t Set_Power; //电容目标功率 uint16_t Referee_Power; //电管当前功率 uint16_t Cap_Voltage; //电容当前电压}PowerCtrl;PowerCtrl PowerData;//下面是接收响应函数中的代码if(RX_message.StdId==0x211) //若CAN信息来自超电{ //采用低位在前 PowerData.Chassis_Power = (RX_message.Data[1] << 8|RX_message.Data[0]);//底盘当前功率 PowerData.Set_power = (RX_message.Data[3] << 8|RX_message.Data[2]);//电容目标功率 PowerData.Referee_Power = (RX_message.Data[5] << 8|RX_message.Data[4]);//电管当前功率 PowerData.Cap_Voltage = (RX_message.Data[7] << 8|RX_message.Data[6]);//电容当前电压} 建议按照示例代码,这样代码风格统一。 接收效果大概像这样(数值仅供示意,重点是这里是四个uint16_t类型数据): 内容CAN报文的四个元素按顺序分别为: 底盘当前功率 目标设定功率 电管当前功率 电容电压 下面是数据的详细解析。 底盘当前功率即上面电路原理中的Pchassis. 因为使用的都是uint16_t类型的元素,所以不能直接表示浮点数和负数。超电主控把数据如下处理: y=x*10+0x7FFF 其中x,y分别是原数据和发送数据,为了表示一位小数把x乘10,为了表示负数把它的零点”居中“在十六进制0x0000到0xFFFF的一半,即0x7FFF。 底盘主控接收到数据y之后,应对其反变换: x=(y-0x7FFF)/10 即可获得原始发送数据x,即带正负,保留一位小数的底盘功率(注意及时转换成float以免丢失) 电容目标功率即上面电路原理中Pcap的目标值。 同底盘功率进行相同的从x到y的变换。 电管当前功率即上面电路原理中的Preferee. 同底盘功率进行相同的从x到y的变换。 电容电压即电容组电压,反映超级电容组剩余电量 使用的变换为 y=x*100 类似地,乘以100是为了保留两位小数。 底盘主控在接收到数据y之后,应对其作反变换: x = y /100 以获得原始数据x。(注意及时转换为float类型) 超电状态(该数据暂不启用 暂不发送)这里用状态码的思路进行表示超电状态。(未成熟,暂不启用和发送给底盘主控) 数值 状态 具体意思 0xFFFF 未初始化 此为超电状态码初始值,没有变成别的说明还没初始化跑起来 0x0001 正常充电 超电状态正常且电容组正在充电(功率>0) 0x0002 正常放电 超电状态正常且电容组正在放电(功率<0) 0x0003 正常待机 超电状态正常且电容组不参与底盘工作(不上电容状态) 0x0005 过压过流过充过放保护 电压或电流过大,或者超电充满了或者耗尽了,自动停机 0x0009 高温保护 超电上有测温用的NTC,后面做高温保护 可能还有别的状态,我还没想好( 总之我设计的可能花样多一点,底盘那边看需要就用。 对数据进行反变换的代码示例在使用上面那个示例代码进行数据接收后,需要对四个(实际上是三个)数据进行反变换,得到浮点数. 123456789101112131415161718192021//实际数据结构体定义typedef struct{ float Chassis_Power; //底盘当前功率 float Set_Power; //电容目标功率 float Referee_Power; //电管当前功率 float Cap_Voltage; //电容当前电压}PowerCtrl_True;PowerCtrl_True PowerData_True;//反变换函数void Cap_Data_Decode(void){ PowerData_True.Chassis_Power = (PowerData.Chassis_Power - 0x7FFF) / 10.0f;//底盘当前功率 PowerData_True.Set_Power = (PowerData.Set_Power - 0x7FFF) / 10.0f;//电容目标功率 PowerData_True.Referee_Power = (PowerData.Referee_Power - 0x7FFF) / 10.0f;//电管当前功率 PowerData_True.Cap_Voltage = PowerData.Cap_Voltage / 100.f;//电容当前电压} 2.3 超电接收数据格式内容底盘发送数据按顺序依次为: 电容目标功率 未定 未定 未定 电容目标功率即给超电模块发送超电要充电的目标功率(负值即为放电),发送过来后超电由此值进行更新自己的电容目标功率,为了避免超电模块PID的超调/过冲导致进入保护,甚至烧坏板子(亲身经历),请不要使得您发送的目标功率变化过大,瞬态变化不要超过50W。 对数据进行变换的代码示例有具体要发送的数据之后,这里操作的顺序和上面接收的顺序(接收->反变换)相反,先变换后转化为uint8_t进行CAN通信发送。 下面是进行变换的示例代码: 12345678910111213141516171819202122232425//存放数据的结构体定义(假设该结构体中有要发送的原始数据typedef struct{ float Set_Power; //底盘当前功率 float data2; //未定 float data3; //未定 float data4; //未定}PowerCtrl_True;PowerCtrl_True Cap_SendData_True;typedef struct{ uint16_t Set_Power; //底盘当前功率 uint16_t data2; //未定 uint16_t data3; //未定 uint16_t data4; //未定}PowerCtrl;PowerCtrl Cap_SendData;//变换函数void Cap_Data_Encode(void){ Cap_SendData.Set_Power = Cap_SendData_true.Set_Power *10 + 0x7FFF; //剩余三个数据还没有定义,后面有再补充} 底盘主控发送代码示例(使用低位在前逻辑)由底盘主控发送、超电主控接收的数据,采用和上面所讲述的一样的数据格式,也就是四个uint16_t元素组成的数组,然后以强制类型转换或者低位在前逻辑转化为CAN实际发送使用的uint8_t类型元素进行数据传输。这里仅展示后者。 这里沿用上面的Cap_Send_Data结构体,进行发送。 123456789101112131415uint8_t Cap_CANSendData[8];//类型转换Cap_CANSendData[0] = Cap_SendData.Set_Power;Cap_CANSendData[1] = Cap_SendData.Set_Power >> 8;Cap_CANSendData[2] = 0; //其余三个未定数据这里省略处理Cap_CANSendData[3] = 0;Cap_CANSendData[4] = 0;Cap_CANSendData[5] = 0;Cap_CANSendData[6] = 0;Cap_CANSendData[7] = 0;//发送函数HAL_CAN_AddTxMessage(&hcan, header, Cap_CANSendData, send_mail_box); //一样,这里按照自己的进行配置 Version 1.0 写于25/09/19","categories":[{"name":"技术文档","slug":"技术文档","permalink":"https://hongliu.icu/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"}],"tags":[{"name":"硬件","slug":"硬件","permalink":"https://hongliu.icu/tags/%E7%A1%AC%E4%BB%B6/"},{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"},{"name":"RM","slug":"RM","permalink":"https://hongliu.icu/tags/RM/"}]},{"title":"【教程】如何把通行证纸盒改装成通行证展示架","slug":"tongxingzheng","date":"2025-09-10T09:23:52.000Z","updated":"2025-09-10T10:05:39.328Z","comments":true,"path":"2025/09/tongxingzheng/","permalink":"https://hongliu.icu/2025/09/tongxingzheng/","excerpt":"","text":"本文原发布于森空岛/2023-11-20,一时兴起做的,在岛上数据还不错;并且比较实用(?),于是搬过来了。 原贴链接:[小教程]如何把通行证纸盒改装成通行证展示架? 不是专业手工,渣技勿喷(( 话不多说先上效果图: 下面开始教程! 1、这是个普通的通行证和盒子 2、我选择背面有斜条纹的部分作为插座面(上面),把除了前后之外的四个面范围画出来(可以在盒子里垫个东西方便划线 然后咔嚓! (可以先用笔或者圆规把剪切线划出痕迹 3、剪出插口!量好通行证底部尺寸,在上面用美工刀切出同样大小的口子(可以适当大一丢丢,防止像我一样差点塞不进去((( (和我一样塞不进去的同学可以在四个角切开一点 完成后试试看: 初具雏形了呢=) 4、正面反面!在盒子剩下的部分找出你想作为正面的部分,上下各预留出一小部分并剪出来 然后把预留出来的部分对着塞进刚才的部分试试! 反面同理 最后拼起来! (有条件可以用胶粘一下,我手头没有胶水所以没粘上(不过也蛮稳的XD 成品! 原帖发布于:23-11-20 本贴发布于:2509-10","categories":[{"name":"手工教程","slug":"手工教程","permalink":"https://hongliu.icu/categories/%E6%89%8B%E5%B7%A5%E6%95%99%E7%A8%8B/"}],"tags":[{"name":"教程","slug":"教程","permalink":"https://hongliu.icu/tags/%E6%95%99%E7%A8%8B/"},{"name":"手工","slug":"手工","permalink":"https://hongliu.icu/tags/%E6%89%8B%E5%B7%A5/"},{"name":"明日方舟","slug":"明日方舟","permalink":"https://hongliu.icu/tags/%E6%98%8E%E6%97%A5%E6%96%B9%E8%88%9F/"}]},{"title":"【知识笔记】电路理论","slug":"Note-dianlu","date":"2025-08-20T12:10:22.000Z","updated":"2025-08-20T12:18:20.882Z","comments":true,"path":"2025/08/Note-dianlu/","permalink":"https://hongliu.icu/2025/08/Note-dianlu/","excerpt":"","text":"内容:电路理论 使用课本:《电路(第六版)》;ISBN 978-7-04-056553-9 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码35uf 电路_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets。 下面提供部分笔记预览。 整理于:250820","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"}]},{"title":"【知识笔记】数字图像处理与机器视觉","slug":"Note-jiqishijue","date":"2025-08-20T10:25:34.000Z","updated":"2025-08-20T12:17:01.539Z","comments":true,"path":"2025/08/Note-jiqishijue/","permalink":"https://hongliu.icu/2025/08/Note-jiqishijue/","excerpt":"","text":"内容:数字图像处理与机器视觉 使用课本:《数字图像处理与机器视觉》;ISBN 978-7-115-34668-1 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码49qi 机器视觉_总笔记 md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets。 下面提供部分笔记预览。 整理于:250820","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"机器人","slug":"机器人","permalink":"https://hongliu.icu/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA/"}]},{"title":"【电赛】25电赛电源题(A题)-一次失败的四天三夜比赛寄录","slug":"Diansai_25","date":"2025-08-19T07:35:01.000Z","updated":"2025-08-19T11:42:06.959Z","comments":true,"path":"2025/08/Diansai_25/","permalink":"https://hongliu.icu/2025/08/Diansai_25/","excerpt":"","text":"简介本文记录了本人电赛小队队伍情况、赛前准备、赛中进程等内容;我队在本次电赛中斩获了省三等奖的搞笑成绩,但还是决定写下本记录,以供经验总结、警示后世及为未参赛的朋友们提供一点参赛信息。 背景&赛前准备我队小队三人均来自我校RM硬件组队员,掌握基本的电路设计、PCB Layout、STM32嵌入式软件,除我之外两个队友都是大三(本人大二),且他们俩都会一点dsp(虽然后续没实际用上)。由于RM硬件场景基本上只有直流,我们先前项目经验也都是直流,这为我们在越来越注重交流场景的电赛中的搞笑表现埋下伏笔。 赛前我们参考了许多大佬的开源进行硬件准备,主要包括 @EDAdong 大佬的一系列采样模块和立创硬件广场上的许多功率电路开源。基本上就是微调原理图+PCB重新Layout+实物验证的工作。后续证明,实物验证确实是一个工作量大并且十分必要的工作。 元件清单发布7月23日,电赛元件清单发布,虽然对交流的东西有心理准备,但是看到清单来个三相可变电阻器,还是略微有点两眼一黑的。 在此之前我们的准备基本上还没有接触到三相,只有直流的东西和单相逆变,并且单相也只是实现了逆变,没有实现过主动整流。我们三人在电赛前都各自有事情要忙(实习/夏令营什么的),或者说没能放足够精力在电赛备赛上吧;总之元件清单出来后我们才加急准备了两套三相全桥逆变及采样等相关板子。剩下的几天,主要做的就是理论学习,把交流这一块的各种不熟悉的控制算法都补一补,没有什么硬件上的工作。 开赛·第一天7月30日早上七点半,赛题发布。今年的A题类似18年E题单相交流电子负载的思路(非常相似),不过升级成了三相;主体上是做一个三相逆变电路(基础部分),有输出额定电压电流、波形失真度(THD)、电压调整率、调频的要求;发挥部分加一个三相整流电路,整流出来的输出回到最开始的直流母线上进行能量回馈,设置系统能量回馈后的直流电源功率(即整个系统的损耗功率)作为发挥部分关键点。分析下来本题不要求什么前沿的电路拓扑,区分度在于实现能量回馈(即整流部分和稳定直流输出)和压缩损耗功率两点。 丢个赛题下载链接在这 我们阅读了赛题确认选择该题(本来就准备的电源题所以也没什么好选的)并进行分析。首先是硬件部分,我们清单发布后准备了两套三相全桥逆变电路(包含驱动、采样等),在正式开赛前板子元件陆续到了,发题的时候已经焊接一半了;因此我们认为硬件上准备已经基本充足,对于三相线上有一些关于需要隔离的讨论,补买了三相共模电感。后续证明这部分决策基本没什么问题,重点在控制算法的实现。另外一个隐藏的难点是今年题目电压相对于往年其实偏高,额定输出线电压有效值32V,换算一下相电压峰值有26V+,因此如果不升压直接使用直流母线电压,需要至少52V电压,我们使用的是电源直出的60V电压,后续了解到其他队伍也基本是这个量级电源;开始还担心测评场地能否提供充足电源和能否使用自带仪器,后续测评那边电源只有30V,但使用自带电源是可以的。 发挥部分很快就出现两种可行思路:主动整流和被动整流+DCDC。主动整流就是直接反向使用全桥逆变的电路做APFC,同时可以做升压控制,保证输出直流可控;被动整流就是用三相整流桥和滤波输出直流,然后DCDC变换控制直流回馈。我队没有实现过主动整流,评估三相主动整流方案从头实现工作量太大,因此购买了三相整流桥,并计划使用之前准备的BuckBoost板做直流控制。 确定了大致方案后就开始准备三相逆变部分。当天下午还是晚上,我们实现了基本闭环(没矫正有点飘)的PI电压环控制的三相逆变波形,当时还是比较激动的。但其实这种比较基本常见的需求一般应当在赛前就实现出来备用,这里就体现出我们准备工作量不足了。 当天晚上差不多一二点就回去休息了。 第二天第二天继续做基础部分的剩余内容,调频和调幅。这两个比较简单,用之前验证过的主控板交互例程改一下即可。 小介绍一下我们的主控方案,使用的是NUCLEO系列的G474的主控系统板,插在一个自制的扩展板上;扩展板包括ADC/PWM接口(XH2.54)、交互按键、OLED、LED指示灯、辅助电源接口。图片如下: 这一套用下来挺实用的,小推荐一下。 我们原本在第一天实现了PI控制的逆变之后想尝试做PR控制,但是很尴尬的事情是,我们的板子上是设置了电感电流采样和输出电流采样的,PR控制也需要这些;但是我们在前面跑PI控制的时候就出现端倪了:出现跑着跑着突然噼里啪啦响,有时候没事,有时候出现短路。仔细一查就是电感电流采样芯片坏了,多次出现而我们没有排查出原因,最终只能直接拆除电感电流采样芯片,让纯PI电压环可以正常跑。 既然控制逻辑没法优化,那么接下去就是优化了下PI控制的参数,优化了点电压调整率的东西。 做到第二天才差不多把基础部分做完,这个时候其实已经基本看到四天三夜做不完全部题目内容了;但是中途开摆不在我的选择范围内,所以开搞发挥部分。 首先是测试Boost板子及整流回馈部分使用的电流环,但是这下出问题了;由于未知原因,板子不断出现短路情况,多次烧坏驱动、MOS。该电路之前验证过并没有问题,所以这个时候出bug令我们很奇怪。当晚排查到很晚,一直修,最终比较晚的时候算是修出来一版能跑的电流环Boost;但修一晚上的稳定性还是令人堪忧。但是没办法了,到第三天了。 第三天第三天,整流桥等快递基本都到齐了,我们开搭发挥部分电路。三相逆变出来之后过三相共模电感,然后接整流桥、滤波、Boost模块和电阻。发现就算中间不上Boost模块,直接滤波后接电阻,逆变波形也出现了类似马鞍波的失真,推测是使用被动整流,电流畸变+逆变闭环控制不力导致的;从而会影响到电压值,并且直流电源数值也容易波动。但是我们先不管那么多,继续测上Boost的能量回馈。 结果当然是不尽人意,滤波整流后一上大负载就电源失控、波形变形,Boost电流环因为前级不稳定因素也没有正常跑通过,研究一整天也没有得出结果。到第三天夜里我们决定停止对于发挥部分的挣扎,通过调整LC滤波电容电感值、调整PI参数等方式,以此最后再微调一下基础部分THD、电压调整率的表现。 第四天对于发挥部分的尝试持续到第三天的后半夜(或者说第四天的凌晨半夜),简单休息一下我们就继续最后一个白天的日程,完善下上面说的基础部分东西了。此时心情是很复杂的,电赛打到第二年了而且今年是国赛,赛前的技术准备虽说还是永远不够,但在赛前已经是尽量挤时间做了(学期内还有RM备赛占据大量时间,RM25赛事结束后还承担管理任务);到现在基础部分都做完了卡在发挥部分一点做不出来还是挺难受的。 但是客观事实不因主观思想而改变,我们最后能做的也就完善和保卫下我们已有的成果。我在第四天写了报告,队友测试的电感电容参数和辅助电源等保证每一模块都至少有两套可用。然后到了下午就是打印报告、签字、封箱了;当天晚上八点封箱完,可能今年是国赛比较严格,需要我们当晚就有一人大巴陪同作品,去到西安邮电大学存放作品了。当晚快十二点才回到学校。 辅助电源这块我想插一嘴,今年60V左右的直流输入电压,对于辅助电源的输入耐受电压其实是有挑战性的,我们赛前准备的模块并没有到这个范围,紧急买了现成的降压模块补充的。 存放作品的流程比较简单,就是老师交档案-确认队伍编号进去存放-出来回家的事情。 测评封箱送完作品就是等待测评和测评了。今年是2号完赛,4-6号进行测评。不管做的怎么样,封完箱没什么再好做的了,心里上轻松了许多;和许多队伍一样,完赛第二天我们三人都处于沉睡状态。我们安排到5号下午测评。 测评流程(具体流程看具体主办方会有差异):在教室领号叫号-领取作品-到测评场地测评-送回作品。 具体测评过程:进去签字到测试桌前(是有多个队伍同时测试的),那边给了定时十五分钟,自己开箱接线,可以熟悉场地设备(万用表、电源等,并未提供示波器,功率分析仪可能数量原因是测评老师手里一台带着),该时间段内自己测试完成可以提前叫老师开始测评。一位老师手持测试记录表(如下图,图源为比赛之后网络流传,非本人拍摄,侵删)进行测试数据的记录,另一位老师拿功率测试仪进行数据测量。测评过程中按照老师的指示依次测量每一项数据,数据读取和记录由老师负责即可。 我们队在测评过程中没有翻车,测评效果都还行,基础部分只有电压调整率没有完全达标,基础50分自我估分应该有45+。评测完感觉还行,甚至以为有机会省二省一()。 赛后总结根因分析首先还是分析下我们失败的原因吧;单次的成功或失败,不过是你的数据点而已 。 工作准备(技术)电赛电源题的特点是:题目可以分为DCDC、ACDC等几种大类型,对于每种大类型都需要提前准备并实现其功能(如DCDC的电压环、电流环升降压闭环控制;DCAC单相逆变;ACDC的PFC控制等),在真正比赛的时候即拿即用,才能称得上有一战之力,有精力去推进电赛的创新部分。而正如上面所说的,我们在比赛开始的时候,对于模块的实现进度太低了,就连提前准备了的Buck-Boost也在使用过程中出现bug;因此我认为赛前工作量不足是我们失败的直接原因。 在赛前准备过程中有技术路线问题,例如采用谁家开源、先准备什么模块什么的;我认为这不是重大问题,只是影响赛前需要准备的工作量多少而已,对于赛前工作准备的根本问题还是队员能抽出来多少精力和技术储备。 我队的技术经验基本都是RM训练的,我校的电赛培养、电子设计培养都约等于零;我队三人都是在RM队伍体系中参与至少一年的硬件组成员,做的东西都是车上用的直流变换以及超级电容相关的,但也是培养了基本的电路能力;不知道是电赛题目设计距离实际应用场景有gap,还是RM硬件比较偏科,总之如果不是为了备赛电赛,我们其实并不怎么接触到交流的东西。所以这是我们技术上的一个缺陷。在电赛过程中,处理逆变控制的时候,对于环路控制、PR控制等比较深的控制技术也感到比较缺乏。 团队协作(人员)决定一个时期是否成功的决定因素还是人。人员因素分为备赛人力资源和团队氛围两部分考虑。我们在团队氛围做的比较好,因为都是一起打过RM的队友,共同工作时间长,并且都比较熟悉并且都是打RM的还能熬,另外我们技术栈也都比较全,每个人单拎出来都是可以做软件也可以做硬件;因此在电赛过程中我们配合紧密,各种工作可以相互交接,也就可以合适安排休息,时间利用率还是比较高的。 但另一方面的人力资源就是我们的一个缺点。我队一人在市内实习,一人在忙夏令营,一人在忙RM的管理;导致我们在学期内基本没什么时间实际进行电赛准备,在暑假留校的一个月左右才真正大量进行备赛准备;这也就直接导致了上面的工作准备问题的缺乏。 培养氛围(环境)我校完全没有成体系的电赛培训。部分指导老师可能会提供一些相关建议,但电赛备赛完全靠自学,学校的电赛成绩也不是很好。所以我的电赛学习环境其实就只能靠RM学硬件的底子;环境因素也是构成技术缺陷的一个背后原因。 Next Time告别了2025年电赛,有遗憾也有收获。总结自己大二一年的项目经验的话,其实会发现并没有很多进步;倒是电赛这几天实践经验增长的快一些。 明年不知道会不会再打一轮电赛了,但是如果有机会打的话应该还是会参与。电赛虽然只有技术,但从技术上来说确实是个不错的锻炼机会。它涉及的技术其实并不很深入,但是需要有充足的测试和稳定性。如果再一次搞电赛的话,我希望自己和队伍能做到以下几点(算是一个checklist): 技术 至少三个月的准备时间,这里的要求是日均备赛工作时长至少2小时 赛前能有真正能稳定运行的各种电路拓扑模块(DCDC、ACDC、DCAC、辅助电源、主控),且具有调整空间 人员 队友有合作经验(可以通过校赛、校际联赛等训练),明确自身岗位、分工(如果不软硬件兼修的话),靠谱不摸鱼跑路 环境 大环境难以改变,或许在队内或者同题型队伍之间可以有相互交流学习甚至学习小组的关系? 北海虽赊,扶摇可接;东隅已逝,桑榆非晚。 写于 25.08.19","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"日志","slug":"日志","permalink":"https://hongliu.icu/tags/%E6%97%A5%E5%BF%97/"},{"name":"电赛","slug":"电赛","permalink":"https://hongliu.icu/tags/%E7%94%B5%E8%B5%9B/"},{"name":"硬件","slug":"硬件","permalink":"https://hongliu.icu/tags/%E7%A1%AC%E4%BB%B6/"}]},{"title":"【RM】长沙行记","slug":"RM_changsha","date":"2025-08-17T07:31:36.000Z","updated":"2025-08-19T11:38:56.022Z","comments":true,"path":"2025/08/RM_changsha/","permalink":"https://hongliu.icu/2025/08/RM_changsha/","excerpt":"","text":"从加入机器人队,从去年的太原和武汉没发挥什么实际作用的赛旅,就在想有没有那么一天,自己会不会以一个主力的身份再次来到RM这个赛场。2025,经福州和长沙二役,此时返程的火车经过武昌站,在熟悉的站台和去年的自己会面,少了些未知,却又多了更多踌躇。 长沙给我的感觉是一个各个方面都“管得比较少”的城市。对长沙的初印象并不是各式旅游景点或者网红地点,而是有些混乱的交通、有点昏暗的地铁站、夜晚人行道不足的灯光和小路上摊子脚下散发一些恶臭的油污,一个不优雅的初对面。但是在这里过了一周多,有的时候又能看到这层污渍下面,一个城市正在活着。这里有近乎夸张的夜生活,商业区彻夜的灯光映射着她的充沛精力,小吃街彻夜的店告慰了我不止一夜的心。奔波于路上不放过每一个订单机会的货车司机正在活着,红花坡蛋炒饭里招揽生意热情的老板娘也在活着。长沙告诉我的事情和北方很不一样,这里有斤斤计较的人、冷漠的人、热爱生活的人、美丽的人,他们都不是长沙的全部,但他们加在一起又是长沙的全部。这座城市以一种拟近黄老无为的态度对待她之中的人,还有我这样的来客。 考完面向对象下午马上飞机到长沙,RM中部分区赛的一周多,基本都在贺龙体育馆和租的羽毛球馆之间两点一线地度过。一群普通大学生并不能让一个历史弱队马上在春茧引吭高歌,但四十颗念着同一个名字的心确实能带来四次奋力的拼搏、一场久违的胜利。作为这个队伍几十双手的其中一双,作为一个技术点不算核心的硬件,至少我对于我的任务完成度还是比较问心无愧,超级电容上了四辆车并安稳运作不炸车,为车车们赛场上的“极限犹可突破”做了一点微小的贡献。在赛季的后半段担任了副队,说实话第一次担任这种比较管理的职务,并不自信,但是经验总归越练越有,失误问题当然不少,但能找到一点感觉,修复自己的一些死点,同时也看到了一个真实痛苦漫长伟大的机器人队伍。属于一代队员又一代队员的青春流逝,属于VGD的深圳班机仍未到来,但每一年我们都在探索,都在前进。年年岁岁花相似,岁岁年年人不同。看看明年的VGD又会是怎样的一番风貌。 打完比赛去了解放西、橘子洲、岳麓山几个经典景点。坡子街灯红酒绿,橘子洲湘江水阔,岳麓山“好的大学 没有围墙”,都是我难忘长沙记忆的一部分。 中南泻新夏,雨水洗西尘。百里一赴胜,三日宴四方。他日龙能贺,毋忘战长沙。 写于 25.05.26 从长沙回校的火车卧铺上","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"日志","slug":"日志","permalink":"https://hongliu.icu/tags/%E6%97%A5%E5%BF%97/"},{"name":"RM","slug":"RM","permalink":"https://hongliu.icu/tags/RM/"},{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/tags/%E6%9D%82%E8%B0%88/"}]},{"title":"【知识笔记】复变函数与积分变换","slug":"Note_fubian","date":"2025-08-17T06:49:18.000Z","updated":"2025-08-20T10:20:54.723Z","comments":true,"path":"2025/08/Note_fubian/","permalink":"https://hongliu.icu/2025/08/Note_fubian/","excerpt":"","text":"内容:复变函数与积分变换(复变) 使用课本:《复变函数与积分变换(第二版》;ISBN 978-7-03-044542-1 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码qvyw 复变_总笔记.pdf md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets。 下面提供部分笔记预览。 整理于:250817","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"数学","slug":"数学","permalink":"https://hongliu.icu/tags/%E6%95%B0%E5%AD%A6/"},{"name":"复变","slug":"复变","permalink":"https://hongliu.icu/tags/%E5%A4%8D%E5%8F%98/"}]},{"title":"【知识笔记】模拟电子技术基础","slug":"Note_modian","date":"2025-08-17T05:04:33.000Z","updated":"2025-08-20T10:21:06.789Z","comments":true,"path":"2025/08/Note_modian/","permalink":"https://hongliu.icu/2025/08/Note_modian/","excerpt":"","text":"内容:模拟电子技术基础(模电) 使用课本:《模拟电子技术基础》;ISBN 978-7-5606-6527-6 学习途径:课内 由于本网站主题不支持Latex且我使用的笔记软件Obsidian,笔记在网站中图片、公式等部分显示异常,故提供md笔记的网盘链接和PDF导出文件可供下载。 md笔记百度网盘链接|密码yp8s 模电_总笔记.pdf md笔记建议使用Obsidian查阅,附件存放路径设置为“当前文件所在文件夹下指定的子文件夹”,子文件夹名称为assets。 下面提供部分笔记预览。 整理于:250817","categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"},{"name":"模电","slug":"模电","permalink":"https://hongliu.icu/tags/%E6%A8%A1%E7%94%B5/"}]},{"title":"【RM】队伍是学校体系夹缝中的存在","slug":"RM_team-and-school","date":"2025-08-16T03:48:59.000Z","updated":"2025-08-18T17:57:01.033Z","comments":true,"path":"2025/08/RM_team-and-school/","permalink":"https://hongliu.icu/2025/08/RM_team-and-school/","excerpt":"","text":"和朋友讨论了关于自己和学校、关于一个或者很多个机器人队队伍。 大二的第二个学期已经结束了,虽然还有电赛作为余韵盘旋在暑假里,回响着一个大二学生在学校大众宣传中应有的“激情”,虽然一个长久但是又生分的机器人队正在等待一代新的老队员的推进;两年时间足够做好和做烂很多事,事实也的确如此,而我也有很多体验想要抒发。这里是一个并不会很好组织言辞的工科男,一颗 maigo 的心。 学校评价体系和评价学校体系在这所学校待了两年,对于这个要度过四年的地方,我的总体感受是:此处符合一个 211 学校所被期望的水准,但——我用这个泛化的看似很华丽的词汇描述它,其实也是另一层不言而喻的评价——是,但也只是一个中下游 211。当然我无意像舆论/市场那样吹捧 985 211 的什么高级性,而是想表述:这里被塑造成的,是一个被一些存在期望的样子。如果人格化一下,这个学校走在这个社会构造的评价体系下,并且努力地朝着“一个 211 该有的水平”奋斗。 好吧我这么说也有点太抽象了(特别是没对上电波的话)。 作为一个学生具体地来看,如果按照学校体系所鼓励的发展路径去发展,那么这是一个总体舒适,甚至可以说条件很不错的地方。这里所说的学校体系,指的是一个评价的舆论场,包括各种官媒校媒公众号所鼓吹的,“阳光”的,“奋斗”的一个生活方式/学习方式,例如说“XX 青年说”“星光不负赶路人”“榜样的力量”,具体说可能是卷绩点、打某些“作品赛”,等等此类。在这种考虑情况下,这里可以称得上条件很不错,有老师有物理环境,有“比赛氛围”也有卷绩点的“学风”,一片勃勃生机,一片万物竞发。这种和谐发展当然不是学校方主观上的良心发现,而是学校面对的需求导向的必然结果。学校对于学生的第一诉求当然是稳定,第二就是创造一些成果,尤其是「显而易见」的成果。 但是从一个真正从学生出发的角度,如果一个学生尝试想去做一些拿不到很多水奖的,有时候还会给管理方带来“多余成本”的,但是意在提升自己真正能力(技术能力/社会能力) 能够全面发展的事情/尝试走上做这样事情的一个道路时,那么这个时候学校可就不是一个知心长辈了。这里不会有很多帮助,反而可能存在一些看似无理,实际上只是由于其保守或维护自身利益或不想增加管理成本的障碍,不给场地啦,不更新设备啦,不给资金啦,不给请假缓考啦之类的麻烦事。 这种学校诉求,或者说这种“学校评价体系”源于学校自己面临的诉求体系,或者说“评价学校体系”。“评价学校体系”谁来评?当然不是学生,是学校的甲方/拨款人。 学校本身也不是一个整体,有校领导、学院、团队、老师,更广泛一些讲还有各路社团组织和学生;各方存在各样的利益诉求,这种学生想要真正得到全面发展的困难,并不能怪罪在某个群体上,我认为,这是“评价学校体系”发力的作用,或者说这是整个大环境长期作用的结果。这个环境即是下一部分的主题。 大自然的造化我想通过分别阐述学校内的各个群体面临的环境及其特点,来分析高校竞赛体系的存在(主要着眼于队伍外部因素)。这是个很大的命题,不可能几句话完成,不过我想先开个头。 校领导校领导层级面临的主要评价压力更多来自宏观的政策,学生竞赛对其的意义是奖项荣誉、教学成果这些比较宏观的东西,具体体现在各种学校排名(尤其招生季);但是学生竞赛说到底对于校领导来说是没有一个直接快速的影响的,多一个少一个学生竞赛团队,或者团队多获得少获得一点资金并不会对于其有什么根本上的影响;但另一方面,竞赛团队从外部能获得的最根本、很多时候还是最大的帮助的来源又正是这个群体,例如学校层级的资金支持、活动安排等。 学院学院是各项学校活动政策直接实施到竞赛团队上的具体经手人,也是实践队伍在生活中接触的最多的一级机构。一个优秀的竞赛团队或许可以成为该学院学生实践培养的金字招牌,同时学院也会以座上宾的姿态优待竞赛团队;但现实很骨感,(就我看到的)绝大多数队伍和学院的关系是互相扶不起的关系:队伍难以做出突出的成绩,学院也作为第一赞助人,没有得到充足理由 也难以向队伍提供进一步的支持,而没有被推进支持的队伍进步的机会又更加渺茫(同等条件下),双方秉持一种尴尬的近似家长子女的关系;常见的一个队伍配置就是依托于某个学院(例如我队依托的机械学院)进行,虽然学生队伍并不至于大喊“我的原生学院”,但这种白银的处境 是很多发展困境中的队伍最直接面对的环境;作为最直接“监护人”的学院也是队伍发展过程中的一个可以说最主要的联络对象。 工训中心工训中心理论上来讲是高校学生进行技术实践的核心场所,同时是各类技术竞赛队伍的有力支撑,提供资金、场地等资源;我们也可以看到有很多 RM 队伍以及其他竞赛队伍是依托其工训中心进行的。但实际上,工训中心在课内实践培训这一块,不能说是如火如荼吧,也可以说是半死不活,基本上沦为了金工实习等走过场技术实习的配合场所;对于其竞赛队伍培育方面,不幸,我校的 RM 队伍是依托于机械学院而不是工训中心进行的,但工训中心确实为一些其他的竞赛体系提供了场所等支持。总而言之,工训中心像是一个没有固定学生的学院,其支持压力和支持意愿像是一个学院,和校领导层面挂钩,具有发展关系和寻求合作的机会,其具体潜力根据不同学校的安排会有很大不同,需要结合具体实际考虑。 指导老师指导老师由于个人的差异性,其位置在一个队伍中是一个同样差异性很大的存在。总体上来讲,指导老师关于学生队伍的关系,是学院对队伍影响力的具象化+老师个人意志的差异化。没什么意外的话指导老师一般是属于负责学院的,因此其对队伍的基本态度(或者说能做的基本措施)可以代表学院对队伍的态度,例如经费数量级、比赛场地等资源;但同时指导老师个人的能动性会使得指导老师可以选择是否将自己的力量也注入队伍中,我们可以看到,太理 RM 的萧老师、首师 RM 的张老师还有 RC 等比赛中很多指导老师,都投入很多精力在队伍中,给我们留下了很亮眼的印象。具体一些来说,指导老师承担的责任是资金流转(资金统筹、垫付、管理),活动报备(负责人、活动申报、项目申报),队伍管理,资源争取的工作;一个好的指导老师在队伍运营过程中特别是建队初期,可以起到至关重要的作用,而一个不尽人意的指导老师则可能拖慢队伍节奏,甚至严重影响备赛进度。老师和队伍的影响当然也是双向的,可能是双向奔赴也可能是螺旋下降,而这就是队伍管理层的主观发挥部分了。指导老师受到队伍成绩的影响所获得的反馈在我们所述几个外部因素中是比较大的,就是说队伍的兴衰相对来讲,对于指导老师是影响比较大的;因此这几个方面中,指导老师容易与队伍站在同一战线。 赞助公司赞助公司属于一个 DLC 部分。目前来看很少有队伍能够在资金等支持上做到完全脱离学校体系(华南理工 RC 等特例令人 orz),但在队伍依托于学校体系的大背景上,外部赞助如果做的好,也是能够作为感知很强的外部 Buff 出现的。常见的赞助领域有电机、制造、周边等。赞助方面要发挥队伍的主动作用,积极寻找赞助机会,数量是可以带来肉眼可见的成果的。我队在先前一个赛季通过积极寻求赞助,获得了很多支持。如果要说赞助公司受到的社会压力的话,基本上和社会大环境比较相关,并且波动并不明显。 总体作用让我们回到这整个“学校评价体系”以及它对于竞赛队伍、竞赛体系的影响。上述的几个方面勾勒出了一群学生若想要施展能力建立竞赛队伍,所会遇到的各色群体;说到底一个竞赛队伍正是在这样一个评价体系的夹缝下生存的,能不能发展很大程度上也要看人家的脸色。我觉得这是一个自然的过程,各类群体都是出于自己利益在变动;所以我不认为这个体系有什么好骂的,或者说骂也并不会改变这个追求能量最低点形成的体系。我并不是为这样的存在不公的体系声张,我想表达的是:叹气并不会改变什么,具体分析环境因素,从而更好发挥人的决定力量,才是建设团队的正确之道。 “前途是光明的,道路是曲折的。” 一个 RM 队伍存在的无奈所以机器人队说到底也只能在这种学校环境的夹缝里生存,并且这种环境不但极其牢固,而且随着学校的不同,面临的处境也会很不一样,这种处境也并不是单纯随着学校排名的升降而升降的。 宏观上来看,确实是学校排名、评估越高的学校,在竞赛体系培养方面提供的资源会更有优势,瘦死的骆驼比马大,一个 985 院校轻轻一挥提供的队伍资源或许就足以令一个二本队伍望其项背;但是学校在其层次里的排位、学校专业覆盖领域等也会很大影响竞赛队伍资源走向。这里要点名的是中下游九二这个群体。中下游 211/985 是一个很尴尬的位置,本身获得了 92 这样几乎永久性的荣誉,夸张一点来讲会有“死于安乐”的习气,但另一方面中下游这个位置又弥漫着「白银」的失败感,导致学校系统总是想争取多一些荣誉让自己的名头更响。而论名声荣誉,真材实料培养工程师人才的技术竞赛的性价比简直低到发指(尤其是不名列前茅的情况)——所以处于这种境地的学校就很难给出充足的资源去给机器人比赛等这种性价比低的竞争平台。反过来讲,如果一个学校处于其大阶层的头部,哪怕这个阶层不像 C9、985 这么高,这种学校为了发掘自身对学生的优势,扩大自己的实力和名声,反倒容易支持机器人比赛这样的培养平台;我认为广工、南航都是这种类型学校的代表。 大多数竞赛队伍诚然是没有这样的好命的。绝大多数的「我们」只是不自主地来到所在的学校 所在的队伍,对着已经是烂摊子多年的烂摊子/即将要成为烂摊子的烂摊子哀叹;自私的学校系统和自私的人,扼制着每一个向上的心。那么在这种尴尬处境下的竞赛队伍们,又都能做些什么? 我们能做什么?我在大一入学后才了解到 RoboMaster 这个赛事,从一个对机器人技术零基础的小白接触电控、硬件知识,虽然没有成为一个出众的技术大佬,但具备了基本的工程师精神和技术素养;因此我是深深感受到了学生竞赛队伍这个模式对我的帮助。当下的技术实践教育体系是不好的,但这更凸显了学生队伍的宝贵。 作为单纯一个学生,我认为我们能做的就是在尽可能为自己发展的同时搭建/维持/发展一个平台,帮助更多有想法的人,同时这个过程对于自己的非技术技能也是一个最好的锻炼,这就是我留在 RM 队伍的原因。这是带有理想主义的想法,学生队伍的理念本身也带着理想主义。但是——山就在那里。 写于 25.08.16","categories":[{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"}],"tags":[{"name":"RM","slug":"RM","permalink":"https://hongliu.icu/tags/RM/"},{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/tags/%E6%9D%82%E8%B0%88/"}]},{"title":"Hello World !","slug":"Hello-World","date":"2025-08-15T05:59:19.000Z","updated":"2025-09-21T12:19:43.636Z","comments":true,"path":"2025/08/Hello-World/","permalink":"https://hongliu.icu/2025/08/Hello-World/","excerpt":"","text":"★乔※迁☆新※禧★我们是被互联网世界伴随的一代,我们是生活在互联网世界中的一代。赛博买房焦虑混合想要有个地方存放一些乱七八糟文档的想法,诞生了这个赛博自建房。生活是一个时时被凝视的剧场,有的时候我们需要一些阳光照射不太到的角落来存放自己的内心。 山中何所有,岭上多白云。只可自怡悦,不堪持赠君。 更多详细信息请看关于 Hello World! 写于 25.08.16 最后更新于 25.08.17","categories":[{"name":"其他","slug":"其他","permalink":"https://hongliu.icu/categories/%E5%85%B6%E4%BB%96/"}],"tags":[{"name":"日志","slug":"日志","permalink":"https://hongliu.icu/tags/%E6%97%A5%E5%BF%97/"},{"name":"网站","slug":"网站","permalink":"https://hongliu.icu/tags/%E7%BD%91%E7%AB%99/"}]}],"categories":[{"name":"知识笔记","slug":"知识笔记","permalink":"https://hongliu.icu/categories/%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0/"},{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/categories/%E6%9D%82%E8%B0%88/"},{"name":"日常","slug":"日常","permalink":"https://hongliu.icu/categories/%E6%97%A5%E5%B8%B8/"},{"name":"其他","slug":"其他","permalink":"https://hongliu.icu/categories/%E5%85%B6%E4%BB%96/"},{"name":"技术文档","slug":"技术文档","permalink":"https://hongliu.icu/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"},{"name":"手工教程","slug":"手工教程","permalink":"https://hongliu.icu/categories/%E6%89%8B%E5%B7%A5%E6%95%99%E7%A8%8B/"}],"tags":[{"name":"机器人","slug":"机器人","permalink":"https://hongliu.icu/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA/"},{"name":"计算机","slug":"计算机","permalink":"https://hongliu.icu/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"},{"name":"电子","slug":"电子","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%AD%90/"},{"name":"数电","slug":"数电","permalink":"https://hongliu.icu/tags/%E6%95%B0%E7%94%B5/"},{"name":"杂谈","slug":"杂谈","permalink":"https://hongliu.icu/tags/%E6%9D%82%E8%B0%88/"},{"name":"回忆","slug":"回忆","permalink":"https://hongliu.icu/tags/%E5%9B%9E%E5%BF%86/"},{"name":"生活","slug":"生活","permalink":"https://hongliu.icu/tags/%E7%94%9F%E6%B4%BB/"},{"name":"新年","slug":"新年","permalink":"https://hongliu.icu/tags/%E6%96%B0%E5%B9%B4/"},{"name":"国际象棋","slug":"国际象棋","permalink":"https://hongliu.icu/tags/%E5%9B%BD%E9%99%85%E8%B1%A1%E6%A3%8B/"},{"name":"笔记","slug":"笔记","permalink":"https://hongliu.icu/tags/%E7%AC%94%E8%AE%B0/"},{"name":"控制","slug":"控制","permalink":"https://hongliu.icu/tags/%E6%8E%A7%E5%88%B6/"},{"name":"西安","slug":"西安","permalink":"https://hongliu.icu/tags/%E8%A5%BF%E5%AE%89/"},{"name":"硬件","slug":"硬件","permalink":"https://hongliu.icu/tags/%E7%A1%AC%E4%BB%B6/"},{"name":"开源","slug":"开源","permalink":"https://hongliu.icu/tags/%E5%BC%80%E6%BA%90/"},{"name":"日志","slug":"日志","permalink":"https://hongliu.icu/tags/%E6%97%A5%E5%BF%97/"},{"name":"HAM","slug":"HAM","permalink":"https://hongliu.icu/tags/HAM/"},{"name":"机器人学","slug":"机器人学","permalink":"https://hongliu.icu/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%AD%A6/"},{"name":"读书笔记","slug":"读书笔记","permalink":"https://hongliu.icu/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"},{"name":"书籍","slug":"书籍","permalink":"https://hongliu.icu/tags/%E4%B9%A6%E7%B1%8D/"},{"name":"电影","slug":"电影","permalink":"https://hongliu.icu/tags/%E7%94%B5%E5%BD%B1/"},{"name":"太空","slug":"太空","permalink":"https://hongliu.icu/tags/%E5%A4%AA%E7%A9%BA/"},{"name":"RM","slug":"RM","permalink":"https://hongliu.icu/tags/RM/"},{"name":"教程","slug":"教程","permalink":"https://hongliu.icu/tags/%E6%95%99%E7%A8%8B/"},{"name":"手工","slug":"手工","permalink":"https://hongliu.icu/tags/%E6%89%8B%E5%B7%A5/"},{"name":"明日方舟","slug":"明日方舟","permalink":"https://hongliu.icu/tags/%E6%98%8E%E6%97%A5%E6%96%B9%E8%88%9F/"},{"name":"电赛","slug":"电赛","permalink":"https://hongliu.icu/tags/%E7%94%B5%E8%B5%9B/"},{"name":"数学","slug":"数学","permalink":"https://hongliu.icu/tags/%E6%95%B0%E5%AD%A6/"},{"name":"复变","slug":"复变","permalink":"https://hongliu.icu/tags/%E5%A4%8D%E5%8F%98/"},{"name":"模电","slug":"模电","permalink":"https://hongliu.icu/tags/%E6%A8%A1%E7%94%B5/"},{"name":"网站","slug":"网站","permalink":"https://hongliu.icu/tags/%E7%BD%91%E7%AB%99/"}]}