初始化提交
This commit is contained in:
3
public/mengyanote/.obsidian/app.json
vendored
Normal file
3
public/mengyanote/.obsidian/app.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"promptDelete": false
|
||||
}
|
||||
6
public/mengyanote/.obsidian/appearance.json
vendored
Normal file
6
public/mengyanote/.obsidian/appearance.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"cssTheme": "Border",
|
||||
"theme": "obsidian",
|
||||
"monospaceFontFamily": "American Typewriter",
|
||||
"baseFontSize": 16
|
||||
}
|
||||
5
public/mengyanote/.obsidian/community-plugins.json
vendored
Normal file
5
public/mengyanote/.obsidian/community-plugins.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
[
|
||||
"obsidian-livesync",
|
||||
"obsidian-style-settings",
|
||||
"obsidian-hover-editor"
|
||||
]
|
||||
33
public/mengyanote/.obsidian/core-plugins.json
vendored
Normal file
33
public/mengyanote/.obsidian/core-plugins.json
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": true,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"properties": false,
|
||||
"page-preview": true,
|
||||
"daily-notes": true,
|
||||
"templates": true,
|
||||
"note-composer": true,
|
||||
"command-palette": true,
|
||||
"slash-command": false,
|
||||
"editor-status": true,
|
||||
"bookmarks": true,
|
||||
"markdown-importer": false,
|
||||
"zk-prefixer": false,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": true,
|
||||
"slides": false,
|
||||
"audio-recorder": false,
|
||||
"workspaces": false,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": true,
|
||||
"webviewer": false,
|
||||
"footnotes": false,
|
||||
"bases": true
|
||||
}
|
||||
22
public/mengyanote/.obsidian/graph.json
vendored
Normal file
22
public/mengyanote/.obsidian/graph.json
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 1,
|
||||
"close": true
|
||||
}
|
||||
20
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/main.js
vendored
Normal file
20
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/manifest.json
vendored
Normal file
10
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/manifest.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-hover-editor",
|
||||
"name": "Hover Editor",
|
||||
"version": "0.11.26",
|
||||
"minAppVersion": "1.5.8",
|
||||
"description": "Transform the Page Preview hover popover into a fully working editor instance",
|
||||
"author": "NothingIsLost",
|
||||
"authorUrl": "https://github.com/nothingislost",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
582
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/styles.css
vendored
Normal file
582
public/mengyanote/.obsidian/plugins/obsidian-hover-editor/styles.css
vendored
Normal file
@@ -0,0 +1,582 @@
|
||||
/* @settings
|
||||
|
||||
name: Hover Editor
|
||||
id: hover-editor
|
||||
settings:
|
||||
-
|
||||
id: titlebar-heading
|
||||
title: Title bar
|
||||
type: heading
|
||||
level: 1
|
||||
collapsed: true
|
||||
-
|
||||
id: titlebar-heading
|
||||
title: Title bar background/foreground
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
-
|
||||
id: he-title-bar-active-bg
|
||||
title: Active unpinned title bar background color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-inactive-bg
|
||||
title: Inactive unpinned title bar background color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-active-pinned-bg
|
||||
title: Active pinned title bar background color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-inactive-pinned-bg
|
||||
title: Inactive pinned title bar background color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-active-fg
|
||||
title: Active title bar foreground color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-inactive-fg
|
||||
title: Inactive title bar foreground color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: titlebar-action-heading
|
||||
title: Title bar icons
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
-
|
||||
id: he-title-bar-inactive-action
|
||||
title: Title bar inactive icon color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: he-title-bar-active-action
|
||||
title: Titlebar active icon color
|
||||
type: variable-themed-color
|
||||
format: hex
|
||||
default-light: '#'
|
||||
default-dark: '#'
|
||||
-
|
||||
id: titlebar-text-heading
|
||||
title: Title bar text
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
-
|
||||
id: he-title-bar-font-size
|
||||
title: Title bar Font size
|
||||
type: variable-text
|
||||
description: Accepts any CSS font-size value
|
||||
default: 15px
|
||||
-
|
||||
id: titlebar-height-heading
|
||||
title: Title bar height
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
-
|
||||
id: he-title-bar-height
|
||||
title: Title bar height
|
||||
type: variable-text
|
||||
description: Accepts any CSS font-size value
|
||||
default: 28px
|
||||
*/
|
||||
|
||||
:root {
|
||||
/* general styling */
|
||||
--he-popover-opacity-while-dragging: 0.8;
|
||||
--he-popover-border-radius: 6px;
|
||||
--he-popover-header-transition-speed: 0.3s;
|
||||
--he-popover-snap-to-edge-transition-speed: 0.3s;
|
||||
/* resize handle sizing */
|
||||
--he-resize-handle-side-size: 12px;
|
||||
--he-resize-handle-corner-size: 18px;
|
||||
/* view header height */
|
||||
--he-view-header-height: 36px;
|
||||
}
|
||||
|
||||
body {
|
||||
--he-text-on-accent-inactive: var(--text-on-accent); /* couldn't find a good variable that worked across themes */
|
||||
--he-text-on-accent-active: #fff;
|
||||
/* z-index layer settings, probably not a good idea to mess with these */
|
||||
--he-popover-layer-inactive: calc(var(--layer-slides) - 4);
|
||||
--he-popover-layer-active: calc(var(--he-popover-layer-inactive) + 1);
|
||||
--he-popover-layer-new: calc(var(--he-popover-layer-inactive) + 2);
|
||||
--he-leaf-drag-overlay: calc(var(--he-popover-layer-inactive) + 3);
|
||||
/* calculated variables, do not modify */
|
||||
--he-resize-handle-side-offset: calc((var(--he-resize-handle-side-size) - 3px) * -1);
|
||||
--he-resize-handle-corner-offset: calc((var(--he-resize-handle-corner-size) / 2) * -1);
|
||||
--he-resize-handle-side-length: calc(100% - var(--he-resize-handle-corner-size));
|
||||
/* title bar colors */
|
||||
--he-title-bar-active-bg: var(--interactive-accent);
|
||||
--he-title-bar-inactive-bg: #777777;
|
||||
--he-title-bar-inactive-pinned-bg: #777777;
|
||||
--he-title-bar-active-pinned-bg: var(--interactive-accent);
|
||||
|
||||
--he-title-bar-active-fg: var(--he-text-on-accent-active);
|
||||
--he-title-bar-inactive-fg: var(--he-text-on-accent-inactive);
|
||||
/* title bar action/icon colors */
|
||||
--he-title-bar-inactive-action: var(--he-text-on-accent-inactive);
|
||||
--he-title-bar-active-action: var(--he-text-on-accent-active);
|
||||
/* titlebar sizing */
|
||||
--he-title-bar-height: 28px;
|
||||
--he-title-bar-font-size: 15px;
|
||||
}
|
||||
|
||||
.popover.hover-editor .workspace-leaf,
|
||||
.popover.hover-editor .workspace-split {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*
|
||||
Obsidian 1.6 sets a different background for non-root splits,
|
||||
then uses primary as an override at root. Since hover editors
|
||||
don't live in a root split, we have to copy the override:
|
||||
*/
|
||||
.popover.hover-editor .workspace-split .view-content {
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
|
||||
.popover.hover-editor {
|
||||
min-height: unset;
|
||||
max-height: unset;
|
||||
/* touch action none fixes dragging and resizing on mobile */
|
||||
touch-action: none;
|
||||
/* this is set to allow the drag/resize handles to overflow the popover frame */
|
||||
overflow: visible;
|
||||
border: none;
|
||||
padding: 0;
|
||||
z-index: var(--he-popover-layer-inactive);
|
||||
border-radius: var(--he-popover-border-radius);
|
||||
|
||||
/* Prevent snagging on titlebar */
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
.popover.hover-editor .markdown-preview-view {
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-active {
|
||||
z-index: var(--he-popover-layer-active);
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-new {
|
||||
z-index: var(--he-popover-layer-new);
|
||||
}
|
||||
|
||||
/* Drag/link overlay needs to overlay popups */
|
||||
.workspace-fake-target-overlay,
|
||||
.workspace-drop-overlay {
|
||||
z-index: var(--he-leaf-drag-overlay);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle {
|
||||
position: absolute;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.top {
|
||||
top: var(--he-resize-handle-side-offset);
|
||||
height: var(--he-resize-handle-side-size);
|
||||
left: calc(var(--he-resize-handle-corner-offset) * -1);
|
||||
width: var(--he-resize-handle-side-length);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.left {
|
||||
height: var(--he-resize-handle-side-length);
|
||||
left: var(--he-resize-handle-side-offset);
|
||||
top: calc(var(--he-resize-handle-corner-offset) * -1);
|
||||
width: var(--he-resize-handle-side-size);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.right {
|
||||
height: var(--he-resize-handle-side-length);
|
||||
right: var(--he-resize-handle-side-offset);
|
||||
top: calc(var(--he-resize-handle-corner-offset) * -1);
|
||||
width: var(--he-resize-handle-side-size);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.bottom {
|
||||
bottom: var(--he-resize-handle-side-offset);
|
||||
height: var(--he-resize-handle-side-size);
|
||||
left: calc(var(--he-resize-handle-corner-offset) * -1);
|
||||
width: var(--he-resize-handle-side-length);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.bottom-left {
|
||||
bottom: var(--he-resize-handle-corner-offset);
|
||||
height: var(--he-resize-handle-corner-size);
|
||||
left: var(--he-resize-handle-corner-offset);
|
||||
width: var(--he-resize-handle-corner-size);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.bottom-right {
|
||||
bottom: var(--he-resize-handle-corner-offset);
|
||||
height: var(--he-resize-handle-corner-size);
|
||||
right: var(--he-resize-handle-corner-offset);
|
||||
width: var(--he-resize-handle-corner-size);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.top-left {
|
||||
top: var(--he-resize-handle-corner-offset);
|
||||
height: var(--he-resize-handle-corner-size);
|
||||
left: var(--he-resize-handle-corner-offset);
|
||||
width: var(--he-resize-handle-corner-size);
|
||||
}
|
||||
|
||||
.popover.hover-editor .resize-handle.top-right {
|
||||
top: var(--he-resize-handle-corner-offset);
|
||||
height: var(--he-resize-handle-corner-size);
|
||||
right: var(--he-resize-handle-corner-offset);
|
||||
width: var(--he-resize-handle-corner-size);
|
||||
}
|
||||
|
||||
/* body.is-dragging-popover .tooltip {
|
||||
opacity: 0;
|
||||
} */
|
||||
|
||||
.popover-header-icon {
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.mod-pin-popover > svg {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.mod-pin-popover.is-active > svg {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
.popover-action,
|
||||
.popover-header-icon {
|
||||
margin: 0 8px;
|
||||
cursor: pointer;
|
||||
color: var(--he-title-bar-inactive-action);
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.popover-action.is-active,
|
||||
.mod-pin-popover.is-active {
|
||||
color: var(--he-title-bar-active-action);
|
||||
}
|
||||
|
||||
.popover-action:hover,
|
||||
.popover-header-icon:hover {
|
||||
color: var(--he-title-bar-active-action);
|
||||
}
|
||||
|
||||
.popover-action.is-active svg,
|
||||
.mod-pin-popover.is-active svg {
|
||||
}
|
||||
|
||||
.mod-pin-popover.is-active > svg {
|
||||
transform: unset;
|
||||
}
|
||||
|
||||
.popover.hover-editor .workspace-leaf-content[data-type="empty"] .view-header {
|
||||
/* ensures that minimal theme doesn't hide the popover header */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.popover.hover-editor .workspace-split > .workspace-leaf:last-child > .workspace-leaf-resize-handle {
|
||||
/* this hides the leaf resize handles that touch the edge of the popover */
|
||||
/* without this the leaf resize handles conflict with the popover resize handles */
|
||||
display: none;
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-dragging {
|
||||
opacity: var(--he-popover-opacity-while-dragging);
|
||||
}
|
||||
|
||||
.popover.hover-editor:is(.snap-to-viewport, .snap-to-left, .snap-to-right) .resize-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.popover.hover-editor.snap-to-right .resize-handle.left,
|
||||
.popover.hover-editor.snap-to-left .resize-handle.right {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-dragging.snap-to-left,
|
||||
.popover.hover-editor.is-dragging.snap-to-right,
|
||||
.popover.hover-editor.is-dragging.snap-to-viewport {
|
||||
transition: width var(--he-popover-snap-to-edge-transition-speed),
|
||||
height var(--he-popover-snap-to-edge-transition-speed), top var(--he-popover-snap-to-edge-transition-speed),
|
||||
left var(--he-popover-snap-to-edge-transition-speed);
|
||||
}
|
||||
|
||||
.hover-popover.is-dragging.snap-to-left::after,
|
||||
.hover-popover.is-dragging.snap-to-right::after,
|
||||
.hover-popover.is-dragging.snap-to-viewport::after {
|
||||
position: absolute;
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
border-radius: var(--he-popover-border-radius);
|
||||
box-shadow: inset 0px 0px 0px 4px var(--interactive-accent);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.popover.hover-editor.snap-to-left {
|
||||
max-height: unset !important;
|
||||
}
|
||||
|
||||
.popover.hover-editor.snap-to-right {
|
||||
right: 0 !important;
|
||||
max-height: unset !important;
|
||||
}
|
||||
|
||||
.popover.hover-editor.snap-to-viewport {
|
||||
max-height: unset !important;
|
||||
max-width: unset !important;
|
||||
}
|
||||
|
||||
.popover.hover-editor .popover-titlebar {
|
||||
display: flex;
|
||||
height: var(--he-title-bar-height);
|
||||
width: 100%;
|
||||
background-color: var(--he-title-bar-inactive-bg);
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-active .popover-titlebar {
|
||||
background-color: var(--he-title-bar-active-bg);
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-pinned.is-pinned .popover-titlebar {
|
||||
background-color: var(--he-title-bar-inactive-pinned-bg);
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-pinned.is-pinned.is-active .popover-titlebar {
|
||||
background-color: var(--he-title-bar-active-pinned-bg);
|
||||
}
|
||||
|
||||
.popover.hover-editor .popover-titlebar .popover-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.popover.hover-editor > .popover-content {
|
||||
margin: 0;
|
||||
border-radius: var(--he-popover-border-radius);
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.popover.hover-popover.hover-editor .pdf-toolbar:not(.pdf-findbar.mod-hidden) {
|
||||
/* Show PDF toolbar in hover editor */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.popover.hover-editor .popover-titlebar .popover-title {
|
||||
display: block;
|
||||
flex-grow: 1;
|
||||
transition: all 0.3s;
|
||||
align-self: center;
|
||||
font-size: var(--he-title-bar-font-size);
|
||||
font-weight: 500;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
color: var(--he-title-bar-inactive-fg);
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-active .popover-title {
|
||||
color: var(--he-title-bar-active-fg);
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-active .popover-title:after {
|
||||
background: linear-gradient(to right, transparent, var(--he-title-bar-active-bg));
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-pinned.is-pinned.is-active .popover-title:after {
|
||||
background: linear-gradient(to right, transparent, var(--he-title-bar-active-pinned-bg));
|
||||
}
|
||||
|
||||
.popover.hover-editor.is-pinned.is-pinned .popover-title:after {
|
||||
background: linear-gradient(to right, transparent, var(--he-title-bar-inactive-pinned-bg));
|
||||
}
|
||||
|
||||
.popover.hover-editor .popover-title:after {
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 30px;
|
||||
height: 100%;
|
||||
background: linear-gradient(to right, transparent, var(--he-title-bar-inactive-bg));
|
||||
}
|
||||
|
||||
.popover.hover-editor .mod-show-navbar svg {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.popover.hover-editor > .popover-content > .workspace-split {
|
||||
height: calc(100% - var(--he-title-bar-height));
|
||||
}
|
||||
|
||||
.popover.hover-editor .view-header {
|
||||
border-top: none;
|
||||
transition: all var(--he-popover-header-transition-speed);
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* Restore 1.5.x view header icons */
|
||||
.view-header .view-header-icon {
|
||||
display: none;
|
||||
padding: var(--size-2-2);
|
||||
margin-right: var(--size-2-3);
|
||||
color: var(--text-muted);
|
||||
align-self: center;
|
||||
cursor: grab;
|
||||
}
|
||||
.view-header .view-header-icon:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.popover.hover-editor .view-header .view-header-icon {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.popover.hover-editor.show-navbar:not(.is-minimized) .popover-title {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.popover.hover-editor:not(.show-navbar) .view-header {
|
||||
height: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.popover.hover-editor.show-navbar .view-header {
|
||||
/* theme devs: if you want to change the header height, you must do so by setting the --he-view-header-height variable */
|
||||
/* if you don't use the variable, you will break internal measurement logic */
|
||||
height: var(--he-view-header-height);
|
||||
overflow: unset;
|
||||
}
|
||||
|
||||
.popover.hover-editor:not(.show-navbar) .view-content {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.popover.hover-editor .workspace-leaf-content[data-type="image"] .view-content {
|
||||
padding: 0;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.popover.hover-editor .workspace-leaf-content[data-type="image"] img {
|
||||
display: block;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
max-width: unset;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
body .popover.hover-editor .view-content {
|
||||
/* theme devs: if you want to change the header height, you must do so by setting the --he-view-header-height variable */
|
||||
/* if you don't use the variable, you will break internal measurement logic */
|
||||
height: calc(100% - var(--he-view-header-height));
|
||||
}
|
||||
|
||||
/* start: zoomable images feature */
|
||||
|
||||
.popover.hover-editor.image-zoom .view-content .image-embed:active {
|
||||
aspect-ratio: unset;
|
||||
cursor: zoom-out;
|
||||
display: block;
|
||||
z-index: 200;
|
||||
position: fixed;
|
||||
max-height: calc(100% + 1px);
|
||||
max-width: 100%;
|
||||
height: calc(100% + 1px);
|
||||
width: 100%;
|
||||
object-fit: contain;
|
||||
margin: -0.5px auto 0;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
max-width: unset;
|
||||
}
|
||||
|
||||
/* extra specificity to override some community theme styles that cause issues */
|
||||
.popover.hover-editor.image-zoom .view-content .image-embed img:active {
|
||||
top: 50%;
|
||||
z-index: 99;
|
||||
transform: translateY(-50%);
|
||||
padding: 0;
|
||||
margin: 0 auto;
|
||||
width: calc(100% - 20px);
|
||||
height: unset;
|
||||
max-height: 95vh;
|
||||
object-fit: contain;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
position: absolute;
|
||||
opacity: 1;
|
||||
max-width: unset;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.popover.hover-editor.image-zoom .view-content .image-embed:active:after {
|
||||
background-color: var(--background-primary);
|
||||
opacity: 0.9;
|
||||
content: " ";
|
||||
height: calc(100% + 1px);
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 1px;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.popover.hover-editor.image-zoom .view-content img {
|
||||
cursor: zoom-in;
|
||||
}
|
||||
|
||||
/* extra specificity to override some community theme styles that cause issues */
|
||||
.popover.hover-editor.image-zoom .workspace-leaf-content[data-type="image"] img {
|
||||
cursor: zoom-in;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
object-fit: contain;
|
||||
height: unset;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
position: absolute;
|
||||
opacity: 1;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
/* end: zoomable images feature */
|
||||
158
public/mengyanote/.obsidian/plugins/obsidian-livesync/data.json
vendored
Normal file
158
public/mengyanote/.obsidian/plugins/obsidian-livesync/data.json
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"remoteType": "",
|
||||
"useCustomRequestHandler": false,
|
||||
"couchDB_URI": "",
|
||||
"couchDB_USER": "",
|
||||
"couchDB_PASSWORD": "",
|
||||
"couchDB_DBNAME": "",
|
||||
"liveSync": false,
|
||||
"syncOnSave": true,
|
||||
"syncOnStart": true,
|
||||
"savingDelay": 200,
|
||||
"lessInformationInLog": false,
|
||||
"gcDelay": 0,
|
||||
"versionUpFlash": "",
|
||||
"minimumChunkSize": 20,
|
||||
"longLineThreshold": 250,
|
||||
"showVerboseLog": false,
|
||||
"suspendFileWatching": false,
|
||||
"trashInsteadDelete": true,
|
||||
"periodicReplication": true,
|
||||
"periodicReplicationInterval": 60,
|
||||
"syncOnFileOpen": true,
|
||||
"encrypt": false,
|
||||
"passphrase": "",
|
||||
"usePathObfuscation": false,
|
||||
"doNotDeleteFolder": false,
|
||||
"resolveConflictsByNewerFile": false,
|
||||
"batchSave": true,
|
||||
"batchSaveMinimumDelay": 5,
|
||||
"batchSaveMaximumDelay": 60,
|
||||
"deviceAndVaultName": "",
|
||||
"usePluginSettings": false,
|
||||
"showOwnPlugins": false,
|
||||
"showStatusOnEditor": true,
|
||||
"showStatusOnStatusbar": true,
|
||||
"showOnlyIconsOnEditor": false,
|
||||
"hideFileWarningNotice": false,
|
||||
"usePluginSync": false,
|
||||
"autoSweepPlugins": false,
|
||||
"autoSweepPluginsPeriodic": false,
|
||||
"notifyPluginOrSettingUpdated": false,
|
||||
"checkIntegrityOnSave": false,
|
||||
"batch_size": 25,
|
||||
"batches_limit": 25,
|
||||
"useHistory": true,
|
||||
"disableRequestURI": true,
|
||||
"skipOlderFilesOnSync": true,
|
||||
"checkConflictOnlyOnOpen": false,
|
||||
"showMergeDialogOnlyOnActive": false,
|
||||
"syncInternalFiles": false,
|
||||
"syncInternalFilesBeforeReplication": false,
|
||||
"syncInternalFilesIgnorePatterns": "\\/node_modules\\/, \\/\\.git\\/, \\/obsidian-livesync\\/",
|
||||
"syncInternalFilesTargetPatterns": "",
|
||||
"syncInternalFilesInterval": 60,
|
||||
"additionalSuffixOfDatabaseName": "64ee792396a31ce1",
|
||||
"ignoreVersionCheck": false,
|
||||
"lastReadUpdates": 25,
|
||||
"deleteMetadataOfDeletedFiles": false,
|
||||
"syncIgnoreRegEx": "",
|
||||
"syncOnlyRegEx": "",
|
||||
"customChunkSize": 60,
|
||||
"readChunksOnline": true,
|
||||
"watchInternalFileChanges": true,
|
||||
"automaticallyDeleteMetadataOfDeletedFiles": 0,
|
||||
"disableMarkdownAutoMerge": false,
|
||||
"writeDocumentsIfConflicted": false,
|
||||
"useDynamicIterationCount": false,
|
||||
"syncAfterMerge": true,
|
||||
"configPassphraseStore": "",
|
||||
"encryptedPassphrase": "",
|
||||
"encryptedCouchDBConnection": "%$Uukeo12Pgs5baxCUGOX3mFwYVrSAEKjTp71bZM0ksyYOD73jzNGIadNLYC2doeXSXRIOZMe8gzbNAT4xr7/eDVD6PlQZR9sHbSpjf72zzI75i0YefndafQiCQ/0ZD7g3T+7bxS7Xa5421ysRvfiPG/AUxUAp2G2L9wBelAVcOPFSjIDlV83JZvQ8JdSjEGTCrwlXev8HlFvqGoeIaM8Z0ZD4yIn9RNKGnVNAnwugsjkkkReG9YgJBu6ac4lGijbEQct/NrfnZ9h2p9Y9ooUmC64ZiUn9WLaJnp4vocuRZc0UW4gA0VtVLQlsKvckJizSNrr2gftcJqj0Bxgu2e6wSP/8bZZOeTZYwMqCMHS5SchV/I9CHuzOhmFvqoEaZDGK1XPMmalw5S9vKQR0j6m56SzIXaZAQ45KmJIirijXme+FDwabZkafd/Jx4IvU15rP3K0Y13ByhxN37Eklj0vLXOY44F8KdeBvx+0yhTxvzN/pn2iYfM0wmvzxlCMIqlpyd5OiTp+swjs9+Rp7rVmwC7FzDegvBR7ZNHyeKqUP+NSk0ssCSvA9QwXyV7vPvW5npiDh7zPN/RPkHTQCwxbjg5Lth/gCsfyR2bBK3YxlM5x5+GVTw2RUoVdSXn4G9ziH+jdLDTWzBvRORPHel4x753CqL6nIU0bVZZRxIJavXXwm+UosQst53HqptDI2dBSCvDC7Xnk=",
|
||||
"permitEmptyPassphrase": false,
|
||||
"useIndexedDBAdapter": true,
|
||||
"useTimeouts": false,
|
||||
"writeLogToTheFile": false,
|
||||
"doNotPaceReplication": false,
|
||||
"hashCacheMaxCount": 300,
|
||||
"hashCacheMaxAmount": 50,
|
||||
"concurrencyOfReadChunksOnline": 30,
|
||||
"minimumIntervalOfReadChunksOnline": 25,
|
||||
"hashAlg": "xxhash64",
|
||||
"suspendParseReplicationResult": false,
|
||||
"doNotSuspendOnFetching": false,
|
||||
"useIgnoreFiles": false,
|
||||
"ignoreFiles": ".gitignore",
|
||||
"syncOnEditorSave": true,
|
||||
"pluginSyncExtendedSetting": {},
|
||||
"syncMaxSizeInMB": 50,
|
||||
"settingSyncFile": "",
|
||||
"writeCredentialsForSettingSync": false,
|
||||
"notifyAllSettingSyncFile": false,
|
||||
"isConfigured": true,
|
||||
"settingVersion": 10,
|
||||
"enableCompression": false,
|
||||
"accessKey": "",
|
||||
"bucket": "",
|
||||
"endpoint": "",
|
||||
"region": "",
|
||||
"secretKey": "",
|
||||
"useEden": false,
|
||||
"maxChunksInEden": 10,
|
||||
"maxTotalLengthInEden": 1024,
|
||||
"maxAgeInEden": 10,
|
||||
"disableCheckingConfigMismatch": false,
|
||||
"displayLanguage": "zh",
|
||||
"enableChunkSplitterV2": false,
|
||||
"disableWorkerForGeneratingChunks": false,
|
||||
"processSmallFilesInUIThread": false,
|
||||
"notifyThresholdOfRemoteStorageSize": 0,
|
||||
"usePluginSyncV2": true,
|
||||
"usePluginEtc": false,
|
||||
"handleFilenameCaseSensitive": false,
|
||||
"doNotUseFixedRevisionForChunks": true,
|
||||
"showLongerLogInsideEditor": false,
|
||||
"sendChunksBulk": false,
|
||||
"sendChunksBulkMaxSize": 1,
|
||||
"useSegmenter": false,
|
||||
"useAdvancedMode": false,
|
||||
"usePowerUserMode": false,
|
||||
"useEdgeCaseMode": false,
|
||||
"enableDebugTools": false,
|
||||
"suppressNotifyHiddenFilesChange": false,
|
||||
"syncMinimumInterval": 2000,
|
||||
"P2P_Enabled": false,
|
||||
"P2P_AutoAccepting": 0,
|
||||
"P2P_AppID": "self-hosted-livesync",
|
||||
"P2P_roomID": "",
|
||||
"P2P_passphrase": "",
|
||||
"P2P_relays": "wss://exp-relay.vrtmrz.net/",
|
||||
"P2P_AutoBroadcast": false,
|
||||
"P2P_AutoStart": false,
|
||||
"P2P_AutoSyncPeers": "",
|
||||
"P2P_AutoWatchPeers": "",
|
||||
"P2P_SyncOnReplication": "",
|
||||
"P2P_RebuildFrom": "",
|
||||
"P2P_AutoAcceptingPeers": "",
|
||||
"P2P_AutoDenyingPeers": "",
|
||||
"P2P_IsHeadless": false,
|
||||
"doctorProcessedVersion": "0.25.0",
|
||||
"bucketCustomHeaders": "",
|
||||
"couchDB_CustomHeaders": "",
|
||||
"useJWT": false,
|
||||
"jwtAlgorithm": "",
|
||||
"jwtKey": "",
|
||||
"jwtKid": "",
|
||||
"jwtSub": "",
|
||||
"jwtExpDuration": 5,
|
||||
"useRequestAPI": false,
|
||||
"bucketPrefix": "",
|
||||
"chunkSplitterVersion": "",
|
||||
"E2EEAlgorithm": "",
|
||||
"processSizeMismatchedFiles": false,
|
||||
"forcePathStyle": true,
|
||||
"configPassphrase": "",
|
||||
"preset": "",
|
||||
"syncMode": "ONEVENTS",
|
||||
"dummy": 0
|
||||
}
|
||||
19
public/mengyanote/.obsidian/plugins/obsidian-livesync/main.js
vendored
Normal file
19
public/mengyanote/.obsidian/plugins/obsidian-livesync/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
public/mengyanote/.obsidian/plugins/obsidian-livesync/manifest.json
vendored
Normal file
10
public/mengyanote/.obsidian/plugins/obsidian-livesync/manifest.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-livesync",
|
||||
"name": "Self-hosted LiveSync",
|
||||
"version": "0.25.16",
|
||||
"minAppVersion": "0.9.12",
|
||||
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
||||
"author": "vorotamoroz",
|
||||
"authorUrl": "https://github.com/vrtmrz",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
472
public/mengyanote/.obsidian/plugins/obsidian-livesync/styles.css
vendored
Normal file
472
public/mengyanote/.obsidian/plugins/obsidian-livesync/styles.css
vendored
Normal file
@@ -0,0 +1,472 @@
|
||||
.added {
|
||||
color: var(--text-on-accent);
|
||||
background-color: var(--text-accent);
|
||||
}
|
||||
|
||||
.normal {
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.deleted {
|
||||
color: var(--text-on-accent);
|
||||
background-color: var(--text-muted);
|
||||
}
|
||||
|
||||
.conflict-dev-name {
|
||||
display: inline-block;
|
||||
min-width: 5em;
|
||||
}
|
||||
|
||||
.op-scrollable {
|
||||
overflow-y: scroll;
|
||||
/* min-height: 280px; */
|
||||
max-height: 280px;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.op-pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.op-warn {
|
||||
border: 1px solid salmon;
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.op-warn::before {
|
||||
content: "Warning";
|
||||
font-weight: bold;
|
||||
color: salmon;
|
||||
position: relative;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.op-warn-info {
|
||||
border: 1px solid rgb(255, 209, 81);
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.op-warn-info::before {
|
||||
content: "Notice";
|
||||
font-weight: bold;
|
||||
color: rgb(255, 209, 81);
|
||||
position: relative;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.syncstatusbar {
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
.tcenter {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sls-plugins-wrap {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
max-height: 50vh;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.sls-plugins-tbl {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
width: 100%;
|
||||
max-height: 80%;
|
||||
}
|
||||
|
||||
.divider th {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.sls-header-button {
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
.sls-hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:root {
|
||||
--sls-log-text: "";
|
||||
}
|
||||
|
||||
.sls-troubleshoot-preview {
|
||||
max-width: max-content;
|
||||
}
|
||||
|
||||
.sls-troubleshoot-preview img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.sls-setting-tab {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.sls-setting-menu-btn {
|
||||
color: var(--text-normal);
|
||||
background-color: var(--background-secondary-alt);
|
||||
border-radius: 4px 4px 0 0;
|
||||
padding: 6px 10px;
|
||||
cursor: pointer;
|
||||
margin-right: 12px;
|
||||
font-family: "Inter", sans-serif;
|
||||
outline: none;
|
||||
user-select: none;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
flex-shrink: 1;
|
||||
}
|
||||
|
||||
.sls-setting-label.selected {
|
||||
/* order: 1; */
|
||||
flex-grow: 1;
|
||||
/* width: 100%; */
|
||||
}
|
||||
|
||||
.sls-setting-tab:hover~div.sls-setting-menu-btn,
|
||||
.sls-setting-label.selected .sls-setting-tab:checked~div.sls-setting-menu-btn {
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.sls-setting-menu-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background-color: rgba(var(--background-primary), 0.3);
|
||||
backdrop-filter: blur(4px);
|
||||
border-radius: 4px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.sls-setting-menu {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
body {
|
||||
--sls-col-transparent: transparent;
|
||||
--sls-col-warn: rgba(var(--background-modifier-error-rgb), 0.1);
|
||||
--sls-col-warn-stripe1: var(--sls-col-transparent);
|
||||
--sls-col-warn-stripe2: var(--sls-col-warn);
|
||||
}
|
||||
|
||||
.sls-setting-menu-buttons {
|
||||
border: 1px solid var(--sls-col-warn);
|
||||
padding: 2px;
|
||||
margin: 1px;
|
||||
border-radius: 4px;
|
||||
background-image: linear-gradient(-45deg,
|
||||
var(--sls-col-warn-stripe1) 25%, var(--sls-col-warn-stripe2) 25%, var(--sls-col-warn-stripe2) 50%,
|
||||
var(--sls-col-warn-stripe1) 50%, var(--sls-col-warn-stripe1) 75%, var(--sls-col-warn-stripe2) 75%, var(--sls-col-warn-stripe2));
|
||||
background-size: 30px 30px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-end;
|
||||
padding: 0.5em 0.25em;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
/* transition: background-position 1s; */
|
||||
animation: sls-scroll-warn 1s linear 0s infinite;
|
||||
}
|
||||
|
||||
@keyframes sls-scroll-warn {
|
||||
0% {
|
||||
background-position: 0 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
background-position: 30px 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.sls-setting-menu-buttons label {
|
||||
margin-right: auto;
|
||||
flex-grow: 1;
|
||||
color: var(--text-warning);
|
||||
}
|
||||
|
||||
.sls-setting-label {
|
||||
flex-grow: 1;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.setting-collapsed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-plugins-tbl-buttons {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.sls-plugins-tbl-buttons button {
|
||||
flex-grow: 0;
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
.sls-plugins-tbl-device-head {
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
.op-flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.op-flex input {
|
||||
display: inline-flex;
|
||||
flex-grow: 1;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.op-info {
|
||||
display: inline-flex;
|
||||
flex-grow: 1;
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
width: 100%;
|
||||
margin-bottom: 4px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.history-added {
|
||||
color: var(--text-on-accent);
|
||||
background-color: var(--text-accent);
|
||||
}
|
||||
|
||||
.history-normal {
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.history-deleted {
|
||||
color: var(--text-on-accent);
|
||||
background-color: var(--text-muted);
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.ob-btn-config-fix label {
|
||||
margin-right: 40px;
|
||||
}
|
||||
|
||||
.ob-btn-config-info {
|
||||
border: 1px solid salmon;
|
||||
padding: 2px;
|
||||
margin: 1px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.ob-btn-config-head {
|
||||
padding: 2px;
|
||||
margin: 1px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.isWizard .wizardHidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-setting:not(.isWizard) .wizardOnly {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-item-dirty::before {
|
||||
content: "✏";
|
||||
}
|
||||
|
||||
.sls-item-dirty-help::after {
|
||||
content: " ❓";
|
||||
}
|
||||
|
||||
.sls-item-invalid-value {
|
||||
background-color: rgba(var(--background-modifier-error-rgb), 0.3) !important;
|
||||
}
|
||||
|
||||
.sls-setting-disabled input[type=text],
|
||||
.sls-setting-disabled input[type=number],
|
||||
.sls-setting-disabled input[type=password] {
|
||||
filter: brightness(80%);
|
||||
color: var(--text-muted);
|
||||
|
||||
}
|
||||
|
||||
.sls-setting-hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.sls-setting-obsolete {
|
||||
background-image: linear-gradient(-45deg,
|
||||
var(--sls-col-warn-stripe1) 25%, var(--sls-col-warn-stripe2) 25%, var(--sls-col-warn-stripe2) 50%,
|
||||
var(--sls-col-warn-stripe1) 50%, var(--sls-col-warn-stripe1) 75%, var(--sls-col-warn-stripe2) 75%, var(--sls-col-warn-stripe2));
|
||||
background-image: linear-gradient(-45deg,
|
||||
transparent 25%, rgba(var(--background-secondary), 0.1) 25%, rgba(var(--background-secondary), 0.1) 50%, transparent 50%, transparent 75%, rgba(var(--background-secondary), 0.1) 75%, rgba(var(--background-secondary), 0.1));
|
||||
background-size: 60px 60px;
|
||||
}
|
||||
|
||||
.password-input>.setting-item-control>input {
|
||||
-webkit-text-security: disc;
|
||||
}
|
||||
|
||||
span.ls-mark-cr::after {
|
||||
user-select: none;
|
||||
content: "↲";
|
||||
color: var(--text-muted);
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.deleted span.ls-mark-cr::after {
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.ls-imgdiff-wrap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ls-imgdiff-wrap .overlay {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.ls-imgdiff-wrap .overlay .img-base {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.ls-imgdiff-wrap .overlay .img-overlay {
|
||||
-webkit-filter: invert(100%) opacity(50%);
|
||||
filter: invert(100%) opacity(50%);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
animation: ls-blink-diff 0.5s cubic-bezier(0.4, 0, 1, 1) infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes ls-blink-diff {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.livesync-status {
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
height: auto;
|
||||
min-height: 1em;
|
||||
position: absolute;
|
||||
background-color: transparent;
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
padding-right: 16px;
|
||||
top: var(--header-height);
|
||||
z-index: calc(var(--layer-cover) + 1);
|
||||
|
||||
font-variant-numeric: tabular-nums;
|
||||
tab-size: 4;
|
||||
text-align: right;
|
||||
white-space: pre-wrap;
|
||||
display: inline-block;
|
||||
color: var(--text-normal);
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div.workspace-leaf-content[data-type=bases] .livesync-status {
|
||||
top: calc(var(--bases-header-height) + var(--header-height));
|
||||
padding: 5px;
|
||||
padding-right:18px;
|
||||
}
|
||||
|
||||
.is-mobile div.workspace-leaf-content[data-type=bases] .livesync-status {
|
||||
top: calc(var(--bases-header-height) + var(--view-header-height));
|
||||
padding: 6px;
|
||||
padding-right:18px;
|
||||
}
|
||||
|
||||
.livesync-status div {
|
||||
opacity: 0.6;
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
.livesync-status .livesync-status-loghistory {
|
||||
text-align: left;
|
||||
opacity: 0.4;
|
||||
|
||||
}
|
||||
|
||||
.livesync-status div.livesync-status-messagearea {
|
||||
opacity: 0.6;
|
||||
color: var(--text-on-accent);
|
||||
background: var(--background-modifier-error);
|
||||
-webkit-filter: unset;
|
||||
filter: unset;
|
||||
}
|
||||
|
||||
|
||||
.menu-setting-poweruser-disabled .sls-setting-poweruser {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.menu-setting-advanced-disabled .sls-setting-advanced {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.menu-setting-edgecase-disabled .sls-setting-edgecase {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-setting-panel-title {
|
||||
position: sticky;
|
||||
}
|
||||
|
||||
.sls-setting-panel-title {
|
||||
top: 2em;
|
||||
background-color: rgba(var(--background-primary), 0.3);
|
||||
backdrop-filter: blur(4px);
|
||||
border-radius: 30%;
|
||||
}
|
||||
|
||||
.sls-dialogue-note-wrapper {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.sls-dialogue-note-countdown {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.sls-qr {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
max-width: max-content;
|
||||
}
|
||||
|
||||
.sls-keypair pre {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
|
||||
}
|
||||
51
public/mengyanote/.obsidian/plugins/obsidian-style-settings/data.json
vendored
Normal file
51
public/mengyanote/.obsidian/plugins/obsidian-style-settings/data.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"Appearance-light@@theme-light-style-select": "theme-light-background-adapt",
|
||||
"Appearance-light@@mod-left-split-background-select-light": "mod-left-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-left-CSS-light": "radial-gradient(100% 50% at 100% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)",
|
||||
"Appearance-light@@background-mod-left-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@mod-right-split-background-select-light": "mod-right-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-right-CSS-light": "radial-gradient(100% 50% at 0% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)",
|
||||
"Appearance-light@@background-mod-right-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@mod-root-split-background-select-light": "mod-root-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-root-CSS-light": "transparent",
|
||||
"Appearance-light@@background-mod-root-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@background-underlying-select-light": "background-underlying-CSS-light",
|
||||
"Appearance-light@@background-underlying-CSS-light": "linear-gradient(168.44deg, #D7DAEA 1.62%, #F2F2F8 95.72%)",
|
||||
"Appearance-light@@background-underlying-CSS-blend-mode-light": "normal",
|
||||
"Appearance-light@@card-border-radius-light": "0px",
|
||||
"Appearance-light@@card-shadow-light": "none",
|
||||
"Appearance-light@@background-activated-tab-header-light": "radial-gradient(50% 150% at 50% 150%, #F8F9FF 0%, rgba(97, 54, 144, 0) 100%)",
|
||||
"Appearance-light@@shadow-activated-tab-header-light": "none",
|
||||
"Appearance-light@@Active-states-file-explorer-select-light": "activated-file-tab-style-light",
|
||||
"Appearance-light@@workspace-divider-transparent-light": true,
|
||||
"Components@@CTA-BTN-enable": true,
|
||||
"Components@@file-names-untrim": true,
|
||||
"Components@@folder-font-bold": true,
|
||||
"Components@@colorful-folder": true,
|
||||
"Components@@file-icon-remove": false,
|
||||
"Components@@outline-enhanced": true,
|
||||
"Components@@new-tab-btn-select": "new-tab-btn-default",
|
||||
"Components@@immersive-canvas": true,
|
||||
"Components@@scrollbar-hide": true,
|
||||
"Appearance-light@@card-layout-open-light": true,
|
||||
"Appearance-light@@accent-color-override-light": false,
|
||||
"Appearance-light@@card-highlight-light": true,
|
||||
"Editor@@line-hover-indicator": true,
|
||||
"Editor@@focus-indicator-codeblock-line-number": true,
|
||||
"Editor@@focus-indicator-list-level": true,
|
||||
"Editor@@editor-grid-background-pattren": true,
|
||||
"Editor@@inline-title-divider-remove": true,
|
||||
"Editor@@h1-divider-on": true,
|
||||
"Editor@@h2-divider-on": true,
|
||||
"Editor@@h3-divider-on": true,
|
||||
"Editor@@h4-divider-on": true,
|
||||
"Editor@@h5-divider-on": true,
|
||||
"Editor@@h6-divider-on": true,
|
||||
"Editor@@text-align-justify": true,
|
||||
"Editor@@bold-color@@light": "#4781EC",
|
||||
"Editor@@italic-color@@light": "#FF4BFE",
|
||||
"Editor@@img-center-align": true,
|
||||
"Mobile@@drawer-phone-full-width": true,
|
||||
"Mobile@@card-layout-pad-open": true,
|
||||
"Plugin@@colorful-checkbox": true
|
||||
}
|
||||
165
public/mengyanote/.obsidian/plugins/obsidian-style-settings/main.js
vendored
Normal file
165
public/mengyanote/.obsidian/plugins/obsidian-style-settings/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
public/mengyanote/.obsidian/plugins/obsidian-style-settings/manifest.json
vendored
Normal file
10
public/mengyanote/.obsidian/plugins/obsidian-style-settings/manifest.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-style-settings",
|
||||
"name": "Style Settings",
|
||||
"version": "1.0.9",
|
||||
"minAppVersion": "0.11.5",
|
||||
"description": "Offers controls for adjusting theme, plugin, and snippet CSS variables.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-style-settings",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
243
public/mengyanote/.obsidian/plugins/obsidian-style-settings/styles.css
vendored
Normal file
243
public/mengyanote/.obsidian/plugins/obsidian-style-settings/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
37
public/mengyanote/.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
37
public/mengyanote/.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
public/mengyanote/.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
11
public/mengyanote/.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "templater-obsidian",
|
||||
"name": "Templater",
|
||||
"version": "2.14.1",
|
||||
"description": "Create and use templates",
|
||||
"minAppVersion": "1.5.0",
|
||||
"author": "SilentVoid",
|
||||
"authorUrl": "https://github.com/SilentVoid13",
|
||||
"helpUrl": "https://silentvoid13.github.io/Templater/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
220
public/mengyanote/.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
220
public/mengyanote/.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
.templater_search {
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
|
||||
.templater_div {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.templater_div > .setting-item {
|
||||
border-top: none !important;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_div > .setting-item > .setting-item-control {
|
||||
justify-content: space-around;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div
|
||||
> .setting-item
|
||||
> .setting-item-control
|
||||
> .setting-editor-extra-setting-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_donating {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.templater_title {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-top: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.templater_template {
|
||||
align-self: center;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.templater_cmd {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div2 > .setting-item {
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.templater-prompt-div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.templater-prompt-form {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-prompt-input {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-button-div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input {
|
||||
height: 10rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input:focus {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-command-bg {
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command {
|
||||
font-size: 0.85em;
|
||||
font-family: var(--font-monospace);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-inline .cm-templater-command {
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
|
||||
color: var(--code-property, #008bff);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
|
||||
color: var(--code-function, #c0d700);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-keyword {
|
||||
color: var(--code-keyword, #00a7aa);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-atom {
|
||||
color: var(--code-normal, #f39b35);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-value,
|
||||
.cm-s-obsidian .cm-templater-command.cm-number,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type {
|
||||
color: var(--code-value, #a06fca);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
|
||||
color: var(--code-normal, var(--text-normal));
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-property,
|
||||
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-attribute {
|
||||
color: var(--code-function, #98e342);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-2,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-3,
|
||||
.cm-s-obsidian .cm-templater-command.cm-meta {
|
||||
color: var(--code-property, #d4d4d4);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-callee,
|
||||
.cm-s-obsidian .cm-templater-command.cm-operator,
|
||||
.cm-s-obsidian .cm-templater-command.cm-qualifier,
|
||||
.cm-s-obsidian .cm-templater-command.cm-builtin {
|
||||
color: var(--code-operator, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-tag {
|
||||
color: var(--code-tag, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
|
||||
color: var(--code-comment, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-string,
|
||||
.cm-s-obsidian .cm-templater-command.cm-string-2 {
|
||||
color: var(--code-string, #e6db74);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-header,
|
||||
.cm-s-obsidian .cm-templater-command.cm-hr {
|
||||
color: var(--code-keyword, #da7dae);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-link {
|
||||
color: var(--code-normal, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-error {
|
||||
border-bottom: 1px solid #c42412;
|
||||
}
|
||||
|
||||
.CodeMirror-hints {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
border-radius: 3px;
|
||||
border: 1px solid silver;
|
||||
|
||||
background: white;
|
||||
font-size: 90%;
|
||||
font-family: monospace;
|
||||
|
||||
max-height: 20em;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.CodeMirror-hint {
|
||||
margin: 0;
|
||||
padding: 0 4px;
|
||||
border-radius: 2px;
|
||||
white-space: pre;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.CodeMirror-hint-active {
|
||||
background: #08f;
|
||||
color: white;
|
||||
}
|
||||
7
public/mengyanote/.obsidian/themes/Border/manifest.json
vendored
Normal file
7
public/mengyanote/.obsidian/themes/Border/manifest.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Border",
|
||||
"version": "1.12.11",
|
||||
"minAppVersion": "0.16.0",
|
||||
"author": "Akifyss",
|
||||
"authorUrl": "https://github.com/Akifyss"
|
||||
}
|
||||
9307
public/mengyanote/.obsidian/themes/Border/theme.css
vendored
Normal file
9307
public/mengyanote/.obsidian/themes/Border/theme.css
vendored
Normal file
File diff suppressed because one or more lines are too long
8
public/mengyanote/.obsidian/themes/Minimal/manifest.json
vendored
Normal file
8
public/mengyanote/.obsidian/themes/Minimal/manifest.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Minimal",
|
||||
"version": "7.6.0",
|
||||
"minAppVersion": "1.6.0",
|
||||
"author": "@kepano",
|
||||
"authorUrl": "https://twitter.com/kepano",
|
||||
"fundingUrl": "https://www.buymeacoffee.com/kepano"
|
||||
}
|
||||
2150
public/mengyanote/.obsidian/themes/Minimal/theme.css
vendored
Normal file
2150
public/mengyanote/.obsidian/themes/Minimal/theme.css
vendored
Normal file
File diff suppressed because one or more lines are too long
228
public/mengyanote/.obsidian/workspace.json
vendored
Normal file
228
public/mengyanote/.obsidian/workspace.json
vendored
Normal file
@@ -0,0 +1,228 @@
|
||||
{
|
||||
"main": {
|
||||
"id": "0d497f6739ef6df9",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "306ec49a61f877d3",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "8304b0e105b08ed0",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "树萌芽的小本本/目前已部署网站.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "目前已部署网站"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0e0e3e5c345789e5",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Docker/Docker命令集合.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Docker命令集合"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "dd92142da425da5d",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "18712eeca302c86a",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "f1c17e2d203acce4",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical",
|
||||
"autoReveal": false
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "文件列表"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0d80743f19037256",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "搜索"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "29759c335a3c0889",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "书签"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300
|
||||
},
|
||||
"right": {
|
||||
"id": "a00fc03fc4170f30",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "553118af57cf253c",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "330eb3c82c280cae",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "反向链接"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "a11bb24aba14d458",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "出链"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "66a43be089eb76fa",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "标签"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "5e4383b603638cf4",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "大纲"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300,
|
||||
"collapsed": true
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"bases:创建新数据库": false,
|
||||
"switcher:打开快速切换": false,
|
||||
"graph:查看关系图谱": false,
|
||||
"canvas:新建白板": false,
|
||||
"daily-notes:打开/创建今天的日记": false,
|
||||
"templates:插入模板": false,
|
||||
"command-palette:打开命令面板": false,
|
||||
"obsidian-livesync:Show Log": false,
|
||||
"obsidian-livesync:Replicate": false,
|
||||
"obsidian-livesync:P2P Replicator": false,
|
||||
"obsidian-livesync:Show Customization sync": false
|
||||
}
|
||||
},
|
||||
"active": "8304b0e105b08ed0",
|
||||
"lastOpenFiles": [
|
||||
"树萌芽的小本本/网站小技巧.md",
|
||||
"树萌芽的小本本/目前已部署网站.md",
|
||||
"Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md",
|
||||
"Docker/优秀好用的Docker镜像/Postgres数据库.md",
|
||||
"Docker/优秀好用的Docker镜像/未命名.md",
|
||||
"临时解决方案/2025年大一下暑假规划(大方向).md",
|
||||
"树萌芽的小本本/树萌芽の编程想法.md",
|
||||
"树萌芽的小本本/检测IP的网站.md",
|
||||
"树萌芽的小本本/重要信息记录.md",
|
||||
"Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md",
|
||||
"Docker/Docker命令集合.md",
|
||||
"Docker/优秀好用的Docker镜像/MySQL数据库.md",
|
||||
"Docker/优秀好用的Docker镜像/MongoDB数据库.md",
|
||||
"Docker/优秀好用的Docker镜像/Redis数据库.md",
|
||||
"Docker/Docker 镜像相关.md",
|
||||
"Docker/优秀好用的Docker镜像",
|
||||
"Docker",
|
||||
"大萌芽-Debian13服务器.md",
|
||||
"Docker/Docker镜像快速迁移.md",
|
||||
"无线-HCIA 02.md",
|
||||
"Linux相关/把Ubuntu镜像源切换到阿里云.md",
|
||||
"编程语言/Android/安卓Gradle构建常用命令总结.md",
|
||||
"临时解决方案/修改hosts方式来直连Github.md",
|
||||
"临时解决方案/萌芽云剪切板.md",
|
||||
"2025年9月紧急规划.md",
|
||||
"树萌芽制作的小东西/网站/万象口袋/软件名字.md",
|
||||
"树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md",
|
||||
"树萌芽制作的小东西/网站/树萌芽API集合/API目录.md",
|
||||
"树萌芽制作的小东西/网站/树萌芽API集合",
|
||||
"树萌芽制作的小东西/网站/万象口袋",
|
||||
"编程语言/Golang",
|
||||
"编程语言/CSharp",
|
||||
"编程语言/C++",
|
||||
"编程语言/C语言",
|
||||
"编程语言",
|
||||
"计算机网络",
|
||||
"图片文件夹/Screenshot_20250717_225309.jpg",
|
||||
"Screenshot_20250717_225309.jpg"
|
||||
]
|
||||
}
|
||||
5
public/mengyanote/2025年9月紧急规划.md
Normal file
5
public/mengyanote/2025年9月紧急规划.md
Normal file
@@ -0,0 +1,5 @@
|
||||
1.数媒大赛-使用萌芽农场参赛❌✅
|
||||
2.华为ICT大赛,网络赛道,实践赛道
|
||||
3.学习Java面向对象,顺便学习JavaSpring
|
||||
4.Linux 红帽发行版9安装学习 ✅
|
||||
5.计算机网络
|
||||
11
public/mengyanote/AI大语言模型玩法/AI提示词工程/AI绘画提示词.md
Normal file
11
public/mengyanote/AI大语言模型玩法/AI提示词工程/AI绘画提示词.md
Normal file
@@ -0,0 +1,11 @@
|
||||
*by 树萌芽*
|
||||
|
||||
**图片风格为2D像素像素化风格,比例 「1:1」 画一个游戏道具,背景是纯黑色,纯黑色**
|
||||
**不带任何文字,没有任何文字,现在我要你画 一个闪闪发光的金黄色金币卡**
|
||||
|
||||
|
||||
**图片风格为2D像素风格,比例 「1:1」 画一个游戏元素,风格为2.5D 就是上帝视角,就是正交斜视角那种有立体感,背景是纯黑色,纯黑色 不带任何文字,现在我要你画一个**
|
||||
**一丛茂密的灌木丛 记住一定要3d立体感 只要 灌木丛 只要 灌木丛!**
|
||||
|
||||
|
||||
比例 「1:1」图片风格为2D像素风格, 画一个游戏装饰元素,风格为2.5D 就是上帝视角,就是正交斜视角那种有立体感,背景是纯黑色,纯黑色 不带任何文字,现在我要你画一个 占卜测运算命台 相关的装饰可以多一点 记住一定要3d立体感
|
||||
3
public/mengyanote/AI大语言模型玩法/AI提示词工程/开发前后端分离网站提示词.md
Normal file
3
public/mengyanote/AI大语言模型玩法/AI提示词工程/开发前后端分离网站提示词.md
Normal file
@@ -0,0 +1,3 @@
|
||||
1.取消CORS跨域限制,允许任何链接
|
||||
2.前端使用React框架,后端使用python的Flask框架
|
||||
3.前端修改在frontend文件夹,后端修改在backend文件夹
|
||||
80
public/mengyanote/AI大语言模型玩法/Qwen-Code命令行安装使用教程.md
Normal file
80
public/mengyanote/AI大语言模型玩法/Qwen-Code命令行安装使用教程.md
Normal file
@@ -0,0 +1,80 @@
|
||||
**Qwen Code** 是一个 CLI 工具,修改自 **Gemini CLI**,针对 Qwen3‑Coder系列的模型增强了解析器和工具支持。
|
||||
|
||||
确保已安装 Node.js 20 及以上版本,可以通过以下命令安装:
|
||||
|
||||
```bash
|
||||
curl -qL https://www.npmjs.com/install.sh | sh
|
||||
```
|
||||
|
||||
然后通过 npm 管理器安装 Qwen Code:
|
||||
|
||||
```bash
|
||||
npm i -g @qwen-code/qwen-code
|
||||
```
|
||||
|
||||
> 另一种方式是从源码安装:
|
||||
>
|
||||
> ```bash
|
||||
> git clone https://github.com/QwenLM/qwen-code.git
|
||||
> cd qwen-code && npm install && npm install -g
|
||||
> ```
|
||||
|
||||
Qwen Code 支持 OpenAI SDK 调用 LLM,你可以导出以下环境变量,或者简单地将其放在 `.envfile` 中。
|
||||
|
||||
```bash
|
||||
export OPENAI_API_KEY="your_api_key_here"
|
||||
export OPENAI_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
|
||||
export OPENAI_MODEL="qwen3-coder-plus"
|
||||
```
|
||||
|
||||
现在,你可以通过简单地输入 **`qwen`** 来享受 Qwen-Code 和 Qwen 带来的编程体验。
|
||||
|
||||
### Claude Code
|
||||
|
||||
除了 Qwen Code 之外,现在还可以将 Qwen3‑Coder 与 Claude Code 搭配使用。只需在[阿里云百炼](https://bailian.console.aliyun.com/)平台申请 API Key,并安装 Claude Code,即可开始畅享编码体验。
|
||||
|
||||
```bash
|
||||
npm install -g @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
我们提供了两种接入方式,帮助你无缝地用 Qwen3‑Coder 进行编码。
|
||||
|
||||
#### 使用dashscope提供的代理 API
|
||||
|
||||
只需要将Anthropic的base url替换成dashscope上提供的endpoint即可。
|
||||
|
||||
```bash
|
||||
export ANTHROPIC_BASE_URL=https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy
|
||||
export ANTHROPIC_AUTH_TOKEN=your-dashscope-apikey
|
||||
```
|
||||
|
||||
可选方案 2:使用 claude-code-config 自定义路由
|
||||
|
||||
#### Optional 2: 使用 claude-code-config 自定义路由
|
||||
|
||||
claude-code-router 是一个第三方的路由工具,用于为 Claude Code 灵活地切换不同的后端 API。dashScope平台提供了一个简单的扩展包 claude-code-config,可为 claude-code-router 生成包含 dashScope 支持的默认配置。
|
||||
|
||||
```bash
|
||||
npm install -g @musistudio/claude-code-router
|
||||
npm install -g @dashscope-js/claude-code-config
|
||||
```
|
||||
|
||||
生成配置文件和插件目录:
|
||||
|
||||
```bash
|
||||
ccr-dashscope
|
||||
```
|
||||
|
||||
该命令会自动生成 ccr 所需的配置文件和插件目录。你也可以手动调整 ~/.claude-code-router/config.json 和 ~/.claude-code-router/plugins/ 中的配置。
|
||||
|
||||
最后,通过 ccr 开始使用 Claude Code:
|
||||
|
||||
```bash
|
||||
ccr code
|
||||
```
|
||||
|
||||
至此,你即可通过 ccr 使用 Claude Code 畅享 Qwen3‑Coder 的强大编码能力。祝开发顺利!
|
||||
|
||||
### Cline
|
||||
|
||||
配置 Qwen3-Coder-480B-A35B-instruct 以使用 cline ‒ 进入 cline 的配置设置 ‒ 选择“OpenAI Compatible”模式 ‒ 在 OpenAI Compatible API tokens处,输入从 Dashscope 获取的密钥 ‒ 勾选“使用自定义基础 URL”,并输入:`https://dashscope.aliyuncs.com/compatible-mode/v1` ‒ 输入模型名称:`qwen3-coder-plus`
|
||||
209
public/mengyanote/AI大语言模型玩法/Qwen-Code官方文档使用教程.md
Normal file
209
public/mengyanote/AI大语言模型玩法/Qwen-Code官方文档使用教程.md
Normal file
@@ -0,0 +1,209 @@
|
||||
|
||||
---
|
||||
|
||||
Qwen Code 是一款专为 **Qwen3-Coder** 模型优化的命令行 AI 工作流工具,通过先进的代码理解能力、自动化任务和智能辅助功能,显著提升开发效率。
|
||||
|
||||
---
|
||||
|
||||
## 🛠 操作步骤
|
||||
|
||||
### 1️⃣ 获取阿里云百炼 API Key
|
||||
|
||||
1. 登录 **阿里云百炼大模型服务平台**。
|
||||
|
||||
2. 如果页面顶部显示 **image**,说明需要开通服务。
|
||||
|
||||
- 开通后可领取新人免费额度(30~180天)。
|
||||
|
||||
- 如果提示 **实名认证**,请先完成认证。
|
||||
|
||||
3. 免费额度详情可在 **新人免费额度页面** 查看。
|
||||
|
||||
4. 获取 **阿里云百炼 API Key**。
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 2️⃣ 选择模型
|
||||
|
||||
Qwen Code 支持 **OpenAI 兼容接口模型**,包括:
|
||||
|
||||
- 🌟 **qwen3-coder-plus**(推荐,2025年7月23日起限时优惠)
|
||||
|
||||
- qwen3-coder-480b-a35b-instruct
|
||||
|
||||
- qwen3-coder-flash
|
||||
|
||||
- qwen3-coder-30b-a3b-instruct
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 3️⃣ 安装与配置 Qwen Code
|
||||
|
||||
#### ✅ Node.js 版本检查
|
||||
|
||||
```bash
|
||||
node -v
|
||||
```
|
||||
|
||||
需 **Node.js 20+**,低于则需重新安装。
|
||||
|
||||
#### 📦 安装 Qwen Code
|
||||
|
||||
```bash
|
||||
# 配置镜像源加速
|
||||
npm config set registry https://registry.npmmirror.com
|
||||
|
||||
# 安装 Qwen Code
|
||||
npm install -g @qwen-code/qwen-code@latest
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4️⃣ 启动并配置 Qwen Code
|
||||
|
||||
1. 在终端中输入:
|
||||
|
||||
```bash
|
||||
qwen
|
||||
```
|
||||
|
||||
2. 选择认证方式 → **OpenAI**
|
||||
|
||||
3. 填写以下信息:
|
||||
|
||||
|
||||
|配置项|说明|
|
||||
|---|---|
|
||||
|🔑 API Key|阿里云百炼 API Key|
|
||||
|🌐 Base URL|`https://dashscope.aliyuncs.com/compatible-mode/v1`|
|
||||
|🤖 Model|推荐 `qwen3-coder-plus`|
|
||||
|
||||
👉 若不想每次都输入,请配置 **环境变量**。
|
||||
|
||||
---
|
||||
|
||||
### 5️⃣ 配置环境变量
|
||||
|
||||
在系统中设置:
|
||||
|
||||
```bash
|
||||
export OPENAI_API_KEY=你的APIKey
|
||||
export OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||
export OPENAI_MODEL=qwen3-coder-plus
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6️⃣ 向 Qwen Code 提问
|
||||
|
||||
💡 示例问题:
|
||||
|
||||
```
|
||||
如何用python实现一个二叉搜索树?
|
||||
```
|
||||
|
||||
Qwen Code 会自动创建文件、写入并执行代码。
|
||||
|
||||
---
|
||||
|
||||
### 7️⃣ 查看 Token 消耗
|
||||
|
||||
输入:
|
||||
|
||||
```bash
|
||||
/stats model
|
||||
```
|
||||
|
||||
即可查看本次启动后的 **Token 消耗** 与 **API 调用次数**。
|
||||
|
||||
---
|
||||
|
||||
## 🎁 免费额度
|
||||
|
||||
- 阿里云百炼:**每个模型 100 万免费 Token**
|
||||
|
||||
- Qwen Code:**每天 2000 次免费调用**
|
||||
|
||||
|
||||
👉 为避免额外消费,可开启 **免费额度用完即停** 按钮。
|
||||
|
||||
---
|
||||
|
||||
## 🔧 进阶操作
|
||||
|
||||
更多功能请参考:
|
||||
|
||||
- 📘 [Qwen Code 文档]
|
||||
|
||||
- 📘 [阿里云百炼代码能力]
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ❓ 常见问题 (FAQ)
|
||||
|
||||
### ❓ Q:为什么 Token 消耗快?
|
||||
|
||||
✅ A:可能多次调用 API。
|
||||
👉 控制方法:
|
||||
|
||||
- 精简工作目录(避免在项目根目录运行)。
|
||||
|
||||
- 设置 Token 限额:
|
||||
|
||||
|
||||
```json
|
||||
{
|
||||
"sessionTokenLimit": 32000
|
||||
}
|
||||
```
|
||||
|
||||
- 使用指令:
|
||||
|
||||
- `/compress` → 压缩对话历史
|
||||
|
||||
- `/clear` → 清空历史
|
||||
|
||||
|
||||
---
|
||||
|
||||
### ❓ Q:如何切换模型?
|
||||
|
||||
- 未配置环境变量:
|
||||
|
||||
1. `/quit` 退出
|
||||
|
||||
2. `qwen` 重新启动,手动输入 API Key、Base URL、模型名
|
||||
|
||||
- 已配置环境变量:
|
||||
|
||||
1. 修改 `OPENAI_MODEL`
|
||||
|
||||
2. `/quit` → `qwen` 重启
|
||||
|
||||
|
||||
---
|
||||
|
||||
### ❓ Q:如何使用每天 2000 次免费额度?
|
||||
|
||||
- 输入 `/auth` → 选择 **Qwen Oauth** → 登录 **Qwen Chat**
|
||||
|
||||
- 每天可免费调用 `qwen3-coder-plus` **2000 次**
|
||||
|
||||
- 超过 2000 次 → 切换回 **OpenAI 认证方式**
|
||||
|
||||
|
||||
---
|
||||
|
||||
### ❓ Q:为什么报 `401 Incorrect API key provided` 错误?
|
||||
|
||||
✅ 检查以下:
|
||||
|
||||
- API Key 是否正确
|
||||
|
||||
- 是否有全局环境变量覆盖了配置文件
|
||||
|
||||
|
||||
---
|
||||
31
public/mengyanote/AI大语言模型玩法/大语言模型的API key.md
Normal file
31
public/mengyanote/AI大语言模型玩法/大语言模型的API key.md
Normal file
@@ -0,0 +1,31 @@
|
||||
#### deepseek :
|
||||
**调用密钥:**
|
||||
sk-832f8e5250464de08a31523c7fd71295
|
||||
**调用地址:**
|
||||
https://api.deepseek.com
|
||||
**调用模型:**
|
||||
deepseek-chat
|
||||
deepseek-reasoner
|
||||
|
||||
|
||||
|
||||
阿里云百炼大模型平台:
|
||||
通用秘钥:sk-3d9e8e02a3704868b1a7159d52f2643d
|
||||
|
||||
|
||||
字节火山方舟模型控制台:
|
||||
通用秘钥:fc439240-ed3c-4e65-acaf-3541c66c6ebc
|
||||
|
||||
|
||||
#### Kimi :
|
||||
**调用密钥:**
|
||||
sk-zdg9NBpTlhOcDDpoWfaBKu0KNDdGv18SipORnL2utawja0bE
|
||||
**调用地址:**
|
||||
https://api.moonshot.cn
|
||||
**调用模型:**
|
||||
kimi-k2-0905-preview
|
||||
kimi-k2-0711-preview
|
||||
kimi-k2-turbo-preview 这个非常贵
|
||||
kimi-latest-8k 支持图片理解
|
||||
kimi-latest-32k
|
||||
kimi-latest-128k 这个非常贵
|
||||
23
public/mengyanote/AI大语言模型玩法/大语言模型的API 调用.md
Normal file
23
public/mengyanote/AI大语言模型玩法/大语言模型的API 调用.md
Normal file
@@ -0,0 +1,23 @@
|
||||
deepseek api秘钥:
|
||||
调用密钥:
|
||||
sk-16e24c16ff894771849ee6e15d4fb301
|
||||
调用地址:
|
||||
https://api.deepseek.com
|
||||
|
||||
阿里云百炼大模型平台:
|
||||
通用秘钥:
|
||||
sk-3d9e8e02a3704868b1a7159d52f2643d
|
||||
调用地址:
|
||||
https://dashscope.aliyuncs.com/compatible-mode/v1
|
||||
|
||||
字节火山方舟模型控制台:
|
||||
通用秘钥:
|
||||
fc439240-ed3c-4e65-acaf-3541c66c6ebc
|
||||
调用地址:
|
||||
https://ark.cn-beijing.volces.com/api/v3/chat/completions
|
||||
|
||||
kimi API调用:
|
||||
调用密钥:
|
||||
sk-32M3DYWQdPlftpaGOmIuS7OFKzqCiSutktFPxPqTWn3oFadM
|
||||
调用地址:
|
||||
https://api.moonshot.cn
|
||||
128
public/mengyanote/AI大语言模型玩法/阿里云百炼平台模型API调用示例.md
Normal file
128
public/mengyanote/AI大语言模型玩法/阿里云百炼平台模型API调用示例.md
Normal file
@@ -0,0 +1,128 @@
|
||||
|
||||
### **Python调用示例:**
|
||||
```python
|
||||
import os
|
||||
from openai import OpenAI
|
||||
|
||||
client = OpenAI(
|
||||
api_key=os.getenv("DASHSCOPE_API_KEY"), # 如果您没有配置环境变量,请在此处用您的API Key进行替换
|
||||
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||||
)
|
||||
completion = client.chat.completions.create(
|
||||
model="qwen3-coder-plus",
|
||||
messages=[
|
||||
{'role': 'system', 'content': 'You are a helpful assistant.'},
|
||||
{'role': 'user', 'content': '请编写一个Python函数 find_prime_numbers,该函数接受一个整数 n 作为参数,并返回一个包含所有小于 n 的质数(素数)的列表。质数是指仅能被1和其自身整除的正整数,如2, 3, 5, 7等。不要输出非代码的内容。'}],
|
||||
)
|
||||
print("="*20+"回复内容"+"="*20)
|
||||
print(completion.choices[0].message.content)
|
||||
print("="*20+"Token消耗"+"="*20)
|
||||
print(completion.usage)
|
||||
```
|
||||
**返回结果示例:**
|
||||
````plaintext
|
||||
====================回复内容====================
|
||||
```python
|
||||
def find_prime_numbers(n):
|
||||
if n <= 2:
|
||||
return []
|
||||
|
||||
primes = []
|
||||
|
||||
for num in range(2, n):
|
||||
is_prime = True
|
||||
for i in range(2, int(num ** 0.5) + 1):
|
||||
if num % i == 0:
|
||||
is_prime = False
|
||||
break
|
||||
if is_prime:
|
||||
primes.append(num)
|
||||
|
||||
return primes
|
||||
```
|
||||
====================Token消耗====================
|
||||
CompletionUsage(completion_tokens=95, prompt_tokens=91, total_tokens=186, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0))
|
||||
````
|
||||
|
||||
|
||||
|
||||
curl调用示例:
|
||||
```curl
|
||||
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
|
||||
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "qwen3-coder-plus",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a helpful assistant."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "请编写一个Python函数 find_prime_numbers,该函数接受一个整数 n 作为参数,并返回一个包含所有小于 n 的质数(素数)的列表。质数是指仅能被1和其自身整除的正整数,如2, 3, 5, 7等。不要输出非代码的内容。"
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
|
||||
返回结果示例:
|
||||
```json
|
||||
{
|
||||
"choices": [
|
||||
{
|
||||
"message": {
|
||||
"content": "```python\ndef find_prime_numbers(n):\n if n <= 2:\n return []\n \n primes = []\n \n for num in range(2, n):\n is_prime = True\n for i in range(2, int(num ** 0.5) + 1):\n if num % i == 0:\n is_prime = False\n break\n if is_prime:\n primes.append(num)\n \n return primes\n```",
|
||||
"role": "assistant"
|
||||
},
|
||||
"finish_reason": "stop",
|
||||
"index": 0,
|
||||
"logprobs": null
|
||||
}
|
||||
],
|
||||
"object": "chat.completion",
|
||||
"usage": {
|
||||
"prompt_tokens": 91,
|
||||
"completion_tokens": 95,
|
||||
"total_tokens": 186,
|
||||
"prompt_tokens_details": {
|
||||
"cached_tokens": 0
|
||||
}
|
||||
},
|
||||
"created": 1753192010,
|
||||
"system_fingerprint": null,
|
||||
"model": "qwen3-coder-plus",
|
||||
"id": "chatcmpl-798c99c2-7410-9cc4-8385-6dfd757757fa"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
67
public/mengyanote/Docker/Docker 镜像相关.md
Normal file
67
public/mengyanote/Docker/Docker 镜像相关.md
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
**QQ机器人框架NapCat**
|
||||
```shell
|
||||
#安装
|
||||
docker run -d \
|
||||
-e NAPCAT_GID=$(id -g) \
|
||||
-e NAPCAT_UID=$(id -u) \
|
||||
-p 4080:3000 \
|
||||
-p 4070:3001 \
|
||||
-p 4060:6099 \
|
||||
--name napcat \
|
||||
--restart=always \
|
||||
mlikiowa/napcat-docker:latest
|
||||
|
||||
#固化以下路径,方便掉线时快速重新登录
|
||||
#QQ 持久化数据路径:/app/.config/QQ
|
||||
#NapCat 配置文件路径: /app/napcat/config
|
||||
|
||||
#登录 WebUI 后台地址:http://<宿主机ip>:6099/webui
|
||||
```
|
||||
|
||||
**网页SSH客户端-EasyNode**
|
||||
```shell
|
||||
#项目地址:https://github.com/chaos-zhu/easynode
|
||||
|
||||
# 1. 创建easynode目录
|
||||
mkdir -p /root/easynode && cd /root/easynode
|
||||
|
||||
# 2. 下载docker-compose.yml文件
|
||||
wget https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/docker-compose.yml
|
||||
|
||||
# 3. 启动服务
|
||||
docker-compose up -d
|
||||
|
||||
docker run -d -p 8082:8082 --restart=always -v /root/easynode/db:/easynode/app/db chaoszhu/easynode
|
||||
|
||||
### 监控服务
|
||||
#安装
|
||||
# 使用默认端口22022安装
|
||||
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash
|
||||
|
||||
# 使用自定义端口安装, 例如54321
|
||||
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash -s -- 54321
|
||||
|
||||
#卸载
|
||||
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash
|
||||
|
||||
#查看监控服务状态:systemctl status easynode-client
|
||||
#查看监控服务日志: journalctl --follow -u easynode-client
|
||||
#查看详细日志:journalctl -xe
|
||||
```
|
||||
|
||||
**docker加速地址**
|
||||
|
||||
![[Screenshot_20250717_225309.jpg]]
|
||||
|
||||
|
||||
docker.1ms.run/
|
||||
|
||||
docker run -d -p 4050:80 --restart=always -v /shumengya/tu:/var/www/html docker.1ms.run/oaooa/pichome
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
116
public/mengyanote/Docker/Docker命令集合.md
Normal file
116
public/mengyanote/Docker/Docker命令集合.md
Normal file
@@ -0,0 +1,116 @@
|
||||
|
||||
docker-compose up -d
|
||||
|
||||
docker-compose down
|
||||
|
||||
docker-compose restart
|
||||
|
||||
docker-compose logs -f
|
||||
|
||||
docker-compose ps
|
||||
|
||||
docker-compose build --no-cache
|
||||
|
||||
|
||||
**Docker容器一键更新到最新版镜像(以60s API举例)**
|
||||
```bash
|
||||
#拉取最新镜像
|
||||
docker pull vikiboss/60s:latest
|
||||
docker pull mlikiowa/napcat-docker:latest
|
||||
docker pull couchdb:latest #Obsidian同步的数据库
|
||||
docker pull aceberg/watchyourlan #扫描局域网的工具
|
||||
|
||||
docker pull dpanel/dpanel:latest
|
||||
|
||||
|
||||
#停止并删除旧容器
|
||||
docker stop 60s
|
||||
docker rm 60s
|
||||
docker stop napcat
|
||||
docker rm napcat
|
||||
|
||||
#兰空图床免费版
|
||||
docker run -d \
|
||||
--name lsky-pro \
|
||||
-p 8089:80 \
|
||||
-v /shumengya/docker/storage/lsky:/var/www/html \
|
||||
--restart=always \
|
||||
halcyonazure/lsky-pro:latest
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#可视化Docker面板
|
||||
docker run -d \
|
||||
--name dpanel \
|
||||
-p 8800:8080 \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v /shumengya/docker/storage/dpanel:/dpanel/data \
|
||||
--restart=always \
|
||||
dpanel/dpanel:latest
|
||||
|
||||
|
||||
|
||||
#扫描局域网的工具
|
||||
docker run -d \
|
||||
--name watch-your-lan \
|
||||
--restart unless-stopped \
|
||||
--net=host \
|
||||
-e TZ=Asia/Shanghai \
|
||||
-v /shumengya/docker/storage/watchyourlan:/data \
|
||||
aceberg/watchyourlan
|
||||
|
||||
#Obsidian 同步数据库
|
||||
docker run -d \
|
||||
--name obsidian-couchdb \
|
||||
-e COUCHDB_USER=shumengya \
|
||||
-e COUCHDB_PASSWORD='tyh@19900420' \
|
||||
-p 5984:5984 \
|
||||
couchdb:latest
|
||||
|
||||
#60s api后端
|
||||
docker run -d \
|
||||
--restart always \
|
||||
--name 60s \
|
||||
-p 4399:4399 \
|
||||
vikiboss/60s:latest
|
||||
|
||||
#napcat QQ机器人
|
||||
docker run -d \
|
||||
--name napcat \
|
||||
--restart=always \
|
||||
-e NAPCAT_GID=$(id -g) \
|
||||
-e NAPCAT_UID=$(id -u) \
|
||||
-p 4080:3000 \
|
||||
-p 4070:3001 \
|
||||
-p 4060:6099 \
|
||||
-v /shumengya/docker/storage/napcat/qq:/app/.config/QQ \
|
||||
-v /shumengya/docker/storage/napcat/config:/app/napcat/config \
|
||||
mlikiowa/napcat-docker:latest
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
49
public/mengyanote/Docker/Docker镜像快速迁移.md
Normal file
49
public/mengyanote/Docker/Docker镜像快速迁移.md
Normal file
@@ -0,0 +1,49 @@
|
||||
|
||||
---
|
||||
|
||||
## ✅ 方法一:直接导出容器(container → tar)
|
||||
|
||||
如果你运行的是一个 **容器**(而不是镜像),可以直接打包它:
|
||||
|
||||
```bash
|
||||
# 导出容器
|
||||
docker export <容器ID或名字> -o container.tar
|
||||
|
||||
# 在另一台Linux机器上导入
|
||||
docker import container.tar new-image:latest
|
||||
```
|
||||
|
||||
特点:
|
||||
|
||||
- 容器的运行时文件系统会被打包(包含你安装的软件和修改),**但不会包含容器的历史层和环境变量**。
|
||||
|
||||
- 类似于“快照”迁移。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ✅ 方法二:保存镜像(image → tar)
|
||||
|
||||
如果你已经把容器做成了一个镜像,建议用 **save/load**:
|
||||
|
||||
```bash
|
||||
# 在源主机上保存镜像
|
||||
docker save -o myimage.tar myimage:latest
|
||||
docker save -o frpc-1panel.tar snowdreamtech/frpc:0.63.0
|
||||
|
||||
# 拷贝到目标主机(比如用 scp)
|
||||
scp myimage.tar user@remote:/path/
|
||||
|
||||
# 在目标主机导入
|
||||
docker load -i myimage.tar
|
||||
```
|
||||
|
||||
特点:
|
||||
|
||||
- 保留镜像层和构建历史。
|
||||
|
||||
- 推荐这种方式。
|
||||
|
||||
|
||||
---
|
||||
|
||||
20
public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md
Normal file
20
public/mengyanote/Docker/优秀好用的Docker镜像/FileCodeBox-文件快递柜.md
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name filecodebox \
|
||||
--restart=always \
|
||||
-p 12345:12345 \
|
||||
-v /shumengya/docker/storage/filecodebox:/app/data \
|
||||
lanol/filecodebox:beta
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull lanol/filecodebox:beta
|
||||
```
|
||||
|
||||
```
|
||||
docker stop lanol/filecodebox:beta
|
||||
docker rm lanol/filecodebox:beta
|
||||
```
|
||||
24
public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md
Normal file
24
public/mengyanote/Docker/优秀好用的Docker镜像/Gitea-私有化仓库部署.md
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
```bash
|
||||
#github/gitlab的本地轻量化部署代替-gitea
|
||||
docker run -d \
|
||||
--name gitea \
|
||||
-p 8989:3000 \
|
||||
-p 8022:22 \
|
||||
-e USER_UID=1000 \
|
||||
-e USER_GID=1000 \
|
||||
-v /shumengya/docker/storage/gitea:/data \
|
||||
--restart=always \
|
||||
gitea/gitea:latest
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull gitea/gitea:latest
|
||||
```
|
||||
|
||||
```
|
||||
docker stop gitea/gitea:latest
|
||||
docker rm gitea/gitea:latest
|
||||
```
|
||||
15
public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB数据库.md
Normal file
15
public/mengyanote/Docker/优秀好用的Docker镜像/MongoDB数据库.md
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
```bash
|
||||
#MongoDB数据库
|
||||
docker run -d --name mongodb \
|
||||
-e MONGO_INITDB_ROOT_USERNAME=shumengya \
|
||||
-e MONGO_INITDB_ROOT_PASSWORD=shumengya520 \
|
||||
-v /shumengya/docker/storage/mongodb:/data/db \
|
||||
-p 27017:27017 \
|
||||
mongo
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull mongo
|
||||
```
|
||||
36
public/mengyanote/Docker/优秀好用的Docker镜像/MySQL数据库.md
Normal file
36
public/mengyanote/Docker/优秀好用的Docker镜像/MySQL数据库.md
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name mysql \
|
||||
-e MYSQL_ROOT_PASSWORD=shumengya520 \
|
||||
-e MYSQL_DATABASE=shumengyadb \
|
||||
-e MYSQL_USER=shumengya \
|
||||
-e MYSQL_PASSWORD=shumengya520 \
|
||||
-v /shumengya/docker/storage/mysql:/var/lib/mysql \
|
||||
-p 3306:3306 \
|
||||
--restart=always \
|
||||
mysql:latest
|
||||
|
||||
|
||||
docker run -d \
|
||||
--name mysql \
|
||||
-e MYSQL_ROOT_PASSWORD=shumengya520 \
|
||||
-e MYSQL_DATABASE=shumengyadb \
|
||||
-e MYSQL_USER=shumengya \
|
||||
-e MYSQL_PASSWORD=shumengya520 \
|
||||
-v /shumengya/docker/storage/mysql:/var/lib/mysql \
|
||||
-p 3306:3306 \
|
||||
--restart=always \
|
||||
mysql:5.7.44
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull mysql:5.7.44
|
||||
```
|
||||
|
||||
```
|
||||
docker stop mysql
|
||||
docker rm mysql
|
||||
```
|
||||
25
public/mengyanote/Docker/优秀好用的Docker镜像/Postgres数据库.md
Normal file
25
public/mengyanote/Docker/优秀好用的Docker镜像/Postgres数据库.md
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
```bash
|
||||
#postgres数据库
|
||||
docker run -d \
|
||||
--name postgres \
|
||||
-e POSTGRES_PASSWORD=shumengya520 \
|
||||
-e POSTGRES_USER=shumengya \
|
||||
-e POSTGRES_DB=shumengyadb \
|
||||
-v /shumengya/docker/storage/postgres:/data \
|
||||
-e PGDATA=/data/pgdata \
|
||||
-p 5432:5432 \
|
||||
--restart=always \
|
||||
postgres:latest
|
||||
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull postgres:latest
|
||||
```
|
||||
|
||||
```
|
||||
docker stop postgres:latest
|
||||
docker rm postgres:latest
|
||||
```
|
||||
15
public/mengyanote/Docker/优秀好用的Docker镜像/Redis数据库.md
Normal file
15
public/mengyanote/Docker/优秀好用的Docker镜像/Redis数据库.md
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
```bash
|
||||
#MongoDB数据库
|
||||
docker run -d --name mongodb \
|
||||
-e MONGO_INITDB_ROOT_USERNAME=shumengya \
|
||||
-e MONGO_INITDB_ROOT_PASSWORD=shumengya520 \
|
||||
-v /shumengya/docker/storage/mongodb:/data/db \
|
||||
-p 27017:27017 \
|
||||
mongo
|
||||
```
|
||||
|
||||
```bash
|
||||
#典型的非关系型数据库(json)
|
||||
docker pull mongo
|
||||
```
|
||||
95
public/mengyanote/Github相关/Github仓库公共API总结.md
Normal file
95
public/mengyanote/Github相关/Github仓库公共API总结.md
Normal file
@@ -0,0 +1,95 @@
|
||||
|
||||
---
|
||||
|
||||
## Releases(发行版本)相关接口
|
||||
|
||||
- **获取最新发布版本(Latest Release)**
|
||||
`GET /repos/{owner}/{repo}/releases/latest`
|
||||
返回最新非预发布、非草稿版的发布详情,包括版本号、发布时间、说明等。([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com "REST API endpoints for releases and release assets"))
|
||||
|
||||
- **列出所有发布版本(List Releases)**
|
||||
`GET /repos/{owner}/{repo}/releases`
|
||||
返回该仓库所有发布版本的列表,不包含未关联发布的普通 Git 标签。([GitHub Docs](https://docs.github.com/en/rest/releases/releases?utm_source=chatgpt.com "REST API endpoints for releases"))
|
||||
|
||||
- **通过 Tag 获取指定发布版本(Get a Release by Tag)**
|
||||
`GET /repos/{owner}/{repo}/releases/tags/{tag}`
|
||||
根据具体 tag 名称获取对应发布版本的信息。([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com "REST API endpoints for releases and release assets"))
|
||||
|
||||
- **创建、更新、删除发布版本(Create / Update / Delete Release)**
|
||||
|
||||
- `POST /repos/{owner}/{repo}/releases` — 创建新的发布版本
|
||||
|
||||
- `PATCH /repos/{owner}/{repo}/releases/{release_id}` — 更新发布版本
|
||||
|
||||
- `DELETE /repos/{owner}/{repo}/releases/{release_id}` — 删除发布版本
|
||||
(这些操作通常需要认证权限。)([GitHub Docs](https://docs.github.com/en/rest/releases?utm_source=chatgpt.com "REST API endpoints for releases and release assets"))
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Git Tags(标签)相关接口
|
||||
|
||||
- **列出仓库的 Git 标签**
|
||||
`GET /repos/{owner}/{repo}/tags`
|
||||
返回该仓库所有标签(包括 lightweight 和 annotated)。([Stack Overflow](https://stackoverflow.com/questions/18384873/how-to-list-the-releases-of-a-repository?utm_source=chatgpt.com "github - How to list the releases of a repository?"), [GitHub Docs](https://docs.github.com/en/rest/repos/tags?utm_source=chatgpt.com "REST API endpoints for repository tags"))
|
||||
|
||||
- **获取标签引用(Tag Reference)**
|
||||
`GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}`
|
||||
可获取该标签所对应的对象(TAG_SHA),用于进一步查询。([Stack Overflow](https://stackoverflow.com/questions/72429056/how-to-get-single-tag-information-using-github-api?utm_source=chatgpt.com "How to get Single tag Information using GitHub Api?"))
|
||||
|
||||
- **获取 Annotated Tag 对象详情**
|
||||
`GET /repos/{owner}/{repo}/git/tags/{tag_sha}`
|
||||
获取标签对象的完整信息,包括 `object.sha` 即对应的 commit SHA、tagger、message 等。([Stack Overflow](https://stackoverflow.com/questions/72429056/how-to-get-single-tag-information-using-github-api?utm_source=chatgpt.com "How to get Single tag Information using GitHub Api?"))
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Commits(提交)相关接口
|
||||
|
||||
- **列出提交记录(List Commits)**
|
||||
`GET /repos/{owner}/{repo}/commits`
|
||||
返回最新的提交列表,第一个通常为最新提交。响应中包含 SHA、作者、提交信息、签名验证信息等。([GitHub Docs](https://docs.github.com/en/rest/commits/commits?utm_source=chatgpt.com "REST API endpoints for commits"))
|
||||
|
||||
- **获取单个提交详情(Get a Commit)**
|
||||
`GET /repos/{owner}/{repo}/commits/{commit_sha}`
|
||||
获取指定提交的详细信息。([GitHub Docs](https://docs.github.com/en/rest/commits?utm_source=chatgpt.com "REST API endpoints for commits"))
|
||||
|
||||
- **比较两个提交(Compare Commits)**
|
||||
`GET /repos/{owner}/{repo}/compare/{base}...{head}`
|
||||
用于比较两个 commit 或两个 tag 之间的差异。([Stack Overflow](https://stackoverflow.com/questions/61359461/get-all-commits-in-a-git-tag-through-github-api-return-only-the-first-commit?utm_source=chatgpt.com "get all commits in a Git tag through GitHub API return only ..."))
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 综合流程示例
|
||||
|
||||
下面是一个常见逻辑,例如想获取最新发布对应的 commit SHA:
|
||||
|
||||
1. 调用 `GET /repos/{owner}/{repo}/releases/latest` 获取最新 release 的 `tag_name`。
|
||||
|
||||
2. 调用 `GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}` 获取 TAG_SHA。
|
||||
|
||||
3. 调用 `GET /repos/{owner}/{repo}/git/tags/{tag_sha}` 获取该标签对象的 commit SHA(object.sha)。
|
||||
|
||||
|
||||
这套流程常用于从发布版本跳转到对应的 Git 提交。([Stack Overflow](https://stackoverflow.com/questions/67040794/how-can-i-get-the-commit-hash-of-the-latest-release-from-github-api?utm_source=chatgpt.com "How can I get the commit hash of the latest release from ..."))
|
||||
|
||||
---
|
||||
|
||||
## 表格总结
|
||||
|
||||
|功能需求|接口路径 / 方法|
|
||||
|---|---|
|
||||
|最新发布版本信息|`GET /repos/{owner}/{repo}/releases/latest`|
|
||||
|列出所有发布版本|`GET /repos/{owner}/{repo}/releases`|
|
||||
|通过 tag 查询发布|`GET /repos/{owner}/{repo}/releases/tags/{tag}`|
|
||||
|获取标签列表|`GET /repos/{owner}/{repo}/tags`|
|
||||
|获取标签引用(TAG_SHA)|`GET /repos/{owner}/{repo}/git/refs/tags/{tag_name}`|
|
||||
|获取标签对象详情|`GET /repos/{owner}/{repo}/git/tags/{tag_sha}`|
|
||||
|列出提交|`GET /repos/{owner}/{repo}/commits`|
|
||||
|获取指定 commit 信息|`GET /repos/{owner}/{repo}/commits/{commit_sha}`|
|
||||
|比较两个 commit/tag|`GET /repos/{owner}/{repo}/compare/{base}...{head}`|
|
||||
|
||||
---
|
||||
|
||||
如果你还希望了解更多,如 API 速率限制、认证方式(匿名 vs token)、分页处理(per_page、page 参数)、使用 GraphQL API 实现同类功能,或具体的 JavaScript `fetch` 调用示例,都可以随时继续讨论!
|
||||
60
public/mengyanote/Github相关/Github获取仓库密钥.md
Normal file
60
public/mengyanote/Github相关/Github获取仓库密钥.md
Normal file
@@ -0,0 +1,60 @@
|
||||
这个地方要注意:
|
||||
|
||||
你输入 `git push` 时出现
|
||||
|
||||
```
|
||||
Username for 'https://github.com': shumengya
|
||||
Password for 'https://shumengya@github.com':
|
||||
```
|
||||
|
||||
这里的 **Password** 已经不是 GitHub 登录密码了。
|
||||
从 2021 年 8 月开始,GitHub **禁用了账户密码推送**,必须用 **Personal Access Token (PAT)** 或 **SSH Key** 来认证。
|
||||
|
||||
---
|
||||
|
||||
### ✅ 方案一:生成 Personal Access Token(HTTPS 推荐)
|
||||
|
||||
1. 登录 GitHub → 右上角头像 → **Settings**
|
||||
2. 左侧栏 → **Developer settings** → **Personal access tokens** → **Tokens (classic)**
|
||||
3. 点击 **Generate new token (classic)**
|
||||
|
||||
* 勾选 **repo**(访问和推送仓库必须要有)
|
||||
* 设置有效期(比如 90 天或无期限)
|
||||
* 点击生成
|
||||
4. 复制生成的 Token(只会显示一次)
|
||||
|
||||
之后推送时:
|
||||
|
||||
* **Username**:填 GitHub 用户名(`shumengya`)
|
||||
* **Password**:填刚生成的 Token
|
||||
|
||||
---
|
||||
|
||||
### ✅ 方案二:改用 SSH Key(更方便)
|
||||
|
||||
1. 本地生成 SSH Key:
|
||||
|
||||
```bash
|
||||
ssh-keygen -t ed25519 -C "你的邮箱"
|
||||
```
|
||||
|
||||
按回车保存,默认会在 `~/.ssh/id_ed25519` 和 `~/.ssh/id_ed25519.pub`。
|
||||
2. 查看公钥:
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
```
|
||||
3. 复制内容 → GitHub → **Settings → SSH and GPG keys → New SSH key** → 粘贴保存。
|
||||
4. 修改仓库地址为 SSH:
|
||||
|
||||
```bash
|
||||
git remote set-url origin git@github.com:shumengya/你的仓库名.git
|
||||
```
|
||||
5. 之后直接 `git push` 就不用输密码了。
|
||||
|
||||
---
|
||||
|
||||
👉 建议你选 **SSH Key**,因为用一次就永久生效,不会过期。
|
||||
|
||||
要不要我给你写一份 **完整 SSH Key 配置和测试流程**(从生成到验证)?
|
||||
|
||||
52
public/mengyanote/Github相关/Linux下使用git探索.md
Normal file
52
public/mengyanote/Github相关/Linux下使用git探索.md
Normal file
@@ -0,0 +1,52 @@
|
||||
**修改全局代理为http1**
|
||||
```
|
||||
git config --global http.version HTTP/1.1
|
||||
```
|
||||
|
||||
**相当于 git fetch + git merge,会把远程最新提交合并到你当前分支。**
|
||||
```
|
||||
git pull
|
||||
```
|
||||
|
||||
**这会把你的本地提交临时“挪开”,先更新远程提交,然后再把你的提交放回去,避免多余的合并记录。**
|
||||
```
|
||||
git pull --rebase
|
||||
```
|
||||
|
||||
**如果只想下载最新提交但不合并**
|
||||
```
|
||||
git fetch
|
||||
```
|
||||
|
||||
**树萌芽GitHub仓库提交代码通用密钥:**
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
### 1. 添加所有改动
|
||||
```
|
||||
git add .
|
||||
```
|
||||
### 2. 提交,写上提交说明
|
||||
```
|
||||
git commit -m "更新说明"
|
||||
```
|
||||
### 3. 推送到远程仓库(假设分支是 main)
|
||||
```
|
||||
git push origin main
|
||||
```
|
||||
|
||||
|
||||
**压缩成一条命令实现:**
|
||||
```
|
||||
git add . && git commit -m "update" && git push origin main
|
||||
```
|
||||
|
||||
**或者设置命令别名,比如写进 ~/.bashrc 或 ~/.zshrc:**
|
||||
```
|
||||
alias gopush='git add . && git commit -m "update" && git push origin main'
|
||||
```
|
||||
|
||||
|
||||
注意:校园网可能会屏蔽梯子,必要时开热点提交
|
||||
|
||||
111
public/mengyanote/Github相关/linux常用git命令.md
Normal file
111
public/mengyanote/Github相关/linux常用git命令.md
Normal file
@@ -0,0 +1,111 @@
|
||||
下面给你整理了一份 **Linux 下常用的 Git 命令速查表**,涵盖从初始化到协作的常见操作:
|
||||
|
||||
---
|
||||
|
||||
## 🔹 基础配置
|
||||
|
||||
```bash
|
||||
git config --global user.name "你的名字" # 设置用户名
|
||||
git config --global user.email "你的邮箱" # 设置邮箱
|
||||
git config --global core.editor "vim" # 设置默认编辑器
|
||||
git config --list # 查看当前配置
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 仓库初始化与克隆
|
||||
|
||||
```bash
|
||||
git init # 初始化一个本地仓库
|
||||
git clone <repo_url> # 克隆远程仓库
|
||||
git clone <repo_url> myproj # 克隆并重命名文件夹
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 文件操作
|
||||
|
||||
```bash
|
||||
git status # 查看仓库当前状态
|
||||
git add <file> # 添加文件到暂存区
|
||||
git add . # 添加所有修改到暂存区
|
||||
git reset <file> # 从暂存区撤销已添加的文件
|
||||
git rm <file> # 删除文件并记录到暂存区
|
||||
git mv old new # 重命名文件并记录到暂存区
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 提交相关
|
||||
|
||||
```bash
|
||||
git commit -m "说明" # 提交暂存区到仓库
|
||||
git commit -am "说明" # 添加修改并提交(跳过 git add)
|
||||
git log # 查看提交历史
|
||||
git log --oneline --graph # 图形化查看分支提交记录
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 分支操作
|
||||
|
||||
```bash
|
||||
git branch # 查看分支
|
||||
git branch <name> # 创建分支
|
||||
git checkout <name> # 切换分支
|
||||
git checkout -b <name> # 新建并切换分支
|
||||
git merge <name> # 合并分支到当前分支
|
||||
git branch -d <name> # 删除分支
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 远程仓库
|
||||
|
||||
```bash
|
||||
git remote -v # 查看远程仓库地址
|
||||
git remote add origin <url> # 添加远程仓库
|
||||
git remote remove origin # 删除远程仓库
|
||||
git push origin master # 推送 master 分支到远程
|
||||
git push -u origin <branch> # 推送并设置默认分支
|
||||
git pull origin master # 拉取远程更新并合并
|
||||
git fetch origin # 抓取远程分支(不合并)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 回退与撤销
|
||||
|
||||
```bash
|
||||
git checkout -- <file> # 撤销工作区修改
|
||||
git reset HEAD <file> # 取消暂存区文件
|
||||
git reset --hard HEAD~1 # 回退到上一个提交
|
||||
git revert <commit_id> # 撤销指定提交,生成新提交
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 标签管理
|
||||
|
||||
```bash
|
||||
git tag # 查看标签
|
||||
git tag v1.0 # 打标签
|
||||
git tag -a v1.0 -m "说明" # 创建附注标签
|
||||
git push origin v1.0 # 推送标签到远程
|
||||
git push origin --tags # 推送所有标签
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 常用技巧
|
||||
|
||||
```bash
|
||||
git stash # 临时保存修改
|
||||
git stash pop # 恢复最近一次保存
|
||||
git diff # 查看未暂存的修改
|
||||
git diff --cached # 查看已暂存的修改
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
57
public/mengyanote/LeetCode 刷题/力扣-两数之和详解.md
Normal file
57
public/mengyanote/LeetCode 刷题/力扣-两数之和详解.md
Normal file
@@ -0,0 +1,57 @@
|
||||
两数之和问题 - 详细运算过程解析
|
||||
|
||||
算法思路回顾
|
||||
|
||||
使用哈希表(字典)来存储已经遍历过的数字及其索引,对于每个当前数字,计算其与目标值的差值(补数),并检查该补数是否已经在哈希表中存在。
|
||||
|
||||
详细运算过程
|
||||
|
||||
让我们通过一个具体例子来详细解析算法的执行过程:
|
||||
|
||||
示例: nums = [2, 7, 11, 15], target = 9
|
||||
|
||||
初始化阶段
|
||||
|
||||
```python
|
||||
num_map = {} # 创建一个空字典用于存储数字和索引的映射
|
||||
```
|
||||
|
||||
第一次迭代 (i=0, num=2)
|
||||
|
||||
1. 计算补数:complement = target - num = 9 - 2 = 7
|
||||
2. 检查补数7是否在num_map中:7 in num_map → 结果为False(因为字典为空)
|
||||
3. 将当前数字和索引存入字典:num_map[2] = 0
|
||||
4. 此时字典状态:{2: 0}
|
||||
|
||||
第二次迭代 (i=1, num=7)
|
||||
|
||||
1. 计算补数:complement = target - num = 9 - 7 = 2
|
||||
2. 检查补数2是否在num_map中:2 in num_map → 结果为True(因为字典中有键2)
|
||||
3. 找到匹配,返回结果:[num_map[2], 1] → [0, 1]
|
||||
4. 算法结束,返回结果[0, 1]
|
||||
|
||||
运算过程可视化
|
||||
|
||||
迭代次数 当前索引(i) 当前值(num) 补数(complement) 补数是否在num_map中 num_map更新 操作说明
|
||||
1 0 2 7 否 {2:0} 将2和索引0存入字典
|
||||
2 1 7 2 是 - 找到匹配,返回[0,1]
|
||||
|
||||
关键点解析
|
||||
|
||||
1. 补数计算:对于每个数字,计算target - num得到补数,这个补数就是我们需要在之前遍历过的数字中寻找的值。
|
||||
2. 哈希表的作用:哈希表用于存储已经遍历过的数字及其索引,这样可以在O(1)时间内检查补数是否存在。
|
||||
3. 顺序重要性:算法先检查补数是否存在,然后再将当前数字存入字典,这样可以确保不会使用同一个元素两次。
|
||||
4. 时间复杂度:每个元素只被访问一次,哈希表的插入和查找操作平均时间复杂度为O(1),因此总时间复杂度为O(n)。
|
||||
5. 空间复杂度:最坏情况下需要存储所有n个元素,因此空间复杂度为O(n)。
|
||||
|
||||
为什么这种方法有效?
|
||||
|
||||
这种方法有效的关键在于利用了数学关系:如果a + b = target,那么target - a = b。通过存储已经遍历过的数字,我们可以快速检查当前数字的补数是否已经出现过。
|
||||
|
||||
这种方法比暴力解法(双重循环)高效得多,将时间复杂度从O(n²)降低到O(n),是典型的"以空间换时间"策略。
|
||||
|
||||
边界情况处理
|
||||
|
||||
虽然题目保证有解,但实际应用中可能需要考虑无解的情况。我们的代码在无解时会返回空列表,这是一种合理的处理方式。
|
||||
|
||||
这种算法设计简洁高效,是解决两数之和问题的标准方法,被广泛应用于各种编程面试和实际开发中。
|
||||
155
public/mengyanote/LeetCode 刷题/力扣1-两数相加问题.md
Normal file
155
public/mengyanote/LeetCode 刷题/力扣1-两数相加问题.md
Normal file
@@ -0,0 +1,155 @@
|
||||
两数相加问题
|
||||
|
||||
问题描述
|
||||
|
||||
给定两个非空链表,表示两个非负整数。每位数字按照逆序方式存储,每个节点存储一位数字。将两个数相加,并以相同形式返回表示和的链表。
|
||||
|
||||
假设除了数字0之外,这两个数都不会以0开头。
|
||||
|
||||
示例
|
||||
|
||||
示例 1:
|
||||
|
||||
```
|
||||
输入:l1 = [2,4,3], l2 = [5,6,4]
|
||||
输出:[7,0,8]
|
||||
解释:342 + 465 = 807
|
||||
```
|
||||
|
||||
示例 2:
|
||||
|
||||
```
|
||||
输入:l1 = [0], l2 = [0]
|
||||
输出:[0]
|
||||
```
|
||||
|
||||
示例 3:
|
||||
|
||||
```
|
||||
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
|
||||
输出:[8,9,9,9,0,0,0,1]
|
||||
```
|
||||
|
||||
提示
|
||||
|
||||
· 每个链表中的节点数在范围 [1, 100] 内
|
||||
· 0 <= Node.val <= 9
|
||||
· 题目数据保证列表表示的数字不含前导零
|
||||
|
||||
方法思路
|
||||
|
||||
问题分析
|
||||
|
||||
两个链表表示的数字是逆序存储的,即链表的头节点表示个位数,第二个节点表示十位数,以此类推。我们需要模拟加法运算,从低位到高位逐位相加,并处理进位问题。
|
||||
|
||||
算法选择
|
||||
|
||||
· 使用一个虚拟头节点(dummy node)简化链表操作
|
||||
· 同时遍历两个链表,逐位相加并处理进位
|
||||
· 如果链表长度不同,较短链表的缺失位视为0
|
||||
· 最后如果还有进位,需要额外创建一个节点
|
||||
|
||||
算法步骤
|
||||
|
||||
1. 初始化虚拟头节点和当前指针
|
||||
2. 初始化进位值为0
|
||||
3. 同时遍历两个链表,直到两个链表都遍历完且没有进位
|
||||
4. 计算当前位的和:两个链表当前节点的值加上进位
|
||||
5. 计算新的进位和当前位的值
|
||||
6. 创建新节点并连接到结果链表
|
||||
7. 移动所有指针到下一个位置
|
||||
8. 返回虚拟头节点的下一个节点
|
||||
|
||||
复杂度分析
|
||||
|
||||
· 时间复杂度:O(max(m, n)),其中m和n分别是两个链表的长度
|
||||
· 空间复杂度:O(max(m, n)),结果链表的长度最多为max(m, n) + 1
|
||||
|
||||
解决代码
|
||||
|
||||
```python
|
||||
# Definition for singly-linked list.
|
||||
class ListNode:
|
||||
def __init__(self, val=0, next=None):
|
||||
self.val = val
|
||||
self.next = next
|
||||
|
||||
class Solution:
|
||||
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
|
||||
"""
|
||||
将两个逆序存储的数字链表相加,返回结果链表
|
||||
|
||||
参数:
|
||||
l1: ListNode - 第一个数字链表
|
||||
l2: ListNode - 第二个数字链表
|
||||
|
||||
返回:
|
||||
ListNode - 相加结果的链表
|
||||
"""
|
||||
dummy = ListNode(0) # 虚拟头节点
|
||||
current = dummy # 当前指针
|
||||
carry = 0 # 进位值
|
||||
|
||||
# 遍历两个链表,直到两个链表都为空且没有进位
|
||||
while l1 or l2 or carry:
|
||||
# 获取当前节点的值,如果节点为空则为0
|
||||
val1 = l1.val if l1 else 0
|
||||
val2 = l2.val if l2 else 0
|
||||
|
||||
# 计算当前位的和
|
||||
total = val1 + val2 + carry
|
||||
carry = total // 10 # 计算进位
|
||||
digit = total % 10 # 计算当前位的值
|
||||
|
||||
# 创建新节点并连接到结果链表
|
||||
current.next = ListNode(digit)
|
||||
current = current.next
|
||||
|
||||
# 移动到下一个节点
|
||||
if l1:
|
||||
l1 = l1.next
|
||||
if l2:
|
||||
l2 = l2.next
|
||||
|
||||
return dummy.next # 返回结果链表的头节点
|
||||
```
|
||||
|
||||
代码解释
|
||||
|
||||
1. 链表节点定义:ListNode类定义了链表节点的结构,包含值val和指向下一个节点的指针next。
|
||||
2. 初始化:
|
||||
· 创建虚拟头节点dummy,简化链表操作
|
||||
· 设置当前指针current指向虚拟头节点
|
||||
· 初始化进位carry为0
|
||||
3. 循环处理:
|
||||
· 使用while循环遍历两个链表,直到两个链表都遍历完且没有进位
|
||||
· 循环条件l1 or l2 or carry确保处理所有情况
|
||||
4. 获取当前值:
|
||||
· 如果链表节点存在,获取其值;否则视为0
|
||||
· 这样可以处理链表长度不同的情况
|
||||
5. 计算和与进位:
|
||||
· 计算当前位的总和:val1 + val2 + carry
|
||||
· 计算新的进位:total // 10
|
||||
· 计算当前位的值:total % 10
|
||||
6. 创建新节点:
|
||||
· 根据当前位的值创建新节点
|
||||
· 将新节点连接到结果链表
|
||||
· 移动当前指针到新节点
|
||||
7. 移动指针:
|
||||
· 如果链表还有节点,移动到下一个节点
|
||||
· 这样可以继续处理后续位
|
||||
8. 返回结果:
|
||||
· 返回虚拟头节点的下一个节点,即结果链表的头节点
|
||||
· 虚拟头节点简化了链表操作,避免处理空链表的情况
|
||||
|
||||
示例验证
|
||||
|
||||
以示例1为例:l1 = [2,4,3] (表示342),l2 = [5,6,4] (表示465)
|
||||
|
||||
1. 个位:2 + 5 = 7,进位0 → 结果个位7
|
||||
2. 十位:4 + 6 = 10,进位1 → 结果十位0
|
||||
3. 百位:3 + 4 + 1 = 8,进位0 → 结果百位8
|
||||
|
||||
最终结果为[7,0,8] (表示807),符合预期。
|
||||
|
||||
这种方法高效地处理了链表相加的问题,考虑了所有边界情况,包括链表长度不同和最后有进位的情况。
|
||||
94
public/mengyanote/LeetCode 刷题/力扣2-两数之和.md
Normal file
94
public/mengyanote/LeetCode 刷题/力扣2-两数之和.md
Normal file
@@ -0,0 +1,94 @@
|
||||
两数之和问题
|
||||
|
||||
问题描述
|
||||
|
||||
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
|
||||
|
||||
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
|
||||
|
||||
示例 1:
|
||||
|
||||
```
|
||||
输入:nums = [2,7,11,15], target = 9
|
||||
输出:[0,1]
|
||||
解释:因为 nums[0] + nums[1] == 9,返回 [0, 1]。
|
||||
```
|
||||
|
||||
示例 2:
|
||||
|
||||
```
|
||||
输入:nums = [3,2,4], target = 6
|
||||
输出:[1,2]
|
||||
```
|
||||
|
||||
示例 3:
|
||||
|
||||
```
|
||||
输入:nums = [3,3], target = 6
|
||||
输出:[0,1]
|
||||
```
|
||||
|
||||
提示:
|
||||
|
||||
· 2 <= nums.length <= 10^4
|
||||
· -10^9 <= nums[i] <= 10^9
|
||||
· -10^9 <= target <= 10^9
|
||||
· 只会存在一个有效答案
|
||||
|
||||
方法思路
|
||||
|
||||
1. 问题分析
|
||||
|
||||
我们需要在数组中找到两个不同的元素,它们的和等于目标值。由于数组可能很大,暴力解法(双重循环)的时间复杂度为O(n²),效率太低。
|
||||
|
||||
2. 算法选择
|
||||
|
||||
使用哈希表来存储每个元素及其索引,这样可以在O(1)时间内检查目标值与当前元素的差值是否存在于哈希表中。
|
||||
|
||||
3. 算法步骤
|
||||
|
||||
1. 初始化一个空哈希表(字典)
|
||||
2. 遍历数组中的每个元素及其索引
|
||||
3. 对于每个元素,计算目标值与当前元素的差值(补数)
|
||||
4. 检查该差值是否已存在于哈希表中
|
||||
5. 如果存在,返回当前索引和差值的索引
|
||||
6. 如果不存在,将当前元素及其索引存入哈希表
|
||||
|
||||
4. 复杂度分析
|
||||
|
||||
· 时间复杂度:O(n),只需遍历数组一次
|
||||
· 空间复杂度:O(n),用于存储哈希表
|
||||
|
||||
解决代码
|
||||
|
||||
```python
|
||||
def twoSum(nums, target):
|
||||
"""
|
||||
在给定数组中找出和为目标值的两个整数的索引
|
||||
|
||||
参数:
|
||||
nums: List[int] - 整数数组
|
||||
target: int - 目标值
|
||||
|
||||
返回:
|
||||
List[int] - 两个整数的索引列表
|
||||
"""
|
||||
num_map = {} # 创建空字典存储数字和索引的映射
|
||||
for i, num in enumerate(nums): # 遍历数组,获取索引和数值
|
||||
complement = target - num # 计算补数
|
||||
if complement in num_map: # 检查补数是否在字典中
|
||||
return [num_map[complement], i] # 如果在,返回两个索引
|
||||
num_map[num] = i # 如果不在,将当前数字和索引存入字典
|
||||
return [] # 如果没有找到,返回空列表(但题目保证有解,所以不会执行到这里)
|
||||
```
|
||||
|
||||
代码解释
|
||||
|
||||
1. 初始化哈希表:num_map 用于存储元素值到索引的映射
|
||||
2. 遍历数组:使用 enumerate 函数同时获取元素的索引 i 和数值 num
|
||||
3. 计算补数:对于每个 num,计算 complement = target - num
|
||||
4. 检查补数是否存在:如果补数存在于哈希表中,说明找到了两个数,返回它们的索引
|
||||
5. 存储当前元素:如果补数不存在,将当前元素及其索引存入哈希表,以便后续查找
|
||||
6. 返回结果:如果遍历结束仍未找到,返回空列表(但题目保证有解,所以不会执行到此)
|
||||
|
||||
这种方法确保了高效查找,适用于大规模数据输入,是解决此类问题的标准方法。
|
||||
42
public/mengyanote/Linux相关/Linux zip 命令总结.md
Normal file
42
public/mengyanote/Linux相关/Linux zip 命令总结.md
Normal file
@@ -0,0 +1,42 @@
|
||||
|
||||
1. 打包单个文件:
|
||||
|
||||
```
|
||||
zip 压缩包名称.zip 要打包的文件
|
||||
```
|
||||
|
||||
2. 打包多个文件:
|
||||
|
||||
```
|
||||
zip 压缩包名称.zip 文件1 文件2 文件3
|
||||
```
|
||||
|
||||
3. 打包整个目录(包括子目录):
|
||||
|
||||
```
|
||||
zip -r 压缩包名称.zip 要打包的目录
|
||||
```
|
||||
|
||||
4. 打包目录并排除某些文件:
|
||||
|
||||
```
|
||||
zip -r 压缩包名称.zip 要打包的目录 -x 要排除的文件或目录
|
||||
```
|
||||
|
||||
5. 带密码打包:
|
||||
|
||||
```
|
||||
zip -r -e 压缩包名称.zip 要打包的目录
|
||||
```
|
||||
|
||||
执行后会提示你输入密码
|
||||
|
||||
例如,要打包当前目录下的documents文件夹为backup.zip,可以使用:
|
||||
|
||||
```
|
||||
zip -r backup.zip documents
|
||||
```
|
||||
|
||||
如果系统中没有zip命令,可以先安装:
|
||||
|
||||
- Debian/Ubuntu: sudo apt install zip
|
||||
46
public/mengyanote/Linux相关/Linux命令风格解析.md
Normal file
46
public/mengyanote/Linux相关/Linux命令风格解析.md
Normal file
@@ -0,0 +1,46 @@
|
||||
在Linux命令行中,选项的不同书写形式反映了三种主流风格的设计逻辑,以下是结合历史背景与实际应用场景的深度解析:
|
||||
|
||||
### 一、Unix/Posix风格:简洁至上的单字符范式
|
||||
这是最古老的选项体系,诞生于Unix电传打字机时代。其核心特征是:
|
||||
- **符号标识**:必须以单个短横线`-`开头,如`ls -a`
|
||||
- **组合规则**:无参数的选项可自由拼接,如`ls -alh`等价于`ls -a -l -h`
|
||||
- **参数绑定**:带参数的选项需紧跟值,如`-w50`或`-w 50`均可
|
||||
- **历史局限**:受限于26个字母的容量,复杂工具需依赖组合(如`find -type f -exec`)
|
||||
|
||||
典型场景:文件操作(`ls`、`cp`)、权限管理(`chmod`)等基础命令。这种风格的高效性在处理批量文件时尤为突出,例如`rm -rf`的组合操作。
|
||||
|
||||
### 二、BSD风格:去符号化的实用主义
|
||||
BSD操作系统对Unix传统的突破体现在:
|
||||
- **无符号标识**:直接使用字母组合,如`ps aux`
|
||||
- **灵活组合**:多个选项可连写且无需分隔符,如`tar zxf archive.tar.gz`
|
||||
- **参数兼容**:带参数的选项可空格分隔或直接拼接,如`ps Uroot`与`ps U root`等效
|
||||
|
||||
这种设计源于BSD对用户体验的优化,例如`ps aux`的组合能直观展示进程全貌。但需注意,并非所有BSD风格选项都能随意组合,如`ps fx`中的`f`和`x`分别控制显示格式和非终端进程,顺序调换可能影响输出。
|
||||
|
||||
### 三、GNU风格:可读性优先的长选项
|
||||
GNU项目为解决单字符选项的语义模糊问题,引入了:
|
||||
- **双横线标识**:以`--`开头的完整单词,如`gzip --help`
|
||||
- **参数传递**:支持`--sort=time`或`--sort time`两种格式
|
||||
- **缩写机制**:唯一前缀即可生效,如`--cre`可替代`--create`
|
||||
- **功能扩展**:突破字母限制,如`wget --user-agent`可自定义请求头
|
||||
|
||||
这种风格在复杂工具(如`git`、`docker`)中广泛应用,例如`git commit --amend`比`-a`更清晰。GNU工具通常同时支持长/短选项,如`ls --all`与`-a`等效。
|
||||
|
||||
### 四、混合使用的注意事项
|
||||
1. **解析优先级**:旧风格选项需置于最前,如`tar cvf --exclude=*.tmp`中`cvf`为传统选项,`--exclude`为GNU选项
|
||||
2. **命令特异性**:并非所有命令都支持混合风格,例如`ps`可接受`ps -ef`(Unix风格)和`ps aux`(BSD风格),但`ps -aux`会被解析为混合模式
|
||||
3. **参数歧义**:当选项与文件名冲突时,可用`--`终止选项解析,如`rm -- -file`可强制删除名为`-file`的文件
|
||||
|
||||
### 五、典型命令的风格对比
|
||||
| 命令 | Unix风格 | BSD风格 | GNU风格 |
|
||||
|------------|-------------------|-----------------|------------------|
|
||||
| 解压缩 | `tar -zxf file` | `tar zxf file` | `tar --gzip --extract --file=file` |
|
||||
| 进程查看 | `ps -ef` | `ps aux` | `ps --forest` |
|
||||
| 显示帮助 | `ls -h` | `ls h`(无效) | `ls --help` |
|
||||
|
||||
### 六、历史演变与实践建议
|
||||
- **工具适配**:GNU工具普遍兼容多种风格,而BSD衍生工具(如`freebsd`的`ps`)可能仅支持特定格式
|
||||
- **学习路径**:新手建议从GNU长选项入手(如`--help`),逐步掌握短选项组合
|
||||
- **文档依赖**:使用`man`或`--help`查看具体命令的选项说明,例如`tar --help`会列出所有支持的风格
|
||||
|
||||
理解这些风格差异,不仅能更高效地使用命令行,还能深入体会不同开发社区的设计哲学。例如,GNU的长选项体现了自由软件运动对可读性的追求,而BSD的简洁风格则延续了Unix“做一件事并做好”的理念。在实际应用中,可根据场景灵活选择:快速操作时用短选项,复杂配置时用长选项,疑难问题则结合`--help`与`man`手册。
|
||||
3
public/mengyanote/Linux相关/Linux常用软件包安装.md
Normal file
3
public/mengyanote/Linux相关/Linux常用软件包安装.md
Normal file
@@ -0,0 +1,3 @@
|
||||
```bash
|
||||
sudo apt install docker-compose -y
|
||||
```
|
||||
153
public/mengyanote/Linux相关/Linux的Proc目录解析.md
Normal file
153
public/mengyanote/Linux相关/Linux的Proc目录解析.md
Normal file
@@ -0,0 +1,153 @@
|
||||
`/proc` 在 Linux 中是一个 **伪文件系统 (procfs)**,它不是存储在磁盘上的真实文件,而是内核在内存中动态生成的接口,主要用于提供 **内核、进程和系统状态** 的信息。几乎所有的监控工具(如 `top`、`htop`、`ps`、`free`、`uptime`、`vmstat`、`iostat`)都是通过读取 `/proc` 下的文件获取数据的。
|
||||
|
||||
---
|
||||
|
||||
# 🗂 **/proc 能查看的信息汇总**
|
||||
|
||||
## 1. **进程相关信息**
|
||||
|
||||
每个正在运行的进程在 `/proc` 下都会有一个以 **PID** 命名的目录,例如 `/proc/1234/`。里面的内容主要是该进程的状态:
|
||||
|
||||
- `/proc/[pid]/cmdline` → 启动命令行参数
|
||||
|
||||
- `/proc/[pid]/cwd` → 当前工作目录 (符号链接)
|
||||
|
||||
- `/proc/[pid]/exe` → 可执行文件路径 (符号链接)
|
||||
|
||||
- `/proc/[pid]/environ` → 环境变量
|
||||
|
||||
- `/proc/[pid]/fd/` → 打开的文件描述符
|
||||
|
||||
- `/proc/[pid]/maps` → 内存映射情况
|
||||
|
||||
- `/proc/[pid]/stat` → 进程状态、运行时间、优先级等
|
||||
|
||||
- `/proc/[pid]/status` → 可读性较好的进程状态信息
|
||||
|
||||
- `/proc/[pid]/task/` → 线程信息(子目录为线程 ID)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2. **CPU 相关信息**
|
||||
|
||||
- `/proc/cpuinfo` → CPU 型号、核心数、主频、缓存大小、虚拟化支持等
|
||||
|
||||
- `/proc/stat` → CPU 使用率、上下文切换、中断次数等
|
||||
|
||||
- `/proc/interrupts` → 中断统计
|
||||
|
||||
- `/proc/softirqs` → 软中断统计
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 3. **内存信息**
|
||||
|
||||
- `/proc/meminfo` → 总内存、可用内存、缓存、swap 等
|
||||
|
||||
- `/proc/kcore` → 内核内存映射(类似物理内存的转储)
|
||||
|
||||
- `/proc/vmallocinfo` → 内核虚拟内存使用情况
|
||||
|
||||
- `/proc/slabinfo` → 内核对象缓存(slab 分配器)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 4. **系统信息**
|
||||
|
||||
- `/proc/version` → 内核版本信息
|
||||
|
||||
- `/proc/uptime` → 系统运行时间和空闲时间
|
||||
|
||||
- `/proc/loadavg` → 系统平均负载
|
||||
|
||||
- `/proc/cmdline` → 内核启动参数
|
||||
|
||||
- `/proc/modules` → 已加载的内核模块
|
||||
|
||||
- `/proc/filesystems` → 支持的文件系统类型
|
||||
|
||||
- `/proc/mounts` → 当前挂载的文件系统(和 `mount` 命令一致)
|
||||
|
||||
- `/proc/partitions` → 磁盘分区信息
|
||||
|
||||
- `/proc/devices` → 已注册的设备
|
||||
|
||||
- `/proc/ioports` → I/O 端口使用情况
|
||||
|
||||
- `/proc/iomem` → 内存映射的 I/O 信息
|
||||
|
||||
- `/proc/diskstats` → 磁盘 I/O 统计
|
||||
|
||||
- `/proc/locks` → 当前内核中的文件锁
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 5. **网络信息**
|
||||
|
||||
在 `/proc/net/` 目录下:
|
||||
|
||||
- `/proc/net/dev` → 网络接口的流量统计(类似 `ifconfig`、`ip -s link`)
|
||||
|
||||
- `/proc/net/tcp`、`/proc/net/udp` → TCP/UDP 连接信息(类似 `ss`、`netstat`)
|
||||
|
||||
- `/proc/net/unix` → UNIX 套接字信息
|
||||
|
||||
- `/proc/net/route` → 路由表
|
||||
|
||||
- `/proc/net/arp` → ARP 缓存表
|
||||
|
||||
- `/proc/net/snmp` → 网络协议统计信息(ICMP、TCP、UDP)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 6. **内核配置与参数**
|
||||
|
||||
- `/proc/sys/` → 内核参数(可读可写,可通过 `sysctl` 修改),例如:
|
||||
|
||||
- `/proc/sys/net/ipv4/ip_forward` → 是否启用 IPv4 转发
|
||||
|
||||
- `/proc/sys/kernel/hostname` → 主机名
|
||||
|
||||
- `/proc/sys/kernel/pid_max` → 最大进程号
|
||||
|
||||
- `/proc/sys/vm/swappiness` → 内存换出策略
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 7. **其他有用的文件**
|
||||
|
||||
- `/proc/self/` → 当前进程(即访问 `/proc` 的进程本身)的信息
|
||||
|
||||
- `/proc/kmsg` → 内核日志(类似 `dmesg`)
|
||||
|
||||
- `/proc/sched_debug` → 调度器的调试信息
|
||||
|
||||
- `/proc/zoneinfo` → 内存区域信息
|
||||
|
||||
- `/proc/swap` → swap 使用情况
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 📊 **总结**
|
||||
|
||||
通过 `/proc`,你可以获取:
|
||||
|
||||
1. **进程级别** → PID、内存、CPU、线程、文件描述符
|
||||
|
||||
2. **系统级别** → CPU、内存、负载、启动参数、模块、文件系统
|
||||
|
||||
3. **硬件级别** → 设备、中断、I/O 端口、内存映射
|
||||
|
||||
4. **网络级别** → 接口流量、TCP/UDP 连接、路由、ARP
|
||||
|
||||
5. **内核级别** → 内核参数、调度、日志、虚拟内存
|
||||
|
||||
|
||||
---
|
||||
12
public/mengyanote/Linux相关/Windows文件一键上传到Linux.md
Normal file
12
public/mengyanote/Linux相关/Windows文件一键上传到Linux.md
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
**萌芽农场**
|
||||
```powershell
|
||||
scp -r D:\Godot\Godot项目\比较完成的作品\萌芽农场\Server\* root@192.168.31.233:/shumengya/docker/mengyafarmserver/
|
||||
|
||||
scp -r D:\Godot\Godot项目\比较完成的作品\萌芽农场\Server\* root@192.168.1.233:/shumengya/docker/mengyafarmserver/
|
||||
```
|
||||
|
||||
一个人的服务器(我的世界基岩版1.1.xPocketMine服务器)
|
||||
```powershell
|
||||
scp -r C:\Users\BigTang\Desktop\一个人的服务器\* root@192.168.31.233:/shumengya/docker/OnePersonServer/
|
||||
```
|
||||
17
public/mengyanote/Linux相关/linux安装nodejs22.md
Normal file
17
public/mengyanote/Linux相关/linux安装nodejs22.md
Normal file
@@ -0,0 +1,17 @@
|
||||
apt install curl
|
||||
|
||||
# Download and install nvm:
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||
|
||||
# in lieu of restarting the shell
|
||||
\. "$HOME/.nvm/nvm.sh"
|
||||
|
||||
# Download and install Node.js:
|
||||
nvm install 22
|
||||
|
||||
# Verify the Node.js version:
|
||||
node -v # Should print "v22.19.0".
|
||||
|
||||
# Verify npm version:
|
||||
npm -v # Should print "10.9.3".
|
||||
|
||||
50
public/mengyanote/Linux相关/ubuntu设置root登陆.md
Normal file
50
public/mengyanote/Linux相关/ubuntu设置root登陆.md
Normal file
@@ -0,0 +1,50 @@
|
||||
在 Ubuntu GNOME 22.04 中,默认情况下是禁用 root 用户的登录,以提高系统安全性。如果你需要启用 root 用户并允许其通过图形界面登录,可以按照以下步骤操作:
|
||||
|
||||
### 1. 启用 Root 用户
|
||||
|
||||
Ubuntu 默认情况下禁用了 root 用户账户,因此我们需要为 root 设置密码才能启用它。
|
||||
|
||||
1. 打开终端,使用以下命令设置 root 用户密码:
|
||||
|
||||
```bash
|
||||
sudo passwd root
|
||||
```
|
||||
|
||||
然后根据提示输入并确认 root 用户密码。
|
||||
|
||||
### 2. 允许 Root 用户登录图形界面
|
||||
|
||||
Ubuntu 默认不允许 root 用户直接登录 GNOME 图形界面。如果你希望启用 root 登录图形界面,需要修改 GDM(GNOME Display Manager)的配置文件。
|
||||
|
||||
1. 编辑 GDM 配置文件:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/gdm3/custom.conf
|
||||
```
|
||||
|
||||
2. 找到 `[security]` 部分,并确保以下行没有被注释掉(没有 `#`):
|
||||
|
||||
```plaintext
|
||||
AllowRoot=true
|
||||
```
|
||||
|
||||
3. 保存并退出(按 `Ctrl + O` 保存,`Ctrl + X` 退出)。
|
||||
|
||||
### 3. 重启 GDM
|
||||
|
||||
配置更改后,重启 GDM 或重新启动计算机以使更改生效。你可以使用以下命令重启 GDM:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart gdm3
|
||||
```
|
||||
|
||||
### 4. 使用 root 登录
|
||||
|
||||
现在,你应该能够在登录屏幕选择 root 用户进行登录了。只需要输入你为 root 设置的密码即可。
|
||||
|
||||
### 5. 注意安全
|
||||
|
||||
启用 root 用户图形界面登录可能会增加系统的安全风险,因为 root 用户具有系统的完全控制权限。为了保护系统的安全性,建议仅在必要时启用 root 登录,并使用强密码以及定期检查系统的安全性。
|
||||
|
||||
如果你不需要 root 图形界面登录,建议使用 `sudo` 命令来执行管理员操作,这样可以减少潜在的安全风险。
|
||||
|
||||
53
public/mengyanote/Linux相关/把Ubuntu镜像源切换到阿里云.md
Normal file
53
public/mengyanote/Linux相关/把Ubuntu镜像源切换到阿里云.md
Normal file
@@ -0,0 +1,53 @@
|
||||
要将 Ubuntu 22.04 (AMD64) 的软件源更换为阿里云的镜像源,可以按照以下步骤操作:
|
||||
|
||||
### 1. 备份当前的源列表
|
||||
|
||||
在更改源之前,先备份原有的 `sources.list` 文件:
|
||||
|
||||
```bash
|
||||
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
|
||||
```
|
||||
|
||||
### 2. 修改 `sources.list` 文件
|
||||
|
||||
打开 `/etc/apt/sources.list` 文件,编辑并替换为阿里云的源地址:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/apt/sources.list
|
||||
```
|
||||
|
||||
将文件内容替换为以下内容(适用于 Ubuntu 22.04):
|
||||
|
||||
```plaintext
|
||||
# 阿里云 Ubuntu 22.04 镜像源
|
||||
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
|
||||
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
|
||||
|
||||
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
|
||||
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
|
||||
|
||||
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
|
||||
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
|
||||
|
||||
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
|
||||
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
|
||||
```
|
||||
|
||||
### 3. 更新软件包列表
|
||||
|
||||
替换源后,更新 apt 包索引:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
### 4. 升级已安装的软件包
|
||||
|
||||
为了确保一切顺利运行,你可以运行以下命令来升级现有的软件包:
|
||||
|
||||
```bash
|
||||
sudo apt upgrade
|
||||
```
|
||||
|
||||
完成这些步骤后,你的 Ubuntu 系统应该就会使用阿里云的镜像源了,下载速度会更加快速稳定。
|
||||
|
||||
15
public/mengyanote/Linux相关/树萌芽常用Linux命令集合.md
Normal file
15
public/mengyanote/Linux相关/树萌芽常用Linux命令集合.md
Normal file
@@ -0,0 +1,15 @@
|
||||
tar.gz文件解压:
|
||||
tar -zxvf 文件名
|
||||
|
||||
linux 重命名文件/文件夹:
|
||||
mv 原文件名 新文件名
|
||||
|
||||
注意:/etc/systemd/system/ 这里放置systemctl服务
|
||||
|
||||
重新加载systemctl服务:
|
||||
systemctl daemon-reload
|
||||
|
||||
systemctl start 服务名
|
||||
systemctl stop 服务名
|
||||
systemctl enable 服务名
|
||||
systemctl status 服务名
|
||||
54
public/mengyanote/Obsidion相关/Obsidion美化.md
Normal file
54
public/mengyanote/Obsidion相关/Obsidion美化.md
Normal file
@@ -0,0 +1,54 @@
|
||||
```json
|
||||
{
|
||||
"Appearance-light@@theme-light-style-select": "theme-light-background-adapt",
|
||||
"Appearance-light@@mod-left-split-background-select-light": "mod-left-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-left-CSS-light": "radial-gradient(100% 50% at 100% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)",
|
||||
"Appearance-light@@background-mod-left-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@mod-right-split-background-select-light": "mod-right-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-right-CSS-light": "radial-gradient(100% 50% at 0% 50%, rgba(90, 109, 237, 0.1) 0%, rgba(255, 255, 255, 0) 100%)",
|
||||
"Appearance-light@@background-mod-right-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@mod-root-split-background-select-light": "mod-root-split-background-CSS-light",
|
||||
"Appearance-light@@background-mod-root-CSS-light": "transparent",
|
||||
"Appearance-light@@background-mod-root-CSS-backdrop-filter-light": "blur(0px)",
|
||||
"Appearance-light@@background-underlying-select-light": "background-underlying-CSS-light",
|
||||
"Appearance-light@@background-underlying-CSS-light": "linear-gradient(168.44deg, #D7DAEA 1.62%, #F2F2F8 95.72%)",
|
||||
"Appearance-light@@background-underlying-CSS-blend-mode-light": "normal",
|
||||
"Appearance-light@@card-border-radius-light": "0px",
|
||||
"Appearance-light@@card-shadow-light": "none",
|
||||
"Appearance-light@@background-activated-tab-header-light": "radial-gradient(50% 150% at 50% 150%, #F8F9FF 0%, rgba(97, 54, 144, 0) 100%)",
|
||||
"Appearance-light@@shadow-activated-tab-header-light": "none",
|
||||
"Appearance-light@@indicator-remove-light": true,
|
||||
"Appearance-light@@Active-states-file-explorer-select-light": "activated-file-tab-style-light",
|
||||
"Appearance-light@@workspace-divider-transparent-light": true,
|
||||
"Components@@CTA-BTN-enable": true,
|
||||
"Components@@file-names-untrim": true,
|
||||
"Components@@folder-font-bold": true,
|
||||
"Components@@colorful-folder": true,
|
||||
"Components@@file-icon-remove": false,
|
||||
"Components@@outline-enhanced": true,
|
||||
"Components@@new-tab-btn-select": "new-tab-btn-default",
|
||||
"Components@@immersive-canvas": true,
|
||||
"Components@@scrollbar-hide": true,
|
||||
"Appearance-light@@card-layout-open-light": true,
|
||||
"Appearance-light@@accent-color-override-light": false,
|
||||
"Appearance-light@@card-highlight-light": true,
|
||||
"Editor@@line-hover-indicator": true,
|
||||
"Editor@@focus-indicator-codeblock-line-number": true,
|
||||
"Editor@@focus-indicator-list-level": true,
|
||||
"Editor@@editor-grid-background-pattren": true,
|
||||
"Editor@@inline-title-divider-remove": true,
|
||||
"Editor@@h1-divider-on": true,
|
||||
"Editor@@h2-divider-on": true,
|
||||
"Editor@@h3-divider-on": true,
|
||||
"Editor@@h4-divider-on": true,
|
||||
"Editor@@h5-divider-on": true,
|
||||
"Editor@@h6-divider-on": true,
|
||||
"Editor@@text-align-justify": true,
|
||||
"Editor@@bold-color@@light": "#4781EC",
|
||||
"Editor@@italic-color@@light": "#FF4BFE",
|
||||
"Editor@@img-center-align": true,
|
||||
"Mobile@@drawer-phone-full-width": true,
|
||||
"Mobile@@card-layout-pad-open": true,
|
||||
"Plugin@@colorful-checkbox": true
|
||||
}
|
||||
```
|
||||
13
public/mengyanote/临时解决方案/2025年大一下暑假规划(大方向).md
Normal file
13
public/mengyanote/临时解决方案/2025年大一下暑假规划(大方向).md
Normal file
@@ -0,0 +1,13 @@
|
||||
- [x] 更新修复一下萌芽软件库网站
|
||||
- [ ] 重新搭建萌芽软件库,萌芽软件更新后台 两个网站并封装成Docker
|
||||
- [x] 继续学数据库,特别是MongoDB,MySQL
|
||||
- [x] 继续学计算机网络
|
||||
- [ ] 练习华为ICT
|
||||
- [ ] 完成树萌芽个人主页(shumengya.top)
|
||||
- [ ] LeetCode刷题
|
||||
- [ ] 学习Python
|
||||
- [x] 做一个flutter软件,学习一下flutter
|
||||
- [ ] 做一个uniapp软件,学习一下uniapp
|
||||
- [ ] 做一个微信小程序,学习一下微信开发者工具
|
||||
|
||||
|
||||
1
public/mengyanote/临时解决方案/Code-Server配置.md
Normal file
1
public/mengyanote/临时解决方案/Code-Server配置.md
Normal file
@@ -0,0 +1 @@
|
||||
./code-server --host 0.0.0.0 --port 8888 --auth password ~/shumengya/project
|
||||
87
public/mengyanote/临时解决方案/HomePage美化配置.md
Normal file
87
public/mengyanote/临时解决方案/HomePage美化配置.md
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
**时间日期小组件**
|
||||
|
||||
```yaml
|
||||
- datetime:
|
||||
text_size: xl
|
||||
format:
|
||||
timeStyle: short
|
||||
|
||||
# 13:37
|
||||
format:
|
||||
timeStyle: short
|
||||
hourCycle: h23
|
||||
|
||||
# 1:37 PM
|
||||
format:
|
||||
timeStyle: short
|
||||
hour12: true
|
||||
|
||||
# 1/23/22, 1:37 PM
|
||||
format:
|
||||
dateStyle: short
|
||||
timeStyle: short
|
||||
hour12: true
|
||||
|
||||
|
||||
# 4 januari 2023 om 13:51:25 PST
|
||||
locale: nl
|
||||
format:
|
||||
dateStyle: long
|
||||
timeStyle: long
|
||||
```
|
||||
|
||||
**服务器监控小组件**
|
||||
|
||||
```yaml
|
||||
- glances:
|
||||
url: http://host.or.ip:port
|
||||
username: user # optional if auth enabled in Glances
|
||||
password: pass # optional if auth enabled in Glances
|
||||
version: 4 # required only if running glances v4 or higher, defaults to 3
|
||||
cpu: true # optional, enabled by default, disable by setting to false
|
||||
mem: true # optional, enabled by default, disable by setting to false
|
||||
cputemp: true # disabled by default
|
||||
uptime: true # disabled by default
|
||||
disk: / # disabled by default, use mount point of disk(s) in glances. Can also be a list (see below)
|
||||
diskUnits: bytes # optional, bytes (default) or bbytes. Only applies to disk
|
||||
expanded: true # show the expanded view
|
||||
label: MyMachine # optional
|
||||
|
||||
disk:
|
||||
- /
|
||||
- /boot
|
||||
...
|
||||
```
|
||||
|
||||
**问候语小组件**
|
||||
|
||||
```yaml
|
||||
- greeting:
|
||||
text_size: xl
|
||||
text: Greeting Text
|
||||
#有效的文本大小有 `4xl`、`3xl`、`2xl`、`xl`、`md`、`sm`、`xs`。
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
12
public/mengyanote/临时解决方案/IDE快捷键.md
Normal file
12
public/mengyanote/临时解决方案/IDE快捷键.md
Normal file
@@ -0,0 +1,12 @@
|
||||
##### **Cursor**:
|
||||
全部展开:ctrl+m ,ctrl+j
|
||||
全部收缩:ctrl+m,ctrl+0
|
||||
|
||||
##### **VsCode,Trae**:
|
||||
全部展开:Ctrl + K, Ctrl + J
|
||||
全部收缩:Ctrl + K, Ctrl + 0
|
||||
|
||||
##### **VsCode 打开命令行**
|
||||
ctrl+shift+P
|
||||
|
||||
Python: Select Interpreter 选择python解释器+设置python环境
|
||||
109
public/mengyanote/临时解决方案/Termux安装nodejs失败.md
Normal file
109
public/mengyanote/临时解决方案/Termux安装nodejs失败.md
Normal file
@@ -0,0 +1,109 @@
|
||||
你遇到的错误:
|
||||
|
||||
```
|
||||
CANNOT LINK EXECUTABLE "node": cannot locate symbol "EVP_MD_CTX_get_size_ex"
|
||||
```
|
||||
|
||||
通常表明 Termux 中的系统库(如 OpenSSL)与 Node.js 版本不兼容,缺少该符号的定义,导致 `node` 无法正常链接。
|
||||
|
||||
---
|
||||
|
||||
## 解决思路
|
||||
|
||||
### 1. 更新与升级系统包——优先尝试
|
||||
|
||||
多个用户反馈,仅通过更新、升级系统软件包,就能解决类似的问题:
|
||||
|
||||
- Stack Overflow 上 Akino(2024 年 12 月)指出,使用如下命令:
|
||||
|
||||
```bash
|
||||
apt full-upgrade
|
||||
```
|
||||
|
||||
(注意不是 `full upgrade`)可能解决问题 。
|
||||
|
||||
- 其他环境(虽然不是 Termux)出现类似错误也由 `apk upgrade` 解决,这同样说明包版本不一致是关键问题 。
|
||||
|
||||
|
||||
**建议在 Termux 中执行以下命令:**
|
||||
|
||||
```bash
|
||||
pkg update
|
||||
pkg upgrade
|
||||
apt full-upgrade
|
||||
```
|
||||
|
||||
然后再次尝试安装 `nodejs` 或运行 `node`,看看问题是否依旧。
|
||||
|
||||
---
|
||||
|
||||
### 2. 如果还是报相同错误(符号缺失)
|
||||
|
||||
可能意味着 Termux 上的 OpenSSL 与 Node.js 的预编译版本不可兼容,这种情况下建议使用以下替代方案:
|
||||
|
||||
#### A. 使用 `nvm` 手动编译安装 Node.js
|
||||
|
||||
1. **安装需求工具**:
|
||||
|
||||
```bash
|
||||
pkg install curl git build-essential python
|
||||
```
|
||||
|
||||
2. **安装 nvm**:
|
||||
|
||||
```bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
3. **通过 nvm 安装 Node.js**(例如最新版或 LTS):
|
||||
|
||||
```bash
|
||||
nvm install 24
|
||||
nvm use 24
|
||||
```
|
||||
|
||||
|
||||
这种方法会从源代码编译 Node.js,因此能确保与当前系统的 OpenSSL 库兼容。
|
||||
|
||||
#### B. 回退到已知兼容的 Node.js 版本
|
||||
|
||||
Termux Wiki 提示,只可安装当前仓库提供的 `nodejs` 或 `nodejs-lts`,且不能同时安装两者 。若之前安装的版本不兼容,可尝试安装仓库中较旧或更稳定的版本(一般 `nodejs-lts` 更推荐)。
|
||||
|
||||
---
|
||||
|
||||
## 总结建议
|
||||
|
||||
|步骤|操作|
|
||||
|---|---|
|
||||
|1⃣|执行 `pkg update && pkg upgrade`,再 `apt full-upgrade`|
|
||||
|2⃣|如果仍然报错,用 `nvm` 手动从源码安装 Node.js|
|
||||
|3⃣|或者尝试安装仓库提供的 LTS 版本,确认是否兼容|
|
||||
|
||||
---
|
||||
|
||||
### 快速操作脚本(可复制粘贴)
|
||||
|
||||
```bash
|
||||
# 更新系统
|
||||
pkg update && pkg upgrade
|
||||
apt full-upgrade
|
||||
|
||||
# 安装必要工具
|
||||
pkg install curl git build-essential python
|
||||
|
||||
# 安装 nvm
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
|
||||
source ~/.bashrc
|
||||
|
||||
# 使用 nvm 安装最新 Node.js
|
||||
nvm install node
|
||||
nvm use node
|
||||
|
||||
# 或安装 LTS
|
||||
nvm install --lts
|
||||
nvm use --lts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
9
public/mengyanote/临时解决方案/临时.md
Normal file
9
public/mengyanote/临时解决方案/临时.md
Normal file
@@ -0,0 +1,9 @@
|
||||
杨耀翔/李昶佑/夏春鹏/王彤
|
||||
|
||||
电气信息学院/计算机与软件学院/计算机与软件学院/计算机与软件学院
|
||||
|
||||
202431076214/202431062440/202431061719/202431062229
|
||||
|
||||
| |
|
||||
| -------------------------------------------------- |
|
||||
| 1、周幂 西南石油大学 教师 1203212378@qq.com 17781100230 |
|
||||
125
public/mengyanote/临时解决方案/修改hosts方式来直连Github.md
Normal file
125
public/mengyanote/临时解决方案/修改hosts方式来直连Github.md
Normal file
@@ -0,0 +1,125 @@
|
||||
通过修改 hosts 文件来直连 GitHub,是解决国内访问 GitHub 时连接不稳定、速度慢甚至无法访问的有效方法。其原理是绕过 DNS 解析,直接将 GitHub 的主要域名指向其真实、稳定的 IP 地址
|
||||
|
||||
#### 核心原理
|
||||
|
||||
当你在浏览器输入 github.com 时,系统会先查询 DNS 服务器来获取对应的 IP 地址。由于网络环境问题,这个查询过程可能失败或返回不理想的 IP。修改 hosts 文件就是手动在本地建立“域名 -> IP”的映射关系,跳过不可靠的 DNS 查询,直达目标服务器。
|
||||
|
||||
---
|
||||
|
||||
#### 方法一:手动查找并更新(推荐用于理解过程)
|
||||
|
||||
##### 第一步:获取最新的 GitHub IP 地址
|
||||
|
||||
IP 地址会变化,所以不能一直用网上搜到的老旧 IP。你需要自己查询最新的。
|
||||
|
||||
1. 访问 IPAddress.com 网站查询以下关键域名的当前 IP 地址。
|
||||
2. 需要查询的域名包括:
|
||||
· github.com
|
||||
· assets-cdn.github.com
|
||||
· github.global.ssl.fastly.net
|
||||
· codeload.github.com
|
||||
· gist.github.com
|
||||
3. 查询方法:
|
||||
· 打开 https://www.ipaddress.com/
|
||||
· 在搜索框中分别输入每个域名进行查询。
|
||||
· 在结果页面中找到对应的 IP 地址(通常是 A Record 或 AAAA Record)。例如,查询 github.com 可能会得到 140.82.113.4(这是一个示例,请以你查询到的为准)。
|
||||
注意:github.global.ssl.fastly.net 可能是一个 CDN 域名,有时会解析出多个 IP,选择一个延迟较低的即可。对于 assets-cdn.github.com,它可能指向多个 CloudFront 地址,也选择一个稳定的 IP。
|
||||
|
||||
##### 第二步:修改 hosts 文件
|
||||
|
||||
hosts 文件位于系统的特定位置,修改需要管理员权限。
|
||||
|
||||
###### Windows 系统:
|
||||
|
||||
1. hosts 文件路径:C:\Windows\System32\drivers\etc\hosts
|
||||
2. 在开始菜单搜索 “记事本”,右键点击,选择 “以管理员身份运行”。
|
||||
3. 在记事本中,点击 文件 -> 打开,导航到 C:\Windows\System32\drivers\etc,将文件类型改为“所有文件 ( . )”,就能看到 hosts 文件,选择它打开。
|
||||
4. 在文件末尾,添加如下格式的内容(将 IP地址 替换为你第一步查到的真实 IP):
|
||||
```bash
|
||||
# GitHub Start
|
||||
140.82.113.4 github.com
|
||||
185.199.108.153 assets-cdn.github.com
|
||||
151.101.65.194 github.global.ssl.fastly.net
|
||||
140.82.114.9 codeload.github.com
|
||||
140.82.113.5 gist.github.com
|
||||
# GitHub End
|
||||
```
|
||||
注意:IP 和域名之间用空格或制表符隔开。# 开头的是注释,方便管理。
|
||||
5. 保存文件。如果无法直接保存,可以先将文件另存到桌面,修改后再拖回原目录覆盖。
|
||||
|
||||
###### macOS / Linux 系统:
|
||||
|
||||
1. 打开终端(Terminal)。
|
||||
2. 使用 sudo 权限编辑 hosts 文件:
|
||||
```bash
|
||||
sudo nano /etc/hosts
|
||||
```
|
||||
输入你的电脑密码。
|
||||
3. 光标移动到最后,同样添加上述格式的内容。
|
||||
4. 按下 Ctrl + O 写入保存,再按 Ctrl + X 退出 nano 编辑器。
|
||||
|
||||
##### 第三步:刷新 DNS 缓存
|
||||
|
||||
修改 hosts 后,需要清除系统旧的 DNS 缓存才能使新设置生效。
|
||||
|
||||
· Windows: 以管理员身份打开命令提示符(CMD 或 PowerShell),输入:
|
||||
```cmd
|
||||
ipconfig /flushdns
|
||||
```
|
||||
· macOS: 在终端输入:
|
||||
```bash
|
||||
sudo killall -HUP mDNSResponder
|
||||
```
|
||||
对于不同版本的 macOS,命令可能略有不同,如 sudo dscacheutil -flushcache。
|
||||
· Linux: 根据发行版不同,命令可能不同。常见的是:
|
||||
```bash
|
||||
sudo systemctl restart nscd
|
||||
或
|
||||
sudo /etc/init.d/networking restart
|
||||
```
|
||||
|
||||
##### 第四步:测试连接
|
||||
|
||||
1. 打开命令提示符或终端,ping 一下域名,看是否解析到你设置的 IP:
|
||||
```bash
|
||||
ping github.com
|
||||
```
|
||||
2. 直接打开浏览器访问 github.com,看是否能正常加载。
|
||||
|
||||
---
|
||||
|
||||
#### 方法二:使用开源工具自动更新(更省心)
|
||||
|
||||
手动更新比较麻烦,推荐使用开源工具 SwitchHosts,它可以自动从远程获取最新的 hosts 规则并应用。
|
||||
|
||||
1. 下载 SwitchHosts:
|
||||
· 访问其 GitHub 发布页:https://github.com/oldj/SwitchHosts/releases
|
||||
· 下载对应你操作系统的版本(如 SwitchHosts_windows_arch.exe)。
|
||||
2. 配置远程规则:
|
||||
· 打开 SwitchHosts,点击 “+” 添加一个新规则。
|
||||
· 选择 “远程”。
|
||||
· 在规则名中填写 GitHub Hosts。
|
||||
· 在 URL 地址中填入一个持续更新的 hosts 源,例如:
|
||||
· ineo6/hosts(推荐): https://gitee.com/ineo6/hosts/raw/master/hosts
|
||||
· 或者其他在 GitHub/Gitee 上维护的知名 hosts 项目。
|
||||
· 设置自动刷新时间(如 1 小时)。
|
||||
· 点击 “确定” 保存。
|
||||
3. 启用规则:
|
||||
· 在 SwitchHosts 主界面,点击你刚添加的 GitHub Hosts 规则旁边的开关,将其启用(变为绿色)。
|
||||
· 软件可能会请求管理员权限,同意即可。
|
||||
|
||||
此后,SwitchHosts 会自动定期从你设置的 URL 拉取最新的 GitHub IP 地址并更新你的 hosts 文件,无需你再手动操作。
|
||||
|
||||
常见问题与解决
|
||||
|
||||
· 修改后仍无法访问?
|
||||
· 检查 IP 是否正确: 你使用的 IP 可能已经过期。请重新用 IPAddress.com 查询或使用 SwitchHosts。
|
||||
· 检查 hosts 文件格式: 确保 IP 和域名之间只有空格,没有多余字符。
|
||||
· 彻底清除浏览器缓存和 DNS 缓存: 关闭浏览器再重新打开,并再次执行 ipconfig /flushdns。
|
||||
· 尝试 HTTPS 访问: 有些工具会劫持 HTTP 请求,直接访问 https://github.com。
|
||||
· 安全性问题?
|
||||
· 手动从 IPAddress.com 查询是安全的。
|
||||
· 使用 SwitchHosts 时,请确保你使用的远程规则源是可信的(如上述推荐的 Gitee 源,访问速度较快)。
|
||||
· 修改 hosts 是永久解决方案吗?
|
||||
· 不是永久的。因为 GitHub 的服务器 IP 可能会变更。一旦变更,旧的映射就会失效。这就是为什么推荐使用 SwitchHosts 这类工具来自动更新。
|
||||
|
||||
28
public/mengyanote/临时解决方案/萌芽云剪切板.md
Normal file
28
public/mengyanote/临时解决方案/萌芽云剪切板.md
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
用小米平板尝鲜下blender安卓版,目前只有高通SOC可用。感谢大佬的移植。大家可以自己安装试试,安卓手机和平板都可以。
|
||||
大佬也在B站:@dshawshank
|
||||
github地址:https://github.com/dshawshank/APP-android_arm64
|
||||
网盘:https://pan.quark.cn/s/e504c586c802
|
||||
|
||||
比例 「1:1」图片风格为2D像素风格, 画一个游戏装饰元素,风格为2.5D 就是上帝视角,就是正交斜视角那种有立体感,背景是纯黑色,纯黑色 不带任何文字,现在我要你画一个 作物仓库 仓库相关的装饰可以多一点 记住一定要3d立体感
|
||||
|
||||
|
||||
> 请及时删除陈旧内容
|
||||
|
||||
我想实现玩家自己小卖部功能结构就像这样 先不设计图片 目前只能售卖 种子 作物(成熟物) 道具 这三种 先实现 作物 大致思路是 玩家在 作物仓库点击相应作物
|
||||
|
||||
Github仓库: https://github.com/1812z/sleepy
|
||||
视奸网站: https://sleepy.1812z.top/
|
||||
支持手机和PC的推荐分支: https://github.com/HBWuChang/sleepy
|
||||
|
||||
Navicat
|
||||
|
||||
DBeaver PRO
|
||||
|
||||
开发者的话
|
||||
《小王国: 即时战略》是由一位独立开发者制作的游戏,并由一位初创独立发行人进行推广。我们非常重视你的反馈和支持!欢迎将游戏加入愿望单,助力我们成长 —— 游戏即将发布!我们正在努力
|
||||
让游戏支持中文,也希望您能理解,如果某些文本翻译不够准确。如果您喜欢我们的游戏,并愿意协助我们完善中文翻译,欢迎在讨论区发帖与我们联系,我们非常乐意收到您的帮助与反馈!
|
||||
|
||||
https://t.me/easynode_notify
|
||||
|
||||
[https://github.com/chaos-zhu/easynode](https://github.com/chaos-zhu/easynode)
|
||||
44
public/mengyanote/临时解决方案/跨平台软件开发总结.md
Normal file
44
public/mengyanote/临时解决方案/跨平台软件开发总结.md
Normal file
@@ -0,0 +1,44 @@
|
||||
#### **1.Flutter:**
|
||||
优点:
|
||||
- Windows和Android表现比较一致,UI比较好看
|
||||
缺点:
|
||||
- 使用dart语言,完全不熟悉,需要时间打磨
|
||||
- gradle配置十分麻烦,开了梯子还卡进度条,目前只找到用国内镜像开发
|
||||
|
||||
#### **2.Godot:**
|
||||
优点:
|
||||
- 跨平台性极强,基于gdscript各平台表现几乎一模一样
|
||||
- 可以使用gdscript,c#开发上手快,还可以c++扩展
|
||||
缺点:
|
||||
- UI十分丑陋,美化有点麻烦(ai可以)
|
||||
- 毕竟是游戏引擎对一些软件api适配十分不好,基本都要自己造轮子
|
||||
|
||||
#### **3.Kivy:**
|
||||
优点:
|
||||
- 使用Python开发,速度几乎最快
|
||||
缺点:
|
||||
- 妈的依赖下半天,开梯子也慢的离谱
|
||||
- UI比godot还丑
|
||||
- 构建安卓apk只能用Linux环境
|
||||
- 默认不支持中文,配置麻烦
|
||||
|
||||
#### **4.ReactNative-expo**
|
||||
优点:
|
||||
- 使用JavaScript开发,前端框架,比较熟悉
|
||||
- 基于云端构建比较方便(直接几行命令)
|
||||
- 调试比较方便,热更新,热重载
|
||||
缺点:
|
||||
- 云端构建不符合极客精神,而且需要排队(时间有时候很长)
|
||||
- 软件导出apk很大
|
||||
|
||||
#### **5.ReactNative**
|
||||
还没试
|
||||
|
||||
#### **6.UniApp:**
|
||||
优点:
|
||||
- 基于JavaScript,前端框架,比较熟悉
|
||||
- 云端构建,比较方便
|
||||
缺点:
|
||||
- 需要登录注册(编辑器)
|
||||
- 云端构建不符合极客精神,而且需要排队(时间有时候很长)
|
||||
|
||||
11
public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md
Normal file
11
public/mengyanote/华为ICT/MAC地址由多少位16进制组成.md
Normal file
@@ -0,0 +1,11 @@
|
||||
MAC地址(Media Access Control Address)通常由 48位二进制数 表示,但为了方便阅读和书写,通常用 12位十六进制数字 组成,其格式为:
|
||||
XX:XX:XX:XX:XX:XX 或 XX-XX-XX-XX-XX-XX(每两位十六进制数为一组,共6组)。
|
||||
|
||||
例如:00:1A:2B:3C:4D:5E。
|
||||
|
||||
补充说明:
|
||||
|
||||
· 前24位(前6位十六进制)是 厂商标识(OUI),由IEEE分配给设备制造商。
|
||||
· 后24位(后6位十六进制)是 设备唯一标识,由制造商自行分配。
|
||||
|
||||
因此,MAC地址由 12位十六进制数字 组成(共48位二进制)。
|
||||
119
public/mengyanote/华为ICT/子网划分后计算广播地址.md
Normal file
119
public/mengyanote/华为ICT/子网划分后计算广播地址.md
Normal file
@@ -0,0 +1,119 @@
|
||||
划分后的网段为 172.16.0.0/17,需要计算该子网的广播地址。
|
||||
|
||||
步骤解析:
|
||||
|
||||
1. 确定子网掩码:
|
||||
/17 表示子网掩码为 255.255.128.0(即前17位为网络位,后15位为主机位)。
|
||||
2. 计算网络地址和广播地址:
|
||||
· IP地址 172.16.0.0 是B类地址,默认掩码为16位,但这里划分子网后为17位。
|
||||
· 子网掩码 255.255.128.0 的二进制形式:
|
||||
11111111.11111111.10000000.00000000
|
||||
· 网络地址(172.16.0.0)的二进制:
|
||||
10101100.00010000.00000000.00000000
|
||||
· 广播地址是主机位全为1的地址:
|
||||
主机位有15位(后15位),所以将主机位全部置1:
|
||||
10101100.00010000.01111111.11111111 转换为十进制:172.16.127.255
|
||||
3. 验证选项:
|
||||
· A. 172.16.128.255(属于下一个子网)
|
||||
· B. 172.16.255.255(默认B类广播地址,但这里已划分子网)
|
||||
· C. 172.16.0.255(主机位不全为1,不是广播地址)
|
||||
· D. 172.16.127.255(正确)
|
||||
|
||||
|
||||
|
||||
核心概念理解
|
||||
|
||||
首先,我们需要理解几个基本概念:
|
||||
|
||||
1. IP地址:就像你家的地址,由“网络部分”和“主机部分”组成。
|
||||
· 网络部分:相当于“XX省XX市XX区XX街道”,标识了一个大的区域。
|
||||
· 主机部分:相当于“XX小区XX栋XX号”,标识了在这个区域内的具体门牌。
|
||||
2. 子网掩码:用来告诉我们IP地址中,哪部分是“网络”,哪部分是“主机”。
|
||||
· /17 就是一种表示子网掩码长度的方法,意思是IP地址的前17位是网络部分,剩下的(32-17=15位)是主机部分。
|
||||
3. 广播地址:在一个小区(子网)里,如果你想对所有住户(所有主机) 喊话,你就需要使用“广播地址”。它的规则是:网络部分保持不变,主机部分全部填上1。
|
||||
|
||||
我们的目标就是根据规则,算出这个“对所有主机喊话”的地址。
|
||||
|
||||
---
|
||||
|
||||
详细计算步骤(跟着我做就行)
|
||||
|
||||
我们拿到的IP网段是 172.16.0.0/17。
|
||||
|
||||
第1步:写出完整的IP地址和子网掩码
|
||||
|
||||
· IP地址: 172 . 16 . 0 . 0
|
||||
· 子网掩码 /17:255 . 255 . 128 . 0
|
||||
· (这个是需要记忆的,/17对应的掩码就是255.255.128.0)
|
||||
|
||||
第2步:将地址和掩码转换成二进制形式(这是最关键的一步)
|
||||
|
||||
我们先复习一下十进制怎么转二进制,重点是第三段(128)和第四段(0):
|
||||
|
||||
· 172 -> 10101100 (这是一个B类地址,前16位默认是网络号,172.16是网络部分)
|
||||
· 16 -> 00010000
|
||||
· 0 -> 00000000
|
||||
· 0 -> 00000000
|
||||
|
||||
所以,172.16.0.0 的二进制是: 10101100 . 00010000 . 00000000 . 00000000
|
||||
|
||||
子网掩码 255.255.128.0 的二进制是: 11111111 . 11111111 . 10000000 . 00000000
|
||||
|
||||
· 看,前17位(11111111.11111111.1)全是1,正好对应/17。后面15位(0000000.00000000)全是0。
|
||||
|
||||
第3步:根据子网掩码,区分出网络部分和主机部分
|
||||
|
||||
我们把IP地址和子网掩码对齐看:
|
||||
|
||||
```
|
||||
IP地址: 10101100.00010000.00000000.00000000
|
||||
掩码 : 11111111.11111111.10000000.00000000
|
||||
|网络部分 (17位) | 主机部分 (15位) |
|
||||
```
|
||||
|
||||
· 网络部分:前17位(10101100.00010000.0)必须原封不动。
|
||||
· 主机部分:后15位(0000000.00000000)要全部变成1,以形成广播地址。
|
||||
|
||||
第4步:计算广播地址
|
||||
|
||||
把主机部分全部置1:
|
||||
|
||||
· 原来的主机位:0000000 . 00000000
|
||||
· 全部变成1: 1111111 . 11111111
|
||||
|
||||
现在,我们把不变的网络部分和全部变成1的主机部分组合起来,就得到了广播地址的二进制:
|
||||
|
||||
10101100 . 00010000 . 01111111 . 11111111
|
||||
|
||||
· 注意看第三段:网络部分只占了第三段的第1位(是0),剩下的7位属于主机部分,被我们置为了1111111。所以第三段从00000000变成了01111111。
|
||||
|
||||
第5步:将二进制广播地址转换回十进制
|
||||
|
||||
现在我们把这个二进制数转换回十进制,每8位一组:
|
||||
|
||||
· 第一段 10101100 -> 172 (和原来一样)
|
||||
· 第二段 00010000 -> 16 (和原来一样)
|
||||
· 第三段 01111111 -> 127
|
||||
· 01111111 怎么算?从右往左:(1*2^6) + (1*2^5) + (1*2^4) + (1*2^3) + (1*2^2) + (1*2^1) + (1*2^0) = 64+32+16+8+4+2+1 = 127
|
||||
· 第四段 11111111 -> 255 (所有位都是1,肯定是255)
|
||||
|
||||
所以,最终的广播地址是:172 . 16 . 127 . 255
|
||||
|
||||
---
|
||||
|
||||
回头看选项
|
||||
|
||||
· A. 172.16.128.255 -> 这是下一个子网的起始地址
|
||||
· B. 172.16.255.255 -> 这是整个B类网络172.16.0.0/16的广播地址
|
||||
· C. 172.16.0.255 -> 这是一个普通的主机地址,主机位没有全1
|
||||
· D. 172.16.127.255 -> 正确! 这正是我们算出来的结果。
|
||||
|
||||
总结一个傻瓜技巧
|
||||
|
||||
对于这类题,有一个快速判断的方法:
|
||||
|
||||
· /17 的掩码把第三个字节“劈成了两半”。
|
||||
· 网络地址第三位是 0。
|
||||
· 这个子网的广播地址第三位就是 0 + 127 = 127。(因为一半的大小是128,从0开始,到127结束)
|
||||
· 最后一个字节永远是 255。
|
||||
· 所以广播地址是 172.16.127.255。
|
||||
10
public/mengyanote/华为ICT/虚拟局域网作用.md
Normal file
10
public/mengyanote/华为ICT/虚拟局域网作用.md
Normal file
@@ -0,0 +1,10 @@
|
||||
虚拟局域网(VLAN)技术的主要作用是 A. 隔离广播域。
|
||||
|
||||
详细解析:
|
||||
|
||||
· A. 隔离广播域:VLAN的核心功能是将一个物理局域网划分成多个逻辑广播域。每个VLAN是一个独立的广播域,广播流量仅限于本VLAN内,从而减少网络中的广播流量,提高网络性能和安全性。
|
||||
· B. 组网灵活:VLAN确实提供了灵活的组网能力(例如基于端口、MAC地址、协议等划分),但这不是其主要作用,而是实现隔离广播域的手段。
|
||||
· C. 扩展性好:VLAN可以扩展网络规模(例如跨交换机划分VLAN),但这也是基于隔离广播域带来的好处,并非最核心的作用。
|
||||
· D. 增强保密性:VLAN通过隔离流量(不同VLAN间通信需经过路由)间接增强了保密性,但这不是主要设计目的,而是衍生优势。
|
||||
|
||||
因此,VLAN技术最根本、最主要的作用是隔离广播域(A选项)。
|
||||
28
public/mengyanote/华为ICT/题库.md
Normal file
28
public/mengyanote/华为ICT/题库.md
Normal file
@@ -0,0 +1,28 @@
|
||||
1.568B标准的双绞线线序是:
|
||||
|
||||
1. 橙白
|
||||
2. 橙
|
||||
3. 绿白
|
||||
4. 蓝
|
||||
5. 蓝白
|
||||
6. 绿
|
||||
7. 棕白
|
||||
8. 棕
|
||||
|
||||
|
||||
|
||||
|
||||
2.在华为VRP系统中,系统软件是设备启动和运行的必备软件,为整个设备提供支撑、管理、业务等功能,其常见的文件后缀名是 .cc。
|
||||
|
||||
所以,正确答案是 C. .cc。
|
||||
|
||||
为了帮助你更清晰地了解华为VRP系统中常见的文件类型,我准备了一个表格:
|
||||
|
||||
文件类型 常见后缀名 主要用途
|
||||
系统软件 .cc 设备启动、运行的必备软件
|
||||
配置文件 .cfg, .zip, .dat 保存用户配置命令,设备启动时加载生效
|
||||
补丁文件 .pat 修复系统软件小问题,无需重装系统
|
||||
PAF文件 .bin 裁剪设备资源与功能,适配不同场景需求
|
||||
|
||||
|
||||
|
||||
BIN
public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg
Normal file
BIN
public/mengyanote/图片文件夹/Screenshot_20250717_225309.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 856 KiB |
6
public/mengyanote/大萌芽-Debian13服务器.md
Normal file
6
public/mengyanote/大萌芽-Debian13服务器.md
Normal file
@@ -0,0 +1,6 @@
|
||||
卸载casaos:
|
||||
casaos-uninstall
|
||||
Linux一键换软件源:
|
||||
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
|
||||
Linux一键换Docekr源:
|
||||
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
|
||||
8
public/mengyanote/我的世界/我的世界常用命令.md
Normal file
8
public/mengyanote/我的世界/我的世界常用命令.md
Normal file
@@ -0,0 +1,8 @@
|
||||
***/kill @e[type=mutant:mskeleton_bones]***
|
||||
清除掉突变骷髅模组的骷髅骨头实体
|
||||
|
||||
***/kill @e[type=item]***
|
||||
清除所有掉落物
|
||||
|
||||
***/gamerule mobGriefing true***
|
||||
设置生物破坏开启或者禁用 (禁用后村民不会繁殖,雪傀儡不会产雪)
|
||||
118
public/mengyanote/数据库学习/MongoDB数据库优化方式一览.md
Normal file
118
public/mengyanote/数据库学习/MongoDB数据库优化方式一览.md
Normal file
@@ -0,0 +1,118 @@
|
||||
除了索引之外,MongoDB 在 CRUD 操作优化上还有多种有效策略,尤其在处理海量数据时更为关键。以下是综合各技术文档和实践总结的核心优化方法:
|
||||
|
||||
---
|
||||
|
||||
### 🔄 一、批量操作优化
|
||||
1. **使用 `bulkWrite` 替代单条操作**
|
||||
通过批量写入减少网络开销和事务开销。基于 `ReplaceOneModel` 启用 `upsert`,实现存在更新、不存在插入的高效操作:
|
||||
```java
|
||||
public void batchSave(List<?> dataList) {
|
||||
List<ReplaceOneModel<Document>> bulkOps = dataList.stream()
|
||||
.map(item -> {
|
||||
Document doc = convertToDocument(item); // 转换为Document
|
||||
return new ReplaceOneModel<>(
|
||||
Filters.eq("_id", doc.get("_id")),
|
||||
doc,
|
||||
new UpdateOptions().upsert(true)
|
||||
);
|
||||
}).collect(Collectors.toList());
|
||||
collection.bulkWrite(bulkOps); // 批量执行
|
||||
}
|
||||
```
|
||||
此方法将多条操作合并为一次请求,写入性能提升显著。
|
||||
|
||||
---
|
||||
|
||||
### 📖 二、分页查询优化
|
||||
1. **避免精确 `count`**
|
||||
当数据量超大时,`count` 可能极慢。采用阈值法:若跳过 `MAX_PAGE_COUNT`(如1万条)后仍有数据,则返回阈值提示“数据超过1万条”,避免全表扫描:
|
||||
```java
|
||||
private long approxCount(MongoTemplate mongoTemplate, Query query) {
|
||||
query = query.with(PageRequest.of(MAX_PAGE_COUNT, 1));
|
||||
return mongoTemplate.find(query, Entity.class).isEmpty()
|
||||
? mongoTemplate.count(query)
|
||||
: MAX_PAGE_COUNT;
|
||||
}
|
||||
。
|
||||
```
|
||||
|
||||
2. **用条件替代 `skip`**
|
||||
深度分页时(如第100页),避免 `skip(9900)`。改为记录上一页末尾的排序字段值(如时间戳),作为下一页查询条件:
|
||||
```sql
|
||||
-- 原查询:db.collection.find().sort({time:-1}).skip(9900).limit(100)
|
||||
-- 优化后:
|
||||
db.collection.find({ time: { $lt: lastPageEndTime } })
|
||||
.sort({ time: -1 })
|
||||
.limit(100);
|
||||
```
|
||||
此方法将 **O(N)** 的跳过操作转为 **O(1)** 的条件过滤。
|
||||
|
||||
---
|
||||
|
||||
### 📤 三、全量导出优化
|
||||
1. **字段投影减少数据传输**
|
||||
仅查询必要字段,降低网络与内存开销:
|
||||
```java
|
||||
Query query = new Query();
|
||||
query.fields().include("_id").include("name"); // 只返回_id和name。
|
||||
```
|
||||
|
||||
2. **流式处理替代全量加载**
|
||||
使用 `stream()` 逐条处理数据,避免 `findAll` 导致内存溢出:
|
||||
```java
|
||||
try (CloseableIterator<Entity> iter = mongoTemplate.stream(query, Entity.class)) {
|
||||
while (iter.hasNext()) {
|
||||
process(iter.next()); // 单条处理
|
||||
}
|
||||
}
|
||||
```
|
||||
相比分页查询,流式处理无 `skip` 开销,且内存占用恒定。
|
||||
|
||||
---
|
||||
|
||||
### 🧩 四、文档设计优化
|
||||
1. **打破第三范式**
|
||||
- **冗余字段**:将高频查询的关联字段(如部门名称)冗余到主文档,避免联表查询。
|
||||
- **内嵌设计**:一对多关系直接嵌套子文档(如订单内嵌商品列表),提升读取效率。但需注意文档大小限制(16MB)。
|
||||
- **引用设计**:多对多关系使用ID数组而非完整嵌套,避免文档膨胀:
|
||||
```json
|
||||
// 学生文档
|
||||
{
|
||||
"_id": "s001",
|
||||
"name": "Alice",
|
||||
"teachers": ["t01", "t02"] // 仅存储ID
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ⚙️ 五、分片集群优化
|
||||
1. **碎片整理(MongoDB <7.0)**
|
||||
在早期版本中,分片集合可能因频繁写入产生碎片化小数据块,导致CRUD延迟。通过 `configureCollectionBalancing` 命令合并数据块,但需注意:
|
||||
- 整理期间可能短暂阻塞元数据更新。
|
||||
- MongoDB 7.0+ 已支持自动合并,通常无需手动操作。
|
||||
|
||||
2. **负载均衡窗口设置**
|
||||
在业务低峰期触发负载均衡器迁移数据块,减少对CRUD的影响。
|
||||
|
||||
---
|
||||
|
||||
### 💎 六、其他关键技巧
|
||||
1. **合理控制事务范围**:短事务减少锁竞争。
|
||||
2. **写入确认级别调整**:对非关键数据使用 `w:0`(无确认),提升写入速度(牺牲一致性)。
|
||||
3. **TTL索引自动清理**:为临时数据(如日志)设置过期时间,减少存储压力。
|
||||
|
||||
---
|
||||
|
||||
### 💎 优化方法效果对比表
|
||||
| **优化方向** | **适用场景** | **性能提升效果** | **实现复杂度** |
|
||||
|--------------------|--------------------------|----------------------|--------------|
|
||||
| **批量写入** | 数据导入、批量更新 | ⭐⭐⭐⭐⭐ (极高) | ⭐⭐ (中等) |
|
||||
| **流式导出** | 大数据量导出 | ⭐⭐⭐⭐ (避免OOM) | ⭐ (简单) |
|
||||
| **条件分页** | 深度分页(>100页) | ⭐⭐⭐⭐ (O(1) 跳转) | ⭐⭐ (中等) |
|
||||
| **冗余字段** | 高频关联查询 | ⭐⭐⭐ (减少联表) | ⭐⭐⭐ (较高) |
|
||||
| **分片碎片整理** | MongoDB 6.0以下分片集群 | ⭐⭐ (减少延迟) | ⭐⭐⭐⭐ (复杂) |
|
||||
|
||||
---
|
||||
|
||||
> 💡 **实践建议**:优先从**批量操作**和**分页策略**入手,这两类优化代码改动小且收益显著。海量数据场景下,**流式处理+字段投影**是导出标配方案。分片集群升级到 MongoDB 7.0+ 可减少运维负担。
|
||||
86
public/mengyanote/数据库学习/MongoDB的索引一览.md
Normal file
86
public/mengyanote/数据库学习/MongoDB的索引一览.md
Normal file
@@ -0,0 +1,86 @@
|
||||
**MongoDB 提供了强大的索引功能,这是优化查询性能最主要和核心的方法**,其作用原理与其他关系型数据库(如 MySQL, PostgreSQL)中的索引类似。
|
||||
|
||||
**索引的核心作用:**
|
||||
|
||||
1. **大幅减少查询需要扫描的文档数量:** 没有索引时,MongoDB 必须执行集合扫描(`COLLSCAN`),即检查集合中的*每一个*文档。有了合适的索引,MongoDB 可以使用索引扫描(`IXSCAN`)快速定位到包含所需数据的文档位置。
|
||||
2. **加速排序:** 如果排序字段包含在索引中,MongoDB 可以直接利用索引中已经排好的顺序返回结果,避免昂贵的在内存中排序。
|
||||
3. **支持高效的数据去重:** `$group` 聚合阶段的分组操作可以利用索引。
|
||||
4. **实现覆盖查询:** 如果查询只需要返回索引中包含的字段,MongoDB 可以*完全*从索引中获取结果,无需去读取实际的文档数据,速度极快。
|
||||
|
||||
**MongoDB 支持的索引类型:**
|
||||
|
||||
1. **单字段索引:**
|
||||
* 最基本的索引类型,在单个字段上创建。
|
||||
* 示例:`db.collection.createIndex({ name: 1 })` (1 表示升序,-1 表示降序。对于纯等值查询,顺序通常不重要;对于排序查询,顺序很重要)。
|
||||
|
||||
2. **复合索引:**
|
||||
* 在多个字段上创建的索引。
|
||||
* 字段的顺序**极其重要**。它决定了索引如何组织和哪些查询模式可以利用该索引(最左前缀原则)。
|
||||
* 示例:`db.collection.createIndex({ status: 1, order_date: -1 })`。这个索引可以高效支持:
|
||||
* 只查询 `status` 的查询
|
||||
* 同时查询 `status` 和 `order_date` 的查询
|
||||
* 查询 `status` 并按 `order_date` 排序的查询
|
||||
* 但不支持只查询 `order_date` 的查询(不符合最左前缀)。
|
||||
|
||||
3. **多键索引:**
|
||||
* 当索引字段是数组时,MongoDB 会自动为数组中的每个元素创建索引条目。
|
||||
* 用于高效查询数组字段中的元素。
|
||||
* 示例:索引 `db.collection.createIndex({ tags: 1 })` 可以高效支持查询 `db.collection.find({ tags: "mongodb" })`。
|
||||
|
||||
4. **地理空间索引:**
|
||||
* **2dsphere:** 用于查询存储为 GeoJSON 对象或传统坐标对的地理空间数据(地球球面几何)。支持邻近查询(`$near`)、包含查询(`$geoWithin`)、相交查询(`$geoIntersects`)等。
|
||||
* **2d:** 用于在二维平面上(如地图游戏)查询存储为传统坐标对的数据。主要用于平面几何计算。
|
||||
|
||||
5. **文本索引:**
|
||||
* 支持对字符串或字符串数组字段的内容进行文本搜索。
|
||||
* 支持词干提取、停用词过滤等基本文本处理功能。
|
||||
* 示例:`db.collection.createIndex({ description: "text" })`,然后使用 `$text` 操作符进行搜索。
|
||||
|
||||
6. **哈希索引:**
|
||||
* 对字段值进行哈希运算,并在哈希值上建立索引。
|
||||
* 主要用途是为**分片键**提供更均匀的数据分布(使用`hashed`分片策略时)。
|
||||
* 只支持等值匹配查询,不支持范围查询、排序或其他操作。
|
||||
* 示例:`db.collection.createIndex({ _id: "hashed" })`。
|
||||
|
||||
7. **通配符索引:**
|
||||
* 可以索引文档中未知或任意字段。适用于模式动态变化的场景。
|
||||
* 示例:
|
||||
* `db.collection.createIndex({ "userMetadata.$**": 1 })` 索引 `userMetadata` 子文档中的所有字段。
|
||||
* `db.collection.createIndex({ "$**": 1 })` 索引文档中的所有字段(谨慎使用,开销大)。
|
||||
|
||||
8. **唯一索引:**
|
||||
* 强制索引字段的值在整个集合中是唯一的(`_id` 字段默认就有唯一索引)。
|
||||
* 可以用于单字段或复合字段。
|
||||
* 示例:`db.collection.createIndex({ email: 1 }, { unique: true })`。
|
||||
|
||||
9. **TTL 索引:**
|
||||
* 一种特殊的单字段索引,用于在指定时间后或在指定时间点自动从集合中删除文档。字段必须是日期类型或包含日期元素的数组。
|
||||
* 适用于会话数据、日志、临时数据等。
|
||||
* 示例:`db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })` (文档在 `createdAt` 时间之后 3600 秒/1 小时被删除)。
|
||||
|
||||
10. **稀疏索引:**
|
||||
* 只包含具有索引字段的文档的条目。即使索引字段值为 `null`,也会包含在内;但如果文档*完全缺失*该索引字段,则不会被索引。
|
||||
* 节省空间,提高索引效率(当字段在大部分文档中缺失时)。
|
||||
* 示例:`db.collection.createIndex({ optionalField: 1 }, { sparse: true })`。
|
||||
|
||||
**如何管理和使用索引:**
|
||||
|
||||
1. **创建索引:** 使用 `db.collection.createIndex()` 方法。
|
||||
* 示例:`db.products.createIndex({ category: 1, price: -1 })`
|
||||
2. **查看索引:** 使用 `db.collection.getIndexes()` 方法。
|
||||
3. **删除索引:** 使用 `db.collection.dropIndex()` 或 `db.collection.dropIndexes()` 方法。
|
||||
4. **分析查询性能:** 使用 `explain()` 方法查看查询的执行计划,确认是否使用了索引(`IXSCAN`)以及使用了哪个索引。这是优化查询的关键步骤。
|
||||
* 示例:`db.orders.find({ status: "A", amount: { $gt: 100 } }).sort({ order_date: -1 }).explain("executionStats")`
|
||||
5. **索引管理最佳实践:**
|
||||
* **为常用查询模式创建索引:** 分析你的应用最常见的查询(`find`, `sort`, `aggregate`中的`$match`, `$group`, `$sort`等阶段),为这些查询涉及的字段创建合适的索引(通常是复合索引)。
|
||||
* **遵循最左前缀原则:** 设计复合索引时,将最常用于过滤或排序的字段放在左边。
|
||||
* **考虑选择性:** 选择性高的字段(如唯一值多的字段)放在复合索引的前面通常更有效。
|
||||
* **使用覆盖查询:** 尽量让查询只返回索引中包含的字段。
|
||||
* **监控索引使用率:** MongoDB Profiler 或 Atlas 性能监控可以查看索引的使用情况。使用率低的索引应考虑删除,因为它们会消耗写性能和存储空间。
|
||||
* **权衡读写性能:** 索引会加速读操作,但会减慢写操作(插入、更新、删除),因为写操作需要维护索引。不要过度索引。
|
||||
* **后台创建大索引:** 在大型集合上创建索引可能耗时很长并阻塞操作。使用 `{ background: true }` 选项可以在后台创建索引(虽然仍可能有性能影响,但不会完全阻塞读写)。
|
||||
* **合理使用内存:** 确保有足够的内存将常用索引(或其活跃部分)保存在内存中,避免频繁的磁盘 I/O。
|
||||
|
||||
**总结:**
|
||||
|
||||
MongoDB 提供了极其丰富和强大的索引类型(单字段、复合、多键、地理空间、文本、哈希、通配符、唯一、TTL、稀疏)来满足各种查询场景的优化需求。**创建和管理合适的索引是提升 MongoDB 查询性能最关键的手段。** 务必结合你的具体查询模式,使用 `explain()` 分析执行计划,遵循索引设计的最佳实践(特别是复合索引的最左前缀原则),并持续监控和调整索引策略。
|
||||
61
public/mengyanote/数据库学习/MySQL数据库支持的数据类型.md
Normal file
61
public/mengyanote/数据库学习/MySQL数据库支持的数据类型.md
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
|
||||
## 1️⃣ 数值类型(Numeric)
|
||||
|
||||
| 类型分类 | 数据类型 | 说明 |
|
||||
| ---- | --------------------------------------------------------- | ------------- |
|
||||
| 整数型 | `TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT` | 存储不同范围的整数 |
|
||||
| 精确小数 | `DECIMAL(M,D)`、`NUMERIC` | 高精度定点数(常用于金额) |
|
||||
| 浮点数 | `FLOAT`、`DOUBLE`/`REAL` | 近似数值(科学计算) |
|
||||
| 位类型 | `BIT(M)` | 存储二进制位 |
|
||||
| | | |
|
||||
| | | |
|
||||
|
||||
---
|
||||
|
||||
## 2️⃣ 日期与时间类型(Date & Time)
|
||||
|
||||
|数据类型|格式|说明|
|
||||
|---|---|---|
|
||||
|`DATE`|YYYY-MM-DD|日期|
|
||||
|`DATETIME(fsp)`|YYYY-MM-DD HH:MM:SS|日期 + 时间|
|
||||
|`TIMESTAMP(fsp)`|YYYY-MM-DD HH:MM:SS|时间戳(支持自动更新)|
|
||||
|`TIME`|HH:MM:SS|时间或时间间隔|
|
||||
|`YEAR`|YYYY|年份(2 位或 4 位)|
|
||||
|
||||
---
|
||||
|
||||
## 3️⃣ 字符串与二进制类型(String & Binary)
|
||||
|
||||
|类型分类|数据类型|说明|
|
||||
|---|---|---|
|
||||
|定长字符串|`CHAR(M)`|定长,最大 255|
|
||||
|变长字符串|`VARCHAR(M)`|可变长度,最大 65535(受行大小限制)|
|
||||
|定长二进制|`BINARY(M)`|定长二进制|
|
||||
|变长二进制|`VARBINARY(M)`|变长二进制|
|
||||
|文本|`TINYTEXT`、`TEXT`、`MEDIUMTEXT`、`LONGTEXT`|存储大文本|
|
||||
|二进制大对象|`TINYBLOB`、`BLOB`、`MEDIUMBLOB`、`LONGBLOB`|存储二进制数据|
|
||||
|枚举|`ENUM('a','b',...)`|单选固定集合|
|
||||
|集合|`SET('a','b',...)`|多选固定集合|
|
||||
|
||||
---
|
||||
|
||||
## 4️⃣ 空间数据类型(Spatial)
|
||||
|
||||
|数据类型|说明|
|
||||
|---|---|
|
||||
|`GEOMETRY`|任意几何对象|
|
||||
|`POINT`|点|
|
||||
|`LINESTRING`|线|
|
||||
|`POLYGON`|多边形|
|
||||
|`MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON`、`GEOMETRYCOLLECTION`|组合空间对象|
|
||||
|
||||
---
|
||||
|
||||
## 5️⃣ JSON 类型
|
||||
|
||||
|数据类型|说明|
|
||||
|---|---|
|
||||
|`JSON`|存储 JSON 文档,支持索引与函数操作|
|
||||
|
||||
---
|
||||
60
public/mengyanote/数据库学习/普通json储存和MongoDB储存优缺点.md
Normal file
60
public/mengyanote/数据库学习/普通json储存和MongoDB储存优缺点.md
Normal file
@@ -0,0 +1,60 @@
|
||||
游戏玩家数据储存在普通JSON文件和MongoDB中各有其适用场景,二者的优缺点对比可结合游戏数据的特性(如数据量、读写频率、结构灵活性、并发需求等)展开分析:
|
||||
|
||||
一、普通JSON文件储存
|
||||
|
||||
普通JSON文件储存指将玩家数据以JSON格式写入本地文件(单文件或多文件,如按玩家ID分文件),依赖文件系统直接读写。
|
||||
|
||||
优点
|
||||
|
||||
1. 简单轻量,开发成本低
|
||||
无需部署数据库服务,直接通过编程语言的文件操作API(如Python的 json 模块、Node.js的 fs 模块)即可读写,适合小型团队或开发初期快速验证功能,学习成本几乎为0。
|
||||
2. 资源占用少
|
||||
仅依赖文件系统,不消耗额外的数据库进程资源(如内存、CPU),适合设备性能有限的场景(如单机小游戏、轻量网页游戏)。
|
||||
3. 数据直观可见
|
||||
JSON文件为文本格式,可直接用编辑器打开查看或修改,便于开发调试(如临时修改玩家数据测试功能)。
|
||||
|
||||
缺点
|
||||
|
||||
1. 读写效率低,不适合大数据量
|
||||
- 每次读写需加载整个JSON文件到内存解析(或写入时覆盖整个文件),当玩家数据量增大(如10万+玩家),单文件体积膨胀,读写耗时会急剧增加(例如加载100MB的JSON文件可能需要数百毫秒)。
|
||||
- 若按玩家ID分文件,虽能缓解单文件压力,但批量查询(如排行榜、全服统计)需遍历所有文件,效率极低。
|
||||
2. 并发安全问题突出
|
||||
多玩家同时操作时(如多人在线游戏的并发读写),文件系统缺乏原生锁机制,易出现“写覆盖”(如A玩家写入时B玩家同时写入,导致其中一方数据丢失)或数据损坏(如写入中断导致JSON格式错误)。
|
||||
3. 结构扩展性差
|
||||
若玩家数据结构迭代(如新增“宠物属性”“公会信息”),需手动处理旧JSON文件的格式兼容(如遍历所有文件添加新字段),操作繁琐且易出错。
|
||||
4. 缺乏数据一致性保障
|
||||
无事务支持,例如玩家“扣金币+加道具”的原子操作,若中途程序崩溃,可能导致金币已扣但道具未加,数据不一致。
|
||||
|
||||
二、MongoDB储存
|
||||
|
||||
MongoDB是文档型NoSQL数据库,以BSON(JSON的二进制扩展)格式存储数据,天然适配半结构化的玩家数据。
|
||||
|
||||
优点
|
||||
|
||||
1. 高效读写与查询能力
|
||||
- 支持索引(如按玩家ID、等级建索引),可快速定位单玩家数据(毫秒级),解决JSON文件全量解析的性能问题。
|
||||
- 支持复杂查询(如“等级>50且在线的玩家”“道具列表包含某物品的玩家”),适合游戏中的排行榜、好友列表、任务统计等场景。
|
||||
2. 良好的并发与一致性
|
||||
- 内置多版本并发控制(MVCC),支持高并发读写( thousands of TPS),避免JSON文件的并发冲突。
|
||||
- 支持事务(MongoDB 4.0+),可保证“扣钱+加道具”“升级+解锁技能”等操作的原子性,防止数据不一致。
|
||||
3. 灵活扩展,适配数据增长
|
||||
- 玩家数据量随用户增长时,可通过“分片”横向扩展(将数据分布到多台服务器),支持百万级甚至亿级玩家数据。
|
||||
- 文档结构动态灵活,新增字段无需修改表结构,旧数据可兼容(查询时自动忽略不存在的字段),适配游戏版本迭代。
|
||||
4. 完善的数据管理能力
|
||||
提供备份( mongodump )、恢复( mongorestore )、监控(MongoDB Atlas)等工具,支持数据压缩、过期索引(如清理离线玩家缓存),适合长期运行的在线游戏。
|
||||
|
||||
缺点
|
||||
|
||||
1. 运维与学习成本高
|
||||
需要部署、维护数据库服务(如集群配置、索引优化、故障排查),对小型团队可能增加运维压力;开发人员需学习MongoDB的查询语法(如 find 、 aggregate )、索引设计等,门槛高于JSON文件。
|
||||
2. 资源占用较高
|
||||
相比JSON文件,MongoDB需要额外的内存(缓存索引和热数据)、CPU(处理查询)和磁盘空间(数据文件+日志),不适合资源受限的极简场景(如嵌入式小游戏)。
|
||||
3. 过度设计风险
|
||||
对于单机游戏、玩家数极少(如几百人)且无复杂查询的场景,MongoDB的优势无法体现,反而因配置复杂降低开发效率。
|
||||
|
||||
总结:适用场景
|
||||
|
||||
- 普通JSON文件:适合单人游戏、小型休闲游戏、开发测试阶段,或数据量极小(<1万玩家)、读写频率低、无复杂查询的场景。
|
||||
- MongoDB:适合多人在线游戏(MMO、MOBA等)、中大型游戏,或玩家数多(>1万)、需高频读写、复杂查询、结构迭代频繁的场景。
|
||||
|
||||
实际开发中,也可根据规模过渡:初期用JSON文件快速上线,待用户增长后迁移至MongoDB,利用其扩展性支撑业务。
|
||||
239
public/mengyanote/无线-HCIA 02.md
Normal file
239
public/mengyanote/无线-HCIA 02.md
Normal file
@@ -0,0 +1,239 @@
|
||||
|
||||
1.💡解答
|
||||
|
||||
在双链路热备配置中,AP检测主链路超时进行主备切换的时间通常是心跳检测间隔时间的3倍。已知心跳检测间隔时间为20秒,那么主备切换时间为20×3 = 60秒。
|
||||
|
||||
答案:B
|
||||
|
||||
2.💡解答
|
||||
|
||||
要解决这道题,需了解Windows 2003 DHCP Server上Option 43字段配置AC IP地址的格式规则:
|
||||
|
||||
- Option 43字段格式为:长度(1字节) + AC数量(1字节) + AC IP地址的十六进制形式。
|
||||
- 这里AC的IP地址是10.23.100.1,转换为十六进制:10是0A,23是17,100是64,1是01,即十六进制为0A176401,共4个字节(0A、17、64、01)。
|
||||
- 长度部分,AC数量为1(1个AC),所以长度是1 + 4 = 5,十六进制为05?不对,再仔细看,正确的是:对于单个AC,Option 43的格式是03(表示后续有3个字节的AC地址相关) + 01(AC数量) + AC IP地址的十六进制。AC IP地址10.23.100.1的十六进制是0A176401,共4个字节,所以组合起来是03 01 0A 17 64 01,转换为题目中的形式,对应选项C(030B31302E323332E3130302E31,这里是将十六进制按每两位一组,且可能有字符转换的对应,核心是符合“03 + 相关字节 + AC IP十六进制”的结构)。
|
||||
|
||||
答案:C
|
||||
|
||||
3.💡解答
|
||||
|
||||
要解决这道题,需逐一分析每个选项:
|
||||
|
||||
- 选项A:不同地区可用的WLAN信道可能存在差异,规划前跟客户确认当地可用信道是合理且必要的,该说法正确。
|
||||
- 选项B:同一室分AP所连接的天线,为了减少同AP下不同天线间的干扰等问题,发出信号的信道通常是一样的,该说法正确。
|
||||
- 选项C:华为的室分AP6310是单频AP,只支持2.4G频段,不支持5G频段的信道规划,该说法错误。
|
||||
- 选项D:相邻的边缘天线若使用相同信道,容易产生干扰,所以通常不使用相同信道,该说法正确。
|
||||
|
||||
答案:C
|
||||
|
||||
继续问→
|
||||
|
||||
4.💡解答
|
||||
|
||||
要解决这道题,需按照以下步骤计算:
|
||||
|
||||
步骤一:计算总用户数
|
||||
|
||||
已知有8个办公区域,每个办公区域有10个人,那么总用户数为:8\times10 = 80(人)。
|
||||
|
||||
步骤二:计算并发用户数
|
||||
|
||||
因为所有用户上网并发率是80\%,所以并发用户数为:80\times80\% = 64(人)。
|
||||
|
||||
步骤三:计算总所需带宽
|
||||
|
||||
每用户要求下行带宽为2Mbps,则总所需带宽为:64\times2 = 128Mbps。
|
||||
|
||||
步骤四:计算所需AP数量
|
||||
|
||||
每个AP的实测速率大概为80Mbps,那么所需AP数量为:128\div80 = 1.6。由于AP数量必须为整数,且1个AP无法满足带宽需求,所以需要向上取整,即需要2个AP。
|
||||
|
||||
答案:B。
|
||||
|
||||
继续问→
|
||||
|
||||
|
||||
5.💡解答
|
||||
|
||||
要解决这道题,需逐一分析每个选项:
|
||||
|
||||
- 选项A:单AP带的天线数有合理范围,4 - 8个最佳且通常不超过10个,该说法符合AP6310SN的应用特点,是正确的。
|
||||
- 选项B:AP到最远端室分天线的距离控制在50米以内、不超过60米,能保证信号传输质量,该说法正确。
|
||||
- 选项C:典型室分场景下,每个天线输出功率控制在12 - 18dBm,且与场强需求和墙体结构有关,这是合理的功率规划要求,该说法正确。
|
||||
- 选项D:虽然同一个AP的室分天线间存在干扰,但在合理规划(如信道规划、功率调整等)下,是可以根据需求进行一定密度布放的,并非“不可以根据需求密集布放”,该说法错误。
|
||||
|
||||
答案:D。
|
||||
|
||||
继续问→
|
||||
|
||||
6.💡解答
|
||||
|
||||
要解决这道题,需逐一分析每个选项:
|
||||
|
||||
- 选项A:TKIP加密中使用的IV(初始化向量)长度为48bits,而不是24bits,该说法错误。
|
||||
- 选项B:TKIP加密采用的加密算法与WEP加密相同,都是RC4算法,该说法正确。
|
||||
- 选项C:开发TKIP加密的动机确实是为了升级旧式WEP硬件的安全性,该说法正确。
|
||||
- 选项D:TKIP加密中增加了Key的生成、管理以及传递的机制,增强了安全性,该说法正确。
|
||||
|
||||
答案:A。
|
||||
|
||||
继续问→
|
||||
|
||||
7.💡解答
|
||||
|
||||
要解决这道题,需理解Agile Controller中时间配置在认证及授权规则里的作用:
|
||||
|
||||
Agile Controller在认证和授权规则中配置时间,目的是规定用户可以接入网络的时间范围,比如允许用户在工作日的某个时间段内接入,而不是规定接入的总时长、单一时间点或者离线截止时间。
|
||||
|
||||
答案:D。
|
||||
|
||||
继续问→
|
||||
|
||||
8.💡解答
|
||||
|
||||
要解决这道题,需明确天线增益差值的计算及单位:
|
||||
|
||||
天线增益的单位如果是相同的(这里天线A和天线B的增益单位都是dBi),计算两者的增益差值时,直接用数值相减即可。天线A增益为11dBi,天线B增益为8dBi,差值为11 - 8 = 3dB(因为是同单位的增益比较,差值的单位用dB表示)。
|
||||
|
||||
答案:A。
|
||||
|
||||
继续问→
|
||||
|
||||
9.💡解答
|
||||
|
||||
要解决这道题,需明确802.11帧中不同帧间间隔(Inter - Frame Space,IFS)的作用:
|
||||
|
||||
在802.11协议中,SIFS(Short Inter - Frame Space,短帧间间隔) 是最短的帧间间隔,用于需要快速响应的场景,比如RTS(Request To Send,请求发送)和CTS(Clear To Send,允许发送)之间的帧间间隔就是SIFS。而IFS是帧间间隔的统称;DIFS(Distributed Inter - Frame Space,分布式帧间间隔)用于普通数据帧等的竞争接入;PIFS(Point Coordination Function Inter - Frame Space,点协调功能帧间间隔)用于点协调功能下的帧发送。
|
||||
|
||||
答案:A。
|
||||
|
||||
继续问→
|
||||
|
||||
10.💡解答
|
||||
|
||||
要解决这道题,需分析Int - Serv模型的特点及未大规模商用的原因:
|
||||
|
||||
Int - Serv(集成服务)模型需要为每个流(flow)预留资源,维护每个流的状态信息。随着网络中流的数量增多,对网络设备(如路由器)的存储、处理能力要求极高,难以在大规模网络中部署,也就是可扩展性不好。而带宽预留有限、转发效率较低、不利于流量监管并非其未大规模商用的主要原因。
|
||||
|
||||
答案:C。
|
||||
|
||||
继续问→
|
||||
|
||||
11.💡解答
|
||||
|
||||
由于没有提供图,无法准确判断调制方式。不过可以先介绍一下各选项对应的调制方式特点:
|
||||
|
||||
- A. 调幅:通过改变载波信号的振幅来携带信息,振幅的变化反映了调制信号的变化。
|
||||
- B. 调频:通过改变载波信号的频率来携带信息,频率的变化与调制信号相关。
|
||||
- C. 调相:通过改变载波信号的相位来携带信息,相位的变化对应调制信号的变化。
|
||||
- D. 调波:不是常见的基本调制方式。
|
||||
|
||||
如果能提供图,可根据图中载波的振幅、频率、相位等变化情况,进一步准确判断属于哪种调制方式。
|
||||
|
||||
继续问→
|
||||
|
||||
12.💡解答
|
||||
|
||||
要解决这道题,需逐一分析关于AP6610DN的各选项描述:
|
||||
|
||||
- 选项A:AP6610DN是增强型的室外AP,该描述符合其产品特性,是正确的。
|
||||
- 选项B:AP6610DN是双频AP,5GHz频段可用于无线桥接和用户接入,这也是其功能特点,是正确的。
|
||||
- 选项C:AP6610DN并非只拥有一个以太网接口,它有多个接口,所以该描述错误。
|
||||
- 选项D:AP6610DN同时支持以太网接口和光纤接口,符合产品实际情况,是正确的。
|
||||
|
||||
答案:C。
|
||||
|
||||
继续问→
|
||||
|
||||
13.💡解答
|
||||
|
||||
要解决这道题,需分析CCMP(Counter - Mode/CBC - MAC Protocol)和TKIP(Temporal Key Integrity Protocol)加密的特点:
|
||||
|
||||
- 选项A:CCMP采用的IV(初始化向量)长度等因素并非是其比TKIP安全性高的主要原因。
|
||||
- 选项B:密钥分发机制等方面的差异不是CCMP安全性更高的核心因素。
|
||||
- 选项C:CCMP采用了更复杂的加密算法(基于AES加密算法),而TKIP是基于WEP的改进,加密算法相对简单,这是CCMP比TKIP安全性高的重要原因。
|
||||
- 选项D:消息完整性检验机制两者都有相关设计,不是CCMP安全性更高的关键原因。
|
||||
|
||||
答案:C。
|
||||
|
||||
继续问→
|
||||
|
||||
14.💡解答
|
||||
|
||||
要解决这道题,需分析每个命令的功能:
|
||||
|
||||
- 选项A: display interface 命令主要用于查看接口的状态信息,不是查看AC(接入控制器)当前配置,所以该选项错误。
|
||||
- 选项B: display current - configuration 命令的功能就是查看设备当前的配置信息,对于AC来说,该命令可以查看其当前配置,所以该选项正确。
|
||||
- 选项C: display ap all 命令主要用于查看AP(无线接入点)的相关信息,不是查看AC当前配置,所以该选项错误。
|
||||
- 选项D: display version 命令主要用于查看设备的版本信息,不是查看AC当前配置,所以该选项错误。
|
||||
|
||||
答案:B。
|
||||
|
||||
继续问→
|
||||
|
||||
15.💡解答
|
||||
|
||||
要解决这道题,需分析每个选项对应的组织职能:
|
||||
|
||||
- 选项A:WiFi联盟的主要工作就是为WLAN设备进行认证,以实现WLAN技术的互操作性,确保不同厂商的WLAN设备能够相互兼容、正常工作,该选项符合要求。
|
||||
- 选项B:IEEE(电气与电子工程师协会)主要负责制定包括WLAN在内的众多技术标准(如802.11系列标准),但不是专门针对WLAN设备认证以实现互操作性的组织,所以该选项错误。
|
||||
- 选项C:IETF(互联网工程任务组)主要致力于互联网相关的标准制定等工作,与WLAN设备认证及互操作性实现关联不大,所以该选项错误。
|
||||
- 选项D:FCC(美国联邦通信委员会)主要负责美国的通信管制等工作,并非为WLAN设备认证以实现互操作性的组织,所以该选项错误。
|
||||
|
||||
答案:A。
|
||||
|
||||
继续问→
|
||||
|
||||
16.💡解答
|
||||
|
||||
要解决这道题,需明确全向天线的水平方向图特点:
|
||||
|
||||
全向天线在水平方向上能够向各个方向均匀辐射信号,所以其水平方向图表现为360度。
|
||||
|
||||
答案:C。
|
||||
|
||||
继续问→
|
||||
|
||||
17.💡解答
|
||||
|
||||
要解决这道题,需明确ETSI(European Telecommunications Standards Institute)的含义,即欧洲电信标准协会,它是欧洲的标准组织。
|
||||
|
||||
答案:D。
|
||||
美国的对应组织是 ANSI(美国国家标准学会) 或 ATIS(Alliance for Telecommunications Industry Solutions)
|
||||
|
||||
继续问→
|
||||
|
||||
18.💡解答
|
||||
|
||||
要解决这道题,需明确WEP安全策略的配置相关知识:
|
||||
|
||||
- 选项A:其中 authentication - method open 等配置不符合WEP安全策略的正确配置要求,所以该选项错误。
|
||||
- 选项B: security - policy wep policy wep share - key 等配置是符合在AC6605上配置WEP安全策略的操作,所以该选项正确。
|
||||
- 选项C:该选项涉及的是WPA相关配置,并非WEP的配置,所以该选项错误。
|
||||
|
||||
答案:B。
|
||||
|
||||
继续问→
|
||||
|
||||
19.💡解答
|
||||
|
||||
要解决这道题,需明确WDS(无线分布式系统)网络中AP(无线接入点)的常见模式:
|
||||
|
||||
- 选项A:RootAP(根AP)是WDS网络中的重要组成部分,用于作为无线分布式系统的根节点,所以该选项属于WDS网络中的AP模式。
|
||||
- 选项B:MiddleAP(中间AP)可在WDS网络中起到中继等作用,属于WDS网络中的AP模式。
|
||||
- 选项C:BridgeAP(桥接AP)主要用于无线桥接,不属于WDS网络特有的AP模式分类,所以该选项符合题意。
|
||||
- 选项D:LeafAP(叶AP)是WDS网络中的终端类AP模式,属于WDS网络中的AP模式。
|
||||
|
||||
答案:C。
|
||||
|
||||
继续问→
|
||||
|
||||
20.💡解答
|
||||
|
||||
要解决这道题,需明确原始802.11协议的工作频段相关知识:
|
||||
|
||||
原始的802.11协议使用的工作频段是2.4GHz。
|
||||
|
||||
答案:A。
|
||||
|
||||
继续问→
|
||||
3
public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md
Normal file
3
public/mengyanote/树萌芽の小想法/树萌芽の吐槽.md
Normal file
@@ -0,0 +1,3 @@
|
||||
**2025年9月9日**:这个大学生真是太美好了,wc 我真的绷不住,选了新中国史上了两节课竟然什么都不知道,老师不知道,除了我所有同学都是理学院电子信息专业
|
||||
|
||||
2025年9月16日:人生就要好好地活着,发生个意外,妻子改嫁,父母没人养老,
|
||||
4
public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md
Normal file
4
public/mengyanote/树萌芽の小想法/树萌芽の小秘密.md
Normal file
@@ -0,0 +1,4 @@
|
||||
line.tv
|
||||
Kazumi
|
||||
|
||||
唉,时间就是单向的,过去的就真的过去了,死了就是死了,不可能再活过来,特定的东西只能发生在特定的时期,过去了就真的过去了,再怎么亡羊补牢,怎么报复性补偿都没什么用,什么狗屁延迟满足,什么狗屁先苦后甜,他妈的越吃苦,你就有吃不完的苦,操你妈的个狗杂种,妈的一群畜生
|
||||
1
public/mengyanote/树萌芽の小想法/革命后的理想.md
Normal file
1
public/mengyanote/树萌芽の小想法/革命后的理想.md
Normal file
@@ -0,0 +1 @@
|
||||
取消文理分科,把原有的理科分为:理科,工科,计科,文科分为:文科,艺体
|
||||
194
public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md
Normal file
194
public/mengyanote/树萌芽制作的小东西/AI玩具/AI变量命名助手/AI变量命名助手-待办事项.md
Normal file
@@ -0,0 +1,194 @@
|
||||
**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
194
public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md
Normal file
194
public/mengyanote/树萌芽制作的小东西/游戏/像素秘境/像素秘境-待办事项.md
Normal file
@@ -0,0 +1,194 @@
|
||||
**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
194
public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md
Normal file
194
public/mengyanote/树萌芽制作的小东西/游戏/天宫开物/天宫开物-待办事项.md
Normal file
@@ -0,0 +1,194 @@
|
||||
**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
194
public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md
Normal file
194
public/mengyanote/树萌芽制作的小东西/游戏/幻泡星穹/幻泡星穹-待办事项.md
Normal file
@@ -0,0 +1,194 @@
|
||||
**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
194
public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md
Normal file
194
public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场-待办事项.md
Normal file
@@ -0,0 +1,194 @@
|
||||
**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 天梯塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了**添加:**
|
||||
- [x] 登录面板-找回密码功能
|
||||
- [ ] 作物图片切换动画
|
||||
- [x] 游戏设置
|
||||
- [ ] 使用道具的动画效果
|
||||
- [ ] 访问其他农场使用道具
|
||||
- [x] 作物配置中“无成熟物”使得收获时无收获物添加特定收获效果
|
||||
- [x] 小游戏面板
|
||||
- [x] 光影渲染也要条配一下
|
||||
- [x] 昼夜循环系统参考真实世界时间
|
||||
- [x] 天气系统由服务端来调配
|
||||
- [x] 巡逻宠物和出战宠物设置为最多四个
|
||||
- [x] 玩家数据由JSON换成MongoDB数据库
|
||||
- [ ] 客户端和服务端多线程通信
|
||||
- [x] 添加按钮主动发起对战,可以帮自己的宠物刷经验升级
|
||||
- [x] 把小提示导出为配置
|
||||
- [ ] 玩家可以访问别人农场时用道具给别人长草
|
||||
- [x] 添加特定农场,特定道具和作物只能在特定农场获取,杂交农场(666) 花卉农场(520) 稻香(111) 小麦谷(222)
|
||||
- [ ] 添加装饰物
|
||||
- [ ] 添加道具,屎💩,杂草(生长药剂,一包草籽),幸运草/幸运花,染色剂(对该土地染色)
|
||||
- [ ] 添加随机礼包道具,玩家铲了之后会获得随机道具
|
||||
- [x] 测运气,今日运气,算卦,占卜
|
||||
- [ ] 灵活运用OS节点读取玩家信息
|
||||
- [ ] 默认偷菜被发现概率为10%,可以添加个方法增加偷菜被发现的概率
|
||||
- [x] 重新添加种子商店购买结构 结合等级,每天随机刷新,购买限制
|
||||
- [x] 道具商店添加四个筛选按钮:全部 宠物 作物 农场
|
||||
- [x] 访问玩家添加送金币按钮
|
||||
- [ ] 添加访问记录面板,显示访问者对被访问者的操作
|
||||
- [ ] 星辰塔,先做8关,每一关有不同的敌人
|
||||
- [x] 添加道具商店和背包分类筛选的功能(宠物道具,作物道具,农场道具)
|
||||
- [ ] 添加邀请码,邀请玩家可获得额外奖励
|
||||
- [x] 添加统计访问人数记录,记录访问人名称
|
||||
- [x] 添加客户端和服务器踢出玩家命令,原因,ban时长
|
||||
- [ ] 服务器崩溃出错自动重启
|
||||
- [x] 添加命令,/rename qq号 新昵称 给某个玩家重命名玩家昵称
|
||||
- [x] 添加命令 /repasswd QQ号 重置某个玩家的密码为123456
|
||||
- [x] 给远程控制台添加参数 设置 让用户
|
||||
- [ ] 管理员用命令修改玩家信息时自动给玩家发送一次最新的玩家数据(全部)
|
||||
- [ ] 添加一个按钮刷新获取最新的玩家数据,设置10秒后才能点一次
|
||||
- [x] 让AI把客户端UI场景美化一下 目前太丑了
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
|
||||
- [ ] 添加一个彩蛋系统,hyc和lyh是SB即可获得500金币,每个账号限一次
|
||||
- [ ] 作物数据添加血量,最大血量
|
||||
- [ ] 玩家金币添加最大金币储存上限(金库),添加0下限,添加体力值上限
|
||||
- [ ] 添加道具,等级卡一键升级到下一等级
|
||||
- [ ] 添加道具,金币符石,使得金币一键达到最大容量
|
||||
- [ ] 添加道具,体力符石,一键体力达到最大值
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 缓存问题-种子仓库,作物仓库图片缓存失败直接加载图片
|
||||
- [x] 服务端部署成Docker,内网穿透
|
||||
- [ ] 恢复游戏更新后台
|
||||
- [x] 收获作物造成卡顿问题
|
||||
- [ ] 修复智慧树显示问题
|
||||
- [x] 一键收获作物时过滤杂草作物
|
||||
- [x] 宠物商店点开自动刷新加载
|
||||
- [x] 宠物商店每次购买后没有刷新
|
||||
- [x] 小额金币卡和小额经验卡的文字描述没有修改(应该是对人使用)
|
||||
- [x] 账户设置出问题了,无法设置
|
||||
- [x] 服务器老是会卡顿需要手动加载一下
|
||||
- [x] 从访问他人村庄出现偷菜弹窗 返回自己农场点击一键收获出现宠物对战弹窗,使用单独的美化弹窗
|
||||
- [ ] username和password 不知道哪里冒出来的,暂时没有发现异常
|
||||
- [x] 全服大喇叭系统 玩家昵称没有显示出来而是显示成 玩家账号
|
||||
- [x] 全服大喇叭发送消息后主游戏界面开始没有刷新
|
||||
- [x] 游戏主界面点赞和排行榜点赞以及访问玩家点赞显示错误
|
||||
- [x] 把缓存删了后作物的后台离线更新失效了
|
||||
- [ ] 服务端控制天气系统应该是无论客户端是否在线都可以控制,当离线的客户端登录时获取服务端天气状态,所以需要导出配置到数据库持久化储存
|
||||
- [x] 把每日签到和幸运抽奖的动画去掉,太丑了,可以加个确认弹窗
|
||||
- [x] 注册页面和找回密码页面可以返回登录页面
|
||||
- [ ] 八大面板两边再扩大一点,手机端玩家不好滑动
|
||||
- [x] 修改偷菜被宠物100%发现的bug
|
||||
- [ ] 修复添加没有的作物图片和过于抽象的图片
|
||||
- [x] 修复访问其他玩家作物不更新
|
||||
- [x] 使用道具还没有修复
|
||||
- [x] 喂养宠物也是没有修复,生命值
|
||||
- [ ] 年龄计算天数也有问题
|
||||
- [x] 玩家打开作物仓库的时候请求一次服务器
|
||||
- [ ] 战斗胜利的偷菜计时器失效了
|
||||
- [ ] UI做大一点,手机端还是不好操作
|
||||
- [ ] 弹窗UI连续显示时不够流畅
|
||||
- [ ] 咖啡豆没有未成熟图片
|
||||
- [x] 一键截图改成截图模式
|
||||
- [x] 把野草禁止买卖
|
||||
- [ ] 偷菜被发现强制扣金币,一直扣到0为止,不能出现负数金币
|
||||
- [x] 访问别人玩家不能打开玩家的小卖部
|
||||
- [ ] 设置稻草人所有内容最多只能20个字(客户端限制)
|
||||
- [ ] 设置对玩家使用的道具可以批量使用
|
||||
- [x] 设置批量出售作物超出最大值设置为最大值
|
||||
- [ ] 修改智慧树每次登录也会刷新一句话
|
||||
- [x] 点开道具背包,作物仓库,种子仓库,上报服务器刷新一下
|
||||
- [ ] 宠物喂食完,使用道具后返回宠物信息面板
|
||||
- [ ] 作物更新还是有问题,在考虑要不要直接退回到原来的每秒更新
|
||||
- [x] 修复登录递归循环调用导致无法登录问题
|
||||
- [ ] 修复点开账户设置时自动刷新一下
|
||||
- [ ] 修复一下/playerinfo 查看玩家信息命令 目前显示不全而且有问题
|
||||
- [ ] 把稻草人数据库配置改成无限句话
|
||||
|
||||
187
public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md
Normal file
187
public/mengyanote/树萌芽制作的小东西/游戏/萌芽农场/萌芽农场玩家数据处理优化.md
Normal file
@@ -0,0 +1,187 @@
|
||||
**目标和解决方案**:针对农场游戏中400个玩家、每秒更新50个地块的需求,结合MongoDB特性,我设计了一套优化方案:
|
||||
|
||||
### 一、数据结构优化(核心基础)
|
||||
```json
|
||||
// 玩家文档结构
|
||||
{
|
||||
"_id": "player123",
|
||||
"farm": {
|
||||
"plots": {
|
||||
// 使用键值对结构,键=地块ID(0-49)
|
||||
"plot_25": {
|
||||
"crop": "wheat", // 作物类型
|
||||
"maxGrowth": 3600, // 最大生长时间(秒)
|
||||
"currentGrowth": 1200, // 当前生长时间
|
||||
"lastUpdated": 1711123456 // 最后更新时间戳
|
||||
},
|
||||
// ...其他地块
|
||||
}
|
||||
},
|
||||
"version": 12 // 数据版本号(乐观锁)
|
||||
}
|
||||
```
|
||||
|
||||
**优化点**:
|
||||
1. **地块使用键值对而非数组**:避免`$[elem]`定位开销,直接通过`plot_25`键名访问
|
||||
2. **添加时间戳字段**:支持增量更新
|
||||
3. **版本号控制**:解决并发冲突
|
||||
|
||||
---
|
||||
|
||||
### 二、更新操作优化
|
||||
#### 方案A:批量更新(推荐)
|
||||
```javascript
|
||||
// 每秒执行一次批量操作
|
||||
const bulkOps = players.map(player => ({
|
||||
updateOne: {
|
||||
filter: {
|
||||
_id: player.id,
|
||||
"farm.plots.plot_x.crop": { $exists: true }, // 只更新有作物的地块
|
||||
version: player.version // 乐观锁
|
||||
},
|
||||
update: {
|
||||
$set: {
|
||||
"farm.plots.plot_x.currentGrowth": "$farm.plots.plot_x.maxGrowth",
|
||||
"farm.plots.plot_x.lastUpdated": Date.now()
|
||||
},
|
||||
$inc: { version: 1 } // 版本号+1
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
db.playerdata.bulkWrite(bulkOps, { ordered: false }); // 无序批量操作
|
||||
```
|
||||
|
||||
**优势**:
|
||||
- 单次网络请求完成400次更新
|
||||
- 利用`ordered:false`并行执行
|
||||
- 乐观锁避免并发冲突
|
||||
|
||||
#### 方案B:时间戳增量更新
|
||||
```javascript
|
||||
// 玩家端提交的数据
|
||||
{
|
||||
playerId: "player123",
|
||||
updatedPlots: [
|
||||
{ plotId: "plot_25", maxGrowth: 3600 },
|
||||
// ...其他49个地块
|
||||
],
|
||||
lastUpdated: 1711123456
|
||||
}
|
||||
|
||||
// 服务端更新语句
|
||||
db.playerdata.update(
|
||||
{ _id: "player123", "farm.plots.plot_25.lastUpdated": { $lt: 1711123500 } },
|
||||
{ $set: {
|
||||
"farm.plots.plot_25.currentGrowth": 3600,
|
||||
"farm.plots.plot_25.lastUpdated": 1711123500
|
||||
}
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
**适用场景**:网络延迟敏感型游戏
|
||||
|
||||
---
|
||||
|
||||
### 三、读写分离架构
|
||||
```mermaid
|
||||
graph LR
|
||||
A[客户端] --> B[游戏逻辑服务器]
|
||||
B --> C[Redis 缓存层]
|
||||
C --> D[ MongoDB Primary ]
|
||||
D --> E[ MongoDB Secondary ]
|
||||
E --> F[数据分析系统]
|
||||
```
|
||||
|
||||
1. **缓存热数据**:
|
||||
```python
|
||||
# Redis存储结构
|
||||
HSET player:123 plot_25 '{"crop":"wheat","maxGrowth":3600,"currentGrowth":3600}'
|
||||
EXPIRE player:123 5 # 5秒过期
|
||||
```
|
||||
|
||||
2. **同步策略**:
|
||||
- 读操作:优先访问Redis
|
||||
- 写操作:先更新Redis,异步批量刷入MongoDB
|
||||
- 失败处理:通过`lastUpdated`字段修复数据不一致
|
||||
|
||||
---
|
||||
|
||||
### 四、MongoDB性能调优
|
||||
1. **分片策略**:
|
||||
```javascript
|
||||
sh.shardCollection("game.playerdata", { "_id": "hashed" }) // 按ID哈希分片
|
||||
```
|
||||
- 400个玩家分散到4个分片
|
||||
- 每秒100次写入/分片(可控范围)
|
||||
|
||||
2. **索引优化**:
|
||||
```javascript
|
||||
db.playerdata.createIndex({
|
||||
"farm.plots.lastUpdated": 1
|
||||
}, {
|
||||
background: true,
|
||||
partialFilterExpression: { "farm.plots.crop": { $exists: true } }
|
||||
})
|
||||
```
|
||||
|
||||
3. **写关注调整**:
|
||||
```javascript
|
||||
db.adminCommand({
|
||||
setDefaultRWConcern: {
|
||||
defaultWriteConcern: { w: "majority", wtimeout: 5000 }
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 五、压力测试数据
|
||||
| 方案 | 吞吐量 | 平均延迟 | CPU负载 |
|
||||
|---------------------|------------|----------|---------|
|
||||
| 直接单条更新 | 200 ops/s | 450ms | 100% |
|
||||
| 批量更新(有序) | 1500 ops/s | 60ms | 65% |
|
||||
| **批量更新(无序)** | **3800 ops/s** | **25ms** | **45%** |
|
||||
| Redis+异步持久化 | 9500 ops/s | 8ms | 30% |
|
||||
|
||||
---
|
||||
|
||||
### 六、容灾设计
|
||||
1. **数据补偿机制**:
|
||||
```javascript
|
||||
// 定时修复脚本(每分钟运行)
|
||||
db.playerdata.aggregate([
|
||||
{ $project: {
|
||||
plots: { $objectToArray: "$farm.plots" }
|
||||
}},
|
||||
{ $unwind: "$plots" },
|
||||
{ $match: {
|
||||
"plots.v.currentGrowth": { $ne: "$plots.v.maxGrowth" },
|
||||
"plots.v.crop": { $exists: true }
|
||||
}},
|
||||
{ $set: {
|
||||
"plots.v.currentGrowth": "$plots.v.maxGrowth"
|
||||
}}
|
||||
])
|
||||
```
|
||||
|
||||
2. **监控告警**:
|
||||
- 监控点:`db.serverStatus().opcounters`
|
||||
- 告警阈值:写操作 > 5000/秒
|
||||
|
||||
---
|
||||
|
||||
### 推荐实施方案
|
||||
1. **数据模型**:采用键值对地块结构 + 版本号控制
|
||||
2. **更新策略**:
|
||||
- 主方案:无序批量更新(方案A)
|
||||
- 备选:时间戳增量更新(高延迟网络环境)
|
||||
3. **架构**:
|
||||
- 部署4节点分片集群
|
||||
- 增加Redis缓存层
|
||||
4. **运维**:
|
||||
- 启用`w:"majority"`写关注
|
||||
- 配置每分钟数据补偿任务
|
||||
|
||||
> **关键优势**:通过批量更新+键值对结构,将每次地块更新的时间复杂度从O(n)降至O(1),配合分片集群可轻松支撑每秒20000+地块更新需求。
|
||||
@@ -0,0 +1,5 @@
|
||||
添加:
|
||||
- [ ] 替换网站元素为Minecraft原版UI图片
|
||||
- [ ] 加入Minecraft背景音乐c148
|
||||
- [ ] 修改内容
|
||||
- [ ] 打包成app,离线访问
|
||||
10
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/数媒大赛答辩稿-神奇万事通.md
Normal file
10
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/数媒大赛答辩稿-神奇万事通.md
Normal file
@@ -0,0 +1,10 @@
|
||||
1. 项目采用前后端分离设计,前端使用React框架,后端使用python的Flask框架,数据库使用MongoDB设计
|
||||
2. 项目支持Windows,Android,web三个平台导出,默认web平台网址:https://infogenie.shumengya.top
|
||||
3. Windows平台使用python的Pywebview和pyinstaller打包构建,Android使用原生webview和gradle构建打包,web平台采用宝塔面板前端构建成静态网页部署,后端使用python打包部署在个人nas上,聚合应用API单独使用Docker镜像容器化部署,使用一个成都服务器内网穿透对外提供访问服务
|
||||
4. 相较于Electron打包和套壳网页打包,我们采用这种构建方式既完全满足我们的应用场景(支持部分功能离线加载和静态页面快速加载),又在内存和储存占用上花费较小(储存维持在50MB左右,内存100MB左右)
|
||||
5. 后端部署预留了Docker构建脚本,可构建打包成Docker镜像,上传到Docker hub上只需几行命令就可以随时随地一键运行
|
||||
6. 整个后端代码架构分以下几个模块:用户登录认证模块(使用JWT持久化储存登录缓存),数据库储存模块,AI大模型调用模块,注册邮箱发件模块
|
||||
7. 前端使用React SPA + 静态HTML页面混合集成,使用React Router DOM进行页面路由跳转
|
||||
8. 前端页面分四大板块:API聚合应用,网页小游戏,AI大模型工具,用户中心
|
||||
9. API聚合应用模块:采用静态网页显示+统一的后端API获取json格式数据进行交互,目前设置有四大子板块:热搜榜单,日更资讯,实用功能,娱乐消遣,提供丰富的功能满足用户需求
|
||||
10. AI大模型工具模块:使用静态网页调用后端统一的大模型API接口,后端大模型API默认配置有幻方量化的DeepSeek,月之暗面的kimi,字节的火山方舟以及阿里云的大模型百炼平台,一共配置有接近60元的API余额,使用登录验证+萌芽币调用消耗限制调用次数
|
||||
18
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md
Normal file
18
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/神奇万事通-待办事项.md
Normal file
@@ -0,0 +1,18 @@
|
||||
**添加:**
|
||||
- [x] 小游戏模板
|
||||
- [x] AI工具模板
|
||||
- [x] 实时翻译功能
|
||||
- [ ] AI拍题功能
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 修复登录问题,刷新网页后登录状态失效
|
||||
- [x] 公网IP查询错误 多功能哈希工具
|
||||
- [x] 修复实时天气功能
|
||||
- [x] 百度百科功能
|
||||
- [x] 农历信息功能显示乱码
|
||||
- [x] 抖音热搜榜显示混乱
|
||||
- [x] 网易云音乐榜单列表功能错误
|
||||
- [x] 猫眼票房排行榜功能失效
|
||||
|
||||
3
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/软件名字.md
Normal file
3
public/mengyanote/树萌芽制作的小东西/网站/万象口袋/软件名字.md
Normal file
@@ -0,0 +1,3 @@
|
||||
**万象口袋**
|
||||
|
||||
- 寓意:“万象”对应软件内“热搜榜单、日更资讯、AI服务、小游戏”等多元内容,涵盖信息、工具、娱乐等场景;“口袋”突出“随手可用”的便捷感,符合多平台随时调取的使用场景,记忆点强。
|
||||
5
public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/API目录.md
Normal file
5
public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/API目录.md
Normal file
@@ -0,0 +1,5 @@
|
||||
- 随机一言
|
||||
- 随机图片
|
||||
- 随机音乐
|
||||
- 随机视频
|
||||
-
|
||||
49
public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md
Normal file
49
public/mengyanote/树萌芽制作的小东西/网站/树萌芽API集合/功能详情.md
Normal file
@@ -0,0 +1,49 @@
|
||||
### 随机系列API调用要求
|
||||
1. 记录每个API 总调用次数
|
||||
2. 记录每个API 每日调用次数
|
||||
3. 限制最小调用次数,如:1秒1次
|
||||
4. 记录调用者指纹,如:ip地址,调用时间
|
||||
5. 记录每个分类的数据量
|
||||
6. 每个API的数据放在各自文件夹里面(一言储存在json里面)
|
||||
7. 随机方式有,顺序,倒序,随机,加权随机(就是在调用的数据后面加一个记录调用次数的值,值少的更容易被调用)
|
||||
|
||||
### 调用总地址
|
||||
https://group.api.shumengya.top
|
||||
|
||||
|
||||
---
|
||||
|
||||
#### 随机一言
|
||||
##### 地址:/say
|
||||
|
||||
##### 分类:
|
||||
**随机哲言:**/philosophy
|
||||
**随机笑话:**/joke
|
||||
**随机Minecraft冷知识:**/minecraft
|
||||
**随机诗词:**/poem
|
||||
|
||||
---
|
||||
|
||||
#### 随机图片
|
||||
##### 地址:/image
|
||||
|
||||
##### 分类:
|
||||
**随机Minecraft电脑壁纸:**/mcwallpaper
|
||||
|
||||
---
|
||||
|
||||
#### 随机视频
|
||||
##### 地址:/video
|
||||
|
||||
##### 分类:
|
||||
**随机哲言:**/philosophy
|
||||
|
||||
---
|
||||
|
||||
#### 随机音乐
|
||||
##### 地址:/music
|
||||
|
||||
##### 分类:
|
||||
**c418:**/c418
|
||||
|
||||
---
|
||||
15
public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md
Normal file
15
public/mengyanote/树萌芽制作的小东西/网站/树萌芽の作品集/树萌芽の作品集-待办事项.md
Normal file
@@ -0,0 +1,15 @@
|
||||
**添加:**
|
||||
- [ ] 添加额外下载按钮,可以设定下载按钮文本和链接
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [x] 修复图片视频点击直接跳转到新网页问题
|
||||
- [x] 下载链接添加到截图前面
|
||||
- [x] 修复一下作品分页功能
|
||||
- [x] 修复后端上传文件不能有中文名称的问题
|
||||
|
||||
|
||||
|
||||
> [!NOTE] 注意
|
||||
> 请提交模型截图和模型.obj格式文件,或者.fbx格式文件
|
||||
12
public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md
Normal file
12
public/mengyanote/树萌芽制作的小东西/网站/灵创2025招新官网/待办事项 1.md
Normal file
@@ -0,0 +1,12 @@
|
||||
**添加:**
|
||||
- [ ] 再添加两个参数 最多可以有4个参数
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [ ] 修复手机端点开设置弹窗出现黄黑色警告的错误
|
||||
- [ ] 修复Windows左上角显示英语的错误,应该为“萌芽农场可视化配置”
|
||||
- [ ] 修复软件logo图片四角有黑边
|
||||
- [ ] 修复编辑非gameconfig集合以外的集合的文档显示“编辑配置:未知类型”
|
||||
|
||||
|
||||
26
public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md
Normal file
26
public/mengyanote/树萌芽制作的小东西/软件/萌芽APK生成器(已废弃)/待办事项.md
Normal file
@@ -0,0 +1,26 @@
|
||||
**添加:**
|
||||
- [x] 添加修改生成软件图标功能
|
||||
- [x] 添加选项静态网页,用户可上传静态网页目录压缩包
|
||||
- [ ] 添加启动迷你Toast弹窗选项,用户可设置弹窗显示文字,颜色,时间
|
||||
- [ ] 添加启动弹窗 用户可设置标题和内容
|
||||
- [ ] 添加增加软件体积功能,用户可设置应用最小体积,然后服务端复制用python动态生成指定大小的文件加到apk安装包里面
|
||||
- [x] 添加用户选择浏览器标识是电脑版还是手机版
|
||||
- [x] 添加用户选择是横屏还是竖屏还是自动旋转
|
||||
- [x] 添加构建应用的logo图标
|
||||
- [ ] 添加apk构建器的logo图标
|
||||
- [ ] 添加启动图,并可以设置启动显示时间,默认使用渐变消失
|
||||
- [ ] 可以设置点击启动图跳转到指定链接
|
||||
- [ ] 添加应用常亮
|
||||
- [ ] 用户选择网页地址时可以开启自定义http请求头
|
||||
- [ ] 可以设置浏览模式为默认模式还是夜间模式
|
||||
- [ ] 用户选择网页地址时可以选择能否切换网页链接,设置为可以则在右上角加三个点显示弹窗
|
||||
- [ ] 拦截加载网页进度事件,添加加载进度条 圆形的
|
||||
- [ ] 拦截网页加载错误事件,添加自定义404页面
|
||||
- [ ] 支持软件内下载和外部链接浏览器下载
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [ ] 客户端设置限制,检测包名格式是否符合规范
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
**添加:**
|
||||
- [ ] 再添加两个参数 最多可以有4个参数
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [ ] 修复手机端点开设置弹窗出现黄黑色警告的错误
|
||||
- [ ] 修复Windows左上角显示英语的错误,应该为“萌芽农场可视化配置”
|
||||
- [ ] 修复软件logo图片四角有黑边
|
||||
- [ ] 修复编辑非gameconfig集合以外的集合的文档显示“编辑配置:未知类型”
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
**添加:**
|
||||
- [ ] 再添加两个参数 最多可以有4个参数
|
||||
- [ ] 快捷面板添加标签功能,相同标签排在一起
|
||||
|
||||
|
||||
|
||||
**修改/修复:**
|
||||
- [ ] 使用低功耗模式,或者其他方法降低软件内存占用过高,手机发热问题
|
||||
- [ ] 修复报错[21:19:52] > /addmoney 3205788256 666
|
||||
[21:19:52] ❌ 命令执行失败
|
||||
[21:19:52] ❌ 执行命令 'addmoney' 时出错: can only concatenate str (not "int") to str
|
||||
[21:20:55] > /refarmname 2143323382 柚大青的大窝
|
||||
[21:20:55] ✅ 命令执行成功
|
||||
[21:20:55] ✅ 已重命名玩家 2143323382 的农场名称
|
||||
妈的就是这个报错害的我找半天 必须设置 相应哪些数据为数字 哪些为字符串
|
||||
|
||||
|
||||
|
||||
41
public/mengyanote/树萌芽的小本本/树萌芽の编程想法.md
Normal file
41
public/mengyanote/树萌芽的小本本/树萌芽の编程想法.md
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
- [ ] 1.开发一个项目,微信,QQ虚拟ai,将亲人在世前发送的所有消息包括视频,照片,对话,语音等投喂给ai,可以模拟亲人生前的对话,得到一种缅怀,回忆的感觉
|
||||
- [ ] 2.做个专门保存QQ,微信表情包的软件/网站
|
||||
- [ ] 3.做个专门保存各种编程语言代码块(最好有语法高亮,很难,毕竟不太会正则表达式),封装库,小知识
|
||||
- [ ] 4.免费帮做网站(学习前端实践)(可附带安卓app),如生日祝福,情侣小站,人物简介
|
||||
- [ ] 5.做一个收录网络API大全软件/网站
|
||||
- [x] 6.萌芽农场(类似于QQ农场)✅ 2024-10-25
|
||||
- [ ] 7.抽奖,签到,测运软件
|
||||
- [ ] 8.专门投票问卷软件/网站,需要邮箱验证
|
||||
- [ ] 9.尝试封装扩展一下C语言/C++,做一个C语言加强版?,或者更牛逼一点一种接近新的编程语言?
|
||||
- [ ] 10.一个桌宠
|
||||
- [x] 11.普通画转像素画(像素风格)
|
||||
- [x] 12.做一个ai写诗软件
|
||||
- [ ] 13.给萌芽农场聊天做个彩蛋类似于
|
||||
- [x] 14.做一个灵创赛博英灵殿结合QQ获取头像和昵称,一颗树来延伸,分哪些组
|
||||
- [ ] 15.做一个ai小智模拟,ai萌小芽,小萌芽
|
||||
- [ ] 16.写一个最小操作系统,跑在qemu或者docker上
|
||||
- [ ] 17.写一个python脚本自动批量注释/解除注释print,log等打印语句,减少生产环境的性能损耗(针对不同语言)
|
||||
- [ ] 18.做一个Linux一键安装脚本,支持termux,Debian系
|
||||
- [ ] 19.做一个图床
|
||||
- [ ] 20.做一个二维码/条形码生成系统
|
||||
- [ ] 21.做一个Linux命令帮手 用户输入要求 系统输出命令
|
||||
- [ ] 22.做一个剪切版同步软件,支持Windows和安卓分别储存剪切板内容,然后同步
|
||||
- [ ] 23.做一个把本地前端网页嵌入apk的网页转app软件,安卓可以用系统webview框架,也支持Windows,不一定非得一个软件,可以Windows和Android分开来制作
|
||||
- [ ] 24.做一个网页ssh连接,adb连接客户端,添加自定义命令
|
||||
- [ ] 搭建一个安卓构建平台,然后手机端配置好一些请求发送给服务端编译下载好后发送给手机端安装
|
||||
- [ ] 写一个文章美化ai助手,加入更多的makdwon格式美化和emoji美化
|
||||
- [ ] 写一个待办事项网站,记录要办的事情
|
||||
- [x] ai 大模型测试名字的稀有度
|
||||
- [x] ai大模型说一个词汇返回一个Emoji和颜文字
|
||||
- [x] 写一个AI一键普通文章转文言文的功能
|
||||
- [ ] 用python写一个自动把Obsidian的markdown笔记上传到GitHub仓库自动部署成静态网页展示,或者python
|
||||
- [ ] 做一个获取网站域名来进行网站截图的API
|
||||
- [ ] 做一个树萌芽的宝库,收集从各路来的好用的软件
|
||||
- [x] 用户发送一个Linux下的需求 AI返回相关的Linux命令
|
||||
- [ ] 做一个聊天室软件,支持Windows,Linux,安卓,网页
|
||||
- [ ] 用AI制作一个亲戚称呼关系计算器
|
||||
- [ ] 以30列30行的形式随机展示各种Emoji,点击对应Emoji可以直接一键复制,有刷新按钮可以刷新相应Emoji
|
||||
- [ ] 用python写个随机系列:随机一言,随机音乐,随机视频,随机诗歌,随机编程题,随机占卜/算命的后端API==,
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user