Initial commit
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
5
.obsidian/app.json
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"newFileLocation": "current",
|
||||
"newLinkFormat": "relative",
|
||||
"attachmentFolderPath": "./assets"
|
||||
}
|
3
.obsidian/appearance.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"nativeMenus": true
|
||||
}
|
7
.obsidian/community-plugins.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
[
|
||||
"consistent-attachments-and-links",
|
||||
"nuke-orphans",
|
||||
"hidden-folder-obsidian",
|
||||
"update-relative-links",
|
||||
"better-export-pdf"
|
||||
]
|
30
.obsidian/core-plugins.json
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"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": false
|
||||
}
|
37
.obsidian/graph.json
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"collapse-filter": false,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": false,
|
||||
"colorGroups": [
|
||||
{
|
||||
"query": "path:KMsoftPLM ",
|
||||
"color": {
|
||||
"a": 1,
|
||||
"rgb": 14701138
|
||||
}
|
||||
},
|
||||
{
|
||||
"query": "path:SanPinPLM ",
|
||||
"color": {
|
||||
"a": 1,
|
||||
"rgb": 14725458
|
||||
}
|
||||
}
|
||||
],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.36288736930121324,
|
||||
"close": true
|
||||
}
|
29
.obsidian/hotkeys.json
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"update-relative-links:update-all-relative-links": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Alt",
|
||||
"Mod"
|
||||
],
|
||||
"key": "U"
|
||||
}
|
||||
],
|
||||
"better-export-pdf:export-current-file-to-pdf": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod",
|
||||
"Shift"
|
||||
],
|
||||
"key": "P"
|
||||
}
|
||||
],
|
||||
"nuke-orphans:nuke-orphaned": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Alt",
|
||||
"Mod"
|
||||
],
|
||||
"key": "D"
|
||||
}
|
||||
]
|
||||
}
|
29
.obsidian/plugins/better-export-pdf/data.json
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"showTitle": true,
|
||||
"maxLevel": "6",
|
||||
"displayHeader": true,
|
||||
"displayFooter": true,
|
||||
"headerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"title\"></span></div>",
|
||||
"footerTemplate": "<div style=\"width: 100vw;font-size:10px;text-align:center;\"><span class=\"pageNumber\"></span> / <span class=\"totalPages\"></span></div>",
|
||||
"printBackground": false,
|
||||
"generateTaggedPDF": false,
|
||||
"displayMetadata": false,
|
||||
"debug": false,
|
||||
"isTimestamp": false,
|
||||
"enabledCss": false,
|
||||
"prevConfig": {
|
||||
"pageSize": "A4",
|
||||
"marginType": "1",
|
||||
"showTitle": true,
|
||||
"open": true,
|
||||
"scale": 100,
|
||||
"landscape": false,
|
||||
"marginTop": "10",
|
||||
"marginBottom": "10",
|
||||
"marginLeft": "10",
|
||||
"marginRight": "10",
|
||||
"displayHeader": true,
|
||||
"displayFooter": true,
|
||||
"cssSnippet": "0"
|
||||
}
|
||||
}
|
21258
.obsidian/plugins/better-export-pdf/main.js
vendored
Normal file
11
.obsidian/plugins/better-export-pdf/manifest.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "better-export-pdf",
|
||||
"name": "Better Export PDF",
|
||||
"version": "1.10.0",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Export your notes to PDF, support export preview, add bookmarks outline and header/footer.",
|
||||
"author": "l1xnan",
|
||||
"authorUrl": "https://github.com/l1xnan",
|
||||
"fundingUrl": "https://www.buymeacoffee.com/l1xnan",
|
||||
"isDesktopOnly": true
|
||||
}
|
52
.obsidian/plugins/better-export-pdf/styles.css
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
#better-export-pdf {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: 75vh;
|
||||
}
|
||||
|
||||
#better-export-pdf .pdf-preview {
|
||||
flex: auto;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
align-content: flex-start;
|
||||
}
|
||||
|
||||
#better-export-pdf .pdf-preview .webview-wrapper {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#better-export-pdf .pdf-preview .print-size {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 8px;
|
||||
z-index: 99;
|
||||
font-size: 0.6rem;
|
||||
white-space: pre-wrap;
|
||||
text-align: right;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#better-export-pdf .pdf-preview > div {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#better-export-pdf .pdf-preview .filename {
|
||||
font-size: 0.75rem;
|
||||
color: var(--color-base-60);
|
||||
}
|
||||
#better-export-pdf .pdf-preview .filename:not(:first-child) {
|
||||
padding-top: calc(var(--p-spacing));
|
||||
}
|
||||
|
||||
#better-export-pdf webview {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
16
.obsidian/plugins/consistent-attachments-and-links/data.json
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"autoCollectAttachments": false,
|
||||
"changeNoteBacklinksAlt": false,
|
||||
"consistencyReportFile": "consistency-report.md",
|
||||
"deleteAttachmentsWithNote": true,
|
||||
"deleteEmptyFolders": true,
|
||||
"deleteExistFilesWhenMoveNote": true,
|
||||
"moveAttachmentsWithNote": true,
|
||||
"showBackupWarning": false,
|
||||
"updateLinks": true,
|
||||
"excludePaths": [
|
||||
".git/",
|
||||
".obsidian/"
|
||||
],
|
||||
"includePaths": []
|
||||
}
|
87
.obsidian/plugins/consistent-attachments-and-links/main.js
vendored
Normal file
11
.obsidian/plugins/consistent-attachments-and-links/manifest.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "consistent-attachments-and-links",
|
||||
"name": "Consistent Attachments and Links",
|
||||
"version": "3.24.1",
|
||||
"minAppVersion": "1.7.7",
|
||||
"description": "This plugin ensures the consistency of attachments and links",
|
||||
"author": "Dmitry Savosh",
|
||||
"authorUrl": "https://github.com/dy-sh/",
|
||||
"isDesktopOnly": false,
|
||||
"fundingUrl": "https://www.buymeacoffee.com/mnaoumov"
|
||||
}
|
4
.obsidian/plugins/hidden-folder-obsidian/data.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"folders": "assets",
|
||||
"enable": true
|
||||
}
|
248
.obsidian/plugins/hidden-folder-obsidian/main.js
vendored
Normal file
@ -0,0 +1,248 @@
|
||||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
|
||||
// main.ts
|
||||
var main_exports = {};
|
||||
__export(main_exports, {
|
||||
default: () => main_default
|
||||
});
|
||||
module.exports = __toCommonJS(main_exports);
|
||||
|
||||
// src/plugin.ts
|
||||
var import_obsidian2 = require("obsidian");
|
||||
|
||||
// src/lang/en.ts
|
||||
var en_default = {};
|
||||
|
||||
// src/lang/zh.ts
|
||||
var zh_default = {
|
||||
"Not Found Files List": "\u627E\u4E0D\u5230\u6587\u4EF6\u5217\u8868",
|
||||
"Hidden Folder": "\u6587\u4EF6\u9690\u85CF",
|
||||
"Restore display": "\u6062\u590D\u663E\u793A",
|
||||
"folders": "\u6587\u4EF6\u5939",
|
||||
"Folders": "\u6587\u4EF6\u5939",
|
||||
"folder": "\u6587\u4EF6\u5939",
|
||||
"Hidden display": "\u9690\u85CF\u663E\u793A",
|
||||
"Show Folders": "\u663E\u793A\u6587\u4EF6\u5939",
|
||||
"Hidden Folders": "\u9690\u85CF\u6587\u4EF6\u5939",
|
||||
"Rules": "\u89C4\u5219",
|
||||
"Regular expression": "\u6B63\u5219\u8868\u8FBE\u5F0F",
|
||||
"Example": "\u4F8B\u5B50",
|
||||
"Enable": "\u5F00\u542F",
|
||||
"Enable to hidden folder": "\u662F\u5426\u5F00\u542F\u9690\u85CF",
|
||||
"Saving": "\u4FDD\u5B58\u4E2D",
|
||||
"Settings is saved": "\u914D\u7F6E\u5DF2\u4FDD\u5B58",
|
||||
"Save": "\u4FDD\u5B58"
|
||||
};
|
||||
|
||||
// src/lang/index.ts
|
||||
var lang = {
|
||||
en: en_default,
|
||||
zh: zh_default,
|
||||
get
|
||||
};
|
||||
function get(text, args) {
|
||||
var _a;
|
||||
const language = ((_a = window.i18next) == null ? void 0 : _a.language) || "en";
|
||||
const map = lang[language] || en_default;
|
||||
let result = map[text] || en_default[text] || text;
|
||||
if (args) {
|
||||
for (let i in args) {
|
||||
result = result.replace(new RegExp(`\\{\\{${i}\\}\\}`, "g"), args[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
lang.get = get;
|
||||
var lang_default = lang;
|
||||
|
||||
// src/setting.ts
|
||||
var import_obsidian = require("obsidian");
|
||||
var HiddenFolderSettingTab = class extends import_obsidian.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
const { containerEl } = this;
|
||||
containerEl.empty();
|
||||
containerEl.createEl("h2", { text: lang_default.get("Hidden Folder") });
|
||||
const settings = {
|
||||
folders: this.plugin.settings.folders,
|
||||
enable: this.plugin.settings.enable
|
||||
};
|
||||
new import_obsidian.Setting(containerEl).setName(lang_default.get("Rules")).setDesc(lang_default.get("Regular expression")).addTextArea((text) => {
|
||||
text.inputEl.style.minWidth = "350px";
|
||||
text.inputEl.style.minHeight = "150px";
|
||||
text.setPlaceholder(lang_default.get("Example") + ":\n.*\\/?attachments\n^abc$\nuse multi lines for multi folders").setValue(this.plugin.settings.folders).onChange(async (value) => {
|
||||
settings.folders = value;
|
||||
});
|
||||
return text;
|
||||
});
|
||||
new import_obsidian.Setting(containerEl).setName(lang_default.get("Enable")).setDesc(lang_default.get("Enable to hidden folder")).addToggle((toggle) => toggle.setValue(this.plugin.settings.enable).onChange((enable) => {
|
||||
settings.enable = enable;
|
||||
}));
|
||||
new import_obsidian.Setting(containerEl).addButton((button) => button.setButtonText(lang_default.get("Save")).onClick(async () => {
|
||||
new import_obsidian.Notice(lang_default.get("Hidden Folder") + " - " + lang_default.get("Saving"));
|
||||
this.plugin.settings.folders = settings.folders;
|
||||
this.plugin.settings.enable = settings.enable;
|
||||
await this.plugin.saveSettings();
|
||||
this.plugin.restoreFolder();
|
||||
if (this.plugin.settings.enable) {
|
||||
this.plugin.hiddenFolder();
|
||||
}
|
||||
new import_obsidian.Notice(lang_default.get("Hidden Folder") + " - " + lang_default.get("Settings is saved"));
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
// src/plugin.ts
|
||||
var DEFAULT_SETTINGS = {
|
||||
folders: "",
|
||||
enable: false
|
||||
};
|
||||
var HiddenFolder = class extends import_obsidian2.Plugin {
|
||||
getFilters() {
|
||||
if (!this.settings.folders)
|
||||
return null;
|
||||
const result = [];
|
||||
const folders = this.settings.folders.split("\n");
|
||||
if (folders.length) {
|
||||
for (let i of folders) {
|
||||
result.push(new RegExp(i));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
getFolderElements() {
|
||||
const folders = document.querySelectorAll(".nav-folder");
|
||||
const result = [];
|
||||
for (let i = 0; i < folders.length; i++) {
|
||||
const el = folders[i];
|
||||
if (el.classList.contains("mod-root"))
|
||||
continue;
|
||||
result.push(el);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
restoreFolder() {
|
||||
const folders = document.querySelectorAll(".hidden-folder-flag-hidden");
|
||||
if (folders == null ? void 0 : folders.length) {
|
||||
new import_obsidian2.Notice(lang_default.get("Restore display") + "\r\n" + folders.length + " " + lang_default.get(folders.length > 1 ? "folders" : "folder"));
|
||||
for (let i = 0; i < folders.length; i++) {
|
||||
const el = folders[i];
|
||||
el.classList.remove("hidden-folder-flag-hidden");
|
||||
}
|
||||
}
|
||||
}
|
||||
hiddenFolder() {
|
||||
if (!this.settings.enable)
|
||||
return;
|
||||
const filters = this.getFilters();
|
||||
if (!(filters == null ? void 0 : filters.length))
|
||||
return;
|
||||
const elements = this.getFolderElements();
|
||||
let count = 0;
|
||||
for (let el of elements) {
|
||||
const title = el.querySelector(".nav-folder-title");
|
||||
const path = title == null ? void 0 : title.getAttribute("data-path");
|
||||
if (!path)
|
||||
continue;
|
||||
if (el.classList.contains("hidden-folder-flag-hidden"))
|
||||
continue;
|
||||
for (let filter of filters) {
|
||||
if (filter.test(path)) {
|
||||
el.classList.add("hidden-folder-flag-hidden");
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count) {
|
||||
new import_obsidian2.Notice(lang_default.get("Hidden display") + "\r\n" + count + " " + lang_default.get(count > 1 ? "folders" : "folder"));
|
||||
}
|
||||
}
|
||||
async onload() {
|
||||
await this.loadSettings();
|
||||
this.start(0);
|
||||
}
|
||||
observe() {
|
||||
if (!this.container)
|
||||
return;
|
||||
this.observer = new MutationObserver(() => {
|
||||
this.hiddenFolder();
|
||||
});
|
||||
this.observer.observe(this.container, { attributes: true, childList: true, subtree: true });
|
||||
}
|
||||
start(loop) {
|
||||
if (loop > 20) {
|
||||
new import_obsidian2.Notice(lang_default.get("Not Found Files List"));
|
||||
return;
|
||||
}
|
||||
this.container = document.querySelector(".nav-files-container");
|
||||
if (!this.container) {
|
||||
setTimeout(() => {
|
||||
this.start(loop + 1);
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
this.observe();
|
||||
this.app.workspace.on("layout-change", () => {
|
||||
const container = document.querySelector(".nav-files-container");
|
||||
if (container !== this.container) {
|
||||
this.container = container;
|
||||
this.observe();
|
||||
}
|
||||
});
|
||||
this.addSettingTab(new HiddenFolderSettingTab(this.app, this));
|
||||
this.hiddenFolder();
|
||||
setTimeout(() => {
|
||||
const el = this.addRibbonIcon("ghost", lang_default.get(this.settings.enable ? "Show Folders" : "Hidden Folders"), (evt) => {
|
||||
this.settings.enable = !this.settings.enable;
|
||||
this.saveSettings();
|
||||
el.setAttribute("aria-label", lang_default.get(this.settings.enable ? "Show Folders" : "Hidden Folders"));
|
||||
if (this.settings.enable) {
|
||||
this.hiddenFolder();
|
||||
} else {
|
||||
this.restoreFolder();
|
||||
}
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
onunload() {
|
||||
if (!this.observer)
|
||||
return;
|
||||
this.restoreFolder();
|
||||
this.observer.disconnect();
|
||||
}
|
||||
async loadSettings() {
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||||
}
|
||||
async saveSettings() {
|
||||
await this.saveData(this.settings);
|
||||
}
|
||||
};
|
||||
|
||||
// main.ts
|
||||
var main_default = HiddenFolder;
|
||||
|
||||
/* nosourcemap */
|
9
.obsidian/plugins/hidden-folder-obsidian/manifest.json
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "hidden-folder-obsidian",
|
||||
"name": "Hidden Folder",
|
||||
"version": "1.0.7",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Hidden Folder",
|
||||
"author": "ptrsvltns",
|
||||
"isDesktopOnly": true
|
||||
}
|
3
.obsidian/plugins/hidden-folder-obsidian/styles.css
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
.hidden-folder-flag-hidden {
|
||||
display: none;
|
||||
}
|
11
.obsidian/plugins/nuke-orphans/data.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"attachmentsPaths": [
|
||||
"./assets"
|
||||
],
|
||||
"trashFolderOverride": "",
|
||||
"ignorePatterns": [
|
||||
"./Files",
|
||||
".md"
|
||||
],
|
||||
"alternativeAttachmentAlg": false
|
||||
}
|
314
.obsidian/plugins/nuke-orphans/main.js
vendored
Normal file
@ -0,0 +1,314 @@
|
||||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
|
||||
var __create = Object.create;
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __getProtoOf = Object.getPrototypeOf;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
||||
var __export = (target, all) => {
|
||||
__markAsModule(target);
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __reExport = (target, module2, desc) => {
|
||||
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
||||
for (let key of __getOwnPropNames(module2))
|
||||
if (!__hasOwnProp.call(target, key) && key !== "default")
|
||||
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
||||
}
|
||||
return target;
|
||||
};
|
||||
var __toModule = (module2) => {
|
||||
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
||||
};
|
||||
var __async = (__this, __arguments, generator) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
var fulfilled = (value) => {
|
||||
try {
|
||||
step(generator.next(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var rejected = (value) => {
|
||||
try {
|
||||
step(generator.throw(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||||
step((generator = generator.apply(__this, __arguments)).next());
|
||||
});
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
__export(exports, {
|
||||
default: () => NukeOrphansPlugin
|
||||
});
|
||||
var import_obsidian3 = __toModule(require("obsidian"));
|
||||
|
||||
// src/settings.ts
|
||||
var import_obsidian = __toModule(require("obsidian"));
|
||||
var DEFAULT_SETTINGS = {
|
||||
attachmentsPaths: [],
|
||||
trashFolderOverride: "",
|
||||
ignorePatterns: [],
|
||||
alternativeAttachmentAlg: false
|
||||
};
|
||||
var CSS_CLASS_CHECK_PASS = "nuke-orphans-pass";
|
||||
var CSS_CLASS_CHECK_FAIL = "nuke-orphans-fail";
|
||||
var NukeOrphansSettingsTab = class extends import_obsidian.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
const { containerEl } = this;
|
||||
containerEl.empty();
|
||||
containerEl.createEl("h3", {
|
||||
attr: {
|
||||
"style": "text-align: center;"
|
||||
},
|
||||
text: "Nuke Orphans Plugin Settings"
|
||||
});
|
||||
new import_obsidian.Setting(containerEl).setName("Override Attachment Folder").setDesc("Where attachments are stored").addTextArea((text) => text.setPlaceholder(this.app.vault.config.attachmentFolderPath).setValue(this.plugin.settings.attachmentsPaths.join("\n")).onChange((value) => __async(this, null, function* () {
|
||||
this.plugin.settings.attachmentsPaths = value.split("\n").map((x) => x.trim()).filter((x) => x.length > 0);
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new import_obsidian.Setting(containerEl).setName("Override Trash Folder").setDesc("Trash folder path, will be created if it does not exist").addText((text) => text.setPlaceholder(this.plugin.shouldUseSystemTrash() ? "system trash" : ".trash/").setValue(this.plugin.settings.trashFolderOverride).onChange((value) => __async(this, null, function* () {
|
||||
this.plugin.settings.trashFolderOverride = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new import_obsidian.Setting(containerEl).setName("Ignore Patterns").setDesc("Add regex patterns to ignore when searching for orphans").addTextArea((text) => text.setValue(this.plugin.settings.ignorePatterns.join("\n")).onChange((value) => __async(this, null, function* () {
|
||||
this.plugin.settings.ignorePatterns = value.split("\n").map((x) => x.trim()).filter((x) => x.length > 0);
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
new import_obsidian.Setting(containerEl).setName("Test Settings").setDesc("If the path is ignored it will be red, otherwise green").addText((text) => {
|
||||
function resetColor() {
|
||||
text.inputEl.classList.remove(CSS_CLASS_CHECK_PASS, CSS_CLASS_CHECK_FAIL);
|
||||
}
|
||||
text.onChange((value) => {
|
||||
resetColor();
|
||||
if (value.length == 0)
|
||||
return;
|
||||
if (this.plugin.getIgnoreFilter().test(value))
|
||||
text.inputEl.classList.add(CSS_CLASS_CHECK_FAIL);
|
||||
else
|
||||
text.inputEl.classList.add(CSS_CLASS_CHECK_PASS);
|
||||
});
|
||||
text.inputEl.addEventListener("focusout", () => resetColor());
|
||||
text.inputEl.addEventListener("focusin", () => text.onChanged());
|
||||
});
|
||||
containerEl.createEl("h3", {
|
||||
attr: {
|
||||
style: "font-weight: bold"
|
||||
},
|
||||
text: "Advanced Settings"
|
||||
});
|
||||
new import_obsidian.Setting(containerEl).setName("Alternative Attachments Finding Algorithm").setDesc("Try enabling this if attachments are not found in subfolders").addToggle((btn) => btn.setValue(this.plugin.settings.alternativeAttachmentAlg).onChange((value) => __async(this, null, function* () {
|
||||
this.plugin.settings.alternativeAttachmentAlg = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})));
|
||||
}
|
||||
};
|
||||
|
||||
// src/trash_modal.ts
|
||||
var import_obsidian2 = __toModule(require("obsidian"));
|
||||
var path = __toModule(require("path"));
|
||||
var TrashFilesModal = class extends import_obsidian2.Modal {
|
||||
constructor(app, files, trashFolderPath, useSystemTrash) {
|
||||
super(app);
|
||||
this.files = files;
|
||||
this.trashFolderPath = trashFolderPath;
|
||||
this.useSystemTrash = useSystemTrash;
|
||||
}
|
||||
onOpen() {
|
||||
let { contentEl, titleEl } = this;
|
||||
titleEl.setText("Move " + this.files.length + " files to trash?");
|
||||
const div = contentEl.createDiv({
|
||||
cls: "trash-modal-file-links"
|
||||
});
|
||||
this.files.forEach((file) => {
|
||||
div.createEl("p", {
|
||||
cls: "trash-modal-link",
|
||||
text: file.path
|
||||
}).addEventListener("click", () => __async(this, null, function* () {
|
||||
this.close();
|
||||
yield this.app.workspace.activeLeaf.openFile(file);
|
||||
}));
|
||||
});
|
||||
contentEl.createEl("button", {
|
||||
cls: ["trash-modal-button"],
|
||||
text: "Cancel"
|
||||
}).addEventListener("click", () => this.close());
|
||||
contentEl.createEl("button", {
|
||||
cls: ["trash-modal-button"],
|
||||
text: "Copy list to clipboard"
|
||||
}).addEventListener("click", () => __async(this, null, function* () {
|
||||
yield navigator.clipboard.writeText(this.files.map((file) => file.path).join("\n"));
|
||||
new import_obsidian2.Notice("Copied list to clipboard");
|
||||
}));
|
||||
contentEl.createEl("button", {
|
||||
cls: ["mod-cta", "trash-modal-button"],
|
||||
text: "Trash"
|
||||
}).addEventListener("click", () => __async(this, null, function* () {
|
||||
if (this.trashFolderPath.length > 0) {
|
||||
if (!(yield this.app.vault.adapter.exists(this.trashFolderPath)))
|
||||
yield this.app.vault.createFolder(this.trashFolderPath);
|
||||
this.files.forEach((file) => __async(this, null, function* () {
|
||||
return yield this.app.fileManager.renameFile(file, path.join(this.trashFolderPath, file.name));
|
||||
}));
|
||||
} else
|
||||
this.files.forEach((file) => __async(this, null, function* () {
|
||||
return yield this.app.vault.trash(file, this.useSystemTrash);
|
||||
}));
|
||||
new import_obsidian2.Notice("Trashed " + this.files.length + " files");
|
||||
this.close();
|
||||
}));
|
||||
}
|
||||
onClose() {
|
||||
let { contentEl } = this;
|
||||
contentEl.empty();
|
||||
}
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var CustomFilter = class {
|
||||
constructor(regexes, strings) {
|
||||
this.regexes = new Set(regexes.map((x) => RegExp(x)));
|
||||
this.strings = new Set(strings);
|
||||
}
|
||||
test(input) {
|
||||
return Array.from(this.regexes).some((x) => x.test(input)) || Array.from(this.strings).some((x) => x === input);
|
||||
}
|
||||
};
|
||||
var NukeOrphansPlugin = class extends import_obsidian3.Plugin {
|
||||
getIgnoreFilter() {
|
||||
let strings = [];
|
||||
if (this.settings.trashFolderOverride.length > 0)
|
||||
strings.push(this.settings.trashFolderOverride);
|
||||
return new CustomFilter(this.settings.ignorePatterns, strings);
|
||||
}
|
||||
shouldUseSystemTrash() {
|
||||
switch (this.app.vault.config.trashOption) {
|
||||
case "system":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
getAttachmentsPaths() {
|
||||
if (this.settings.attachmentsPaths.length === 0)
|
||||
return [this.app.vault.config.attachmentFolderPath];
|
||||
return this.settings.attachmentsPaths;
|
||||
}
|
||||
isAttachment(file) {
|
||||
return this.getAttachmentsPaths().some((element) => {
|
||||
console.log(file.path);
|
||||
if (element.startsWith("./")) {
|
||||
if (this.settings.alternativeAttachmentAlg) {
|
||||
let path2 = file.parent;
|
||||
while (path2.name !== void 0 && path2.name.length > 0) {
|
||||
if (path2.name == element.substring(2))
|
||||
return true;
|
||||
path2 = path2.parent;
|
||||
}
|
||||
} else {
|
||||
return file.path.startsWith(element.substring(2)) || file.path.contains(element.substring(1) + "/");
|
||||
}
|
||||
} else {
|
||||
if (file.parent.path == element)
|
||||
return true;
|
||||
if (file.path.startsWith(element))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
getCanvasLinks() {
|
||||
return __async(this, null, function* () {
|
||||
let links = new Set();
|
||||
yield Promise.all(this.app.vault.getFiles().filter((f) => f.extension === "canvas").map((f) => __async(this, null, function* () {
|
||||
const content = yield this.app.vault.read(f);
|
||||
try {
|
||||
const canvas = JSON.parse(content);
|
||||
canvas.nodes.filter((node) => node.type === "file").forEach((node) => links.add(node.file));
|
||||
} catch (e) {
|
||||
console.error("Error parsing canvas file " + f.path + "\n", e);
|
||||
}
|
||||
return Promise.resolve();
|
||||
})));
|
||||
return links;
|
||||
});
|
||||
}
|
||||
getOrphans() {
|
||||
return __async(this, null, function* () {
|
||||
const links = new Set(Object.values(this.app.metadataCache.resolvedLinks).flatMap((x) => Object.keys(x)));
|
||||
const canvasLinks = yield this.getCanvasLinks();
|
||||
const filter = this.getIgnoreFilter();
|
||||
return this.app.vault.getFiles().filter((file) => {
|
||||
return ![
|
||||
links.has(file.path),
|
||||
canvasLinks.has(file.path),
|
||||
filter.test(file.path)
|
||||
].some((x) => x === true);
|
||||
});
|
||||
});
|
||||
}
|
||||
trash(files) {
|
||||
if (files.length > 0)
|
||||
new TrashFilesModal(this.app, files, this.settings.trashFolderOverride, this.shouldUseSystemTrash()).open();
|
||||
else
|
||||
new import_obsidian3.Notice("No orphaned files have been found");
|
||||
}
|
||||
onload() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.loadSettings();
|
||||
this.addCommand({
|
||||
id: "nuke-orphaned-attachments",
|
||||
name: "Trash orphaned attachments",
|
||||
callback: () => __async(this, null, function* () {
|
||||
new import_obsidian3.Notice("Gathering orphaned attachments..");
|
||||
this.trash((yield this.getOrphans()).filter((file) => this.isAttachment(file)));
|
||||
})
|
||||
});
|
||||
this.addCommand({
|
||||
id: "nuke-orphaned-notes",
|
||||
name: "Trash orphaned notes",
|
||||
callback: () => __async(this, null, function* () {
|
||||
new import_obsidian3.Notice("Gathering orphaned notes..");
|
||||
this.trash((yield this.getOrphans()).filter((file) => file.extension === "md"));
|
||||
})
|
||||
});
|
||||
this.addCommand({
|
||||
id: "nuke-orphaned",
|
||||
name: "Trash orphaned files",
|
||||
callback: () => __async(this, null, function* () {
|
||||
new import_obsidian3.Notice("Gathering orphaned files..");
|
||||
this.trash(yield this.getOrphans());
|
||||
})
|
||||
});
|
||||
this.addSettingTab(new NukeOrphansSettingsTab(this.app, this));
|
||||
});
|
||||
}
|
||||
onunload() {
|
||||
}
|
||||
loadSettings() {
|
||||
return __async(this, null, function* () {
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
||||
});
|
||||
}
|
||||
saveSettings() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.saveData(this.settings);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/* nosourcemap */
|
10
.obsidian/plugins/nuke-orphans/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "nuke-orphans",
|
||||
"name": "Nuke Orphans",
|
||||
"version": "1.2.5",
|
||||
"minAppVersion": "1.3.0",
|
||||
"description": "Plugin that trashes orphaned files and attachments",
|
||||
"author": "Sandorex",
|
||||
"authorUrl": "https://github.com/sandorex",
|
||||
"isDesktopOnly": false
|
||||
}
|
33
.obsidian/plugins/nuke-orphans/styles.css
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
.trash-modal-button {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/* this is the confirm button so it should be separated */
|
||||
.trash-modal-button:last-of-type {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.trash-modal-file-links {
|
||||
overflow-y: scroll;
|
||||
max-height: 30vw;
|
||||
margin: 1vw;
|
||||
}
|
||||
|
||||
.trash-modal-link {
|
||||
color: var(--text-accent);
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.trash-modal-link:hover {
|
||||
color: var(--text-accent-hover, var(--text-accent));
|
||||
}
|
||||
|
||||
.nuke-orphans-pass {
|
||||
color: lightgreen !important;
|
||||
}
|
||||
|
||||
.nuke-orphans-fail {
|
||||
color: red !important;
|
||||
}
|
174
.obsidian/plugins/update-relative-links/main.js
vendored
Normal file
@ -0,0 +1,174 @@
|
||||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
|
||||
// main.ts
|
||||
var main_exports = {};
|
||||
__export(main_exports, {
|
||||
default: () => UpdateRelativeLinksPlugin
|
||||
});
|
||||
module.exports = __toCommonJS(main_exports);
|
||||
var import_obsidian = require("obsidian");
|
||||
|
||||
// lib/path.ts
|
||||
var SEP = "/";
|
||||
function dirname(path) {
|
||||
return stackToPath(pathToStack(path).slice(0, -1));
|
||||
}
|
||||
function relative(from, to) {
|
||||
if (!from) {
|
||||
return to;
|
||||
}
|
||||
const fromStack = pathToStack(from);
|
||||
const toStack = pathToStack(to);
|
||||
const firstDiffIdx = fromStack.findIndex((value, idx) => value != toStack[idx]);
|
||||
const resultStack = [];
|
||||
for (let i = firstDiffIdx; i < fromStack.length - 1; i++) {
|
||||
resultStack.push("..");
|
||||
}
|
||||
for (let i = firstDiffIdx; i < toStack.length; i++) {
|
||||
resultStack.push(toStack[i]);
|
||||
}
|
||||
return stackToPath(resultStack);
|
||||
}
|
||||
function pathToStack(path) {
|
||||
return path.split(SEP);
|
||||
}
|
||||
function stackToPath(stack) {
|
||||
return stack.join(SEP);
|
||||
}
|
||||
|
||||
// main.ts
|
||||
var ConfirmModal = class extends import_obsidian.Modal {
|
||||
constructor(app, content, onConfirm) {
|
||||
super(app);
|
||||
this.content = content;
|
||||
this.onConfirm = onConfirm;
|
||||
}
|
||||
onOpen() {
|
||||
const { contentEl } = this;
|
||||
contentEl.createEl("h1", { text: "Update Releate Links Plugin" });
|
||||
contentEl.createEl("p", { text: this.content });
|
||||
new import_obsidian.Setting(contentEl).addButton((btn) => btn.setButtonText("Yes").setCta().onClick(() => {
|
||||
this.close();
|
||||
this.onConfirm();
|
||||
})).addButton((btn) => btn.setButtonText("No").onClick(() => {
|
||||
this.close();
|
||||
}));
|
||||
}
|
||||
onClose() {
|
||||
this.contentEl.empty();
|
||||
}
|
||||
};
|
||||
var UpdateRelativeLinksPlugin = class extends import_obsidian.Plugin {
|
||||
async onload() {
|
||||
const { app } = this;
|
||||
const { metadataCache, vault } = app;
|
||||
const message = "This command will modify all links in the entire vault (not just the current file) to relative paths, and this action cannot be undone. It is recommended that you back up the vault in advance. Please confirm whether you want to execute the command.";
|
||||
this.addCommand({
|
||||
id: "update-all-relative-links",
|
||||
name: "Update all relative links",
|
||||
callback() {
|
||||
new ConfirmModal(app, message, () => {
|
||||
const promises = vault.getMarkdownFiles().map((file) => replace(file, false));
|
||||
Promise.all(promises).then((linkCounts) => {
|
||||
const updatedLinkCounts = linkCounts.filter((count) => count > 0);
|
||||
const linkCount = updatedLinkCounts.reduce((sum, count) => sum + count, 0);
|
||||
const fileCount = updatedLinkCounts.length;
|
||||
new import_obsidian.Notice(`Update ${linkCount} links in ${fileCount} file${fileCount > 1 ? "s" : ""}.`);
|
||||
}).catch((err) => {
|
||||
new import_obsidian.Notice("Update links error, see console.");
|
||||
console.error(err);
|
||||
});
|
||||
}).open();
|
||||
}
|
||||
});
|
||||
this.registerEvent(vault.on("rename", (file, oldPath) => {
|
||||
var _a;
|
||||
if (!oldPath || !file.path.toLocaleLowerCase().endsWith(".md") || ((_a = file.parent) == null ? void 0 : _a.path) === dirname(oldPath)) {
|
||||
return;
|
||||
}
|
||||
if (file instanceof import_obsidian.TFile) {
|
||||
setTimeout(() => replace(file, true), 100);
|
||||
}
|
||||
}));
|
||||
async function replace(file, notice) {
|
||||
var _a, _b;
|
||||
const metadata = metadataCache.getFileCache(file);
|
||||
const links = [...(_a = metadata == null ? void 0 : metadata.links) != null ? _a : [], ...(_b = metadata == null ? void 0 : metadata.embeds) != null ? _b : []];
|
||||
const replacePairs = links.map(({ link, original }) => {
|
||||
var _a2;
|
||||
const linkPath = link.replace(/#.*$/, "");
|
||||
if (!linkPath) {
|
||||
return null;
|
||||
}
|
||||
const linkFile = metadataCache.getFirstLinkpathDest(linkPath, file.path);
|
||||
if (!linkFile) {
|
||||
return null;
|
||||
}
|
||||
const newLinkPath = ((_a2 = file.parent) == null ? void 0 : _a2.path) === "/" ? linkFile.path : relative(file.path, linkFile.path);
|
||||
if (linkPath === newLinkPath) {
|
||||
return null;
|
||||
}
|
||||
const newOriginal = replaceOriginal(original, linkPath, newLinkPath);
|
||||
return [original, newOriginal];
|
||||
}).filter((pair) => pair);
|
||||
if (!(replacePairs == null ? void 0 : replacePairs.length)) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
const content = await vault.read(file);
|
||||
const replacedContent = replacePairs.reduce((tmpContent, pair) => {
|
||||
return (pair == null ? void 0 : pair.length) === 2 ? tmpContent.replace(pair[0], pair[1]) : tmpContent;
|
||||
}, content);
|
||||
await vault.modify(file, replacedContent);
|
||||
const msg = `Update ${replacePairs.length} links in ${file.path}.`;
|
||||
console.log(msg);
|
||||
if (notice) {
|
||||
new import_obsidian.Notice(msg);
|
||||
}
|
||||
return replacePairs.length;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
if (notice) {
|
||||
new import_obsidian.Notice("Update links error, see console.");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
function replaceOriginal(original, link, newLink) {
|
||||
let newOriginal = replaceWithFormat(original, link, newLink, (s) => s.replace(/ /g, "%20"));
|
||||
if (original === newOriginal) {
|
||||
newOriginal = replaceWithFormat(original, link, newLink, encodeURI);
|
||||
}
|
||||
if (original === newOriginal) {
|
||||
newOriginal = original.replace(/^(!?\[.*?\]).*$/, `$1(${encodeURI(newLink)})`);
|
||||
}
|
||||
return newOriginal;
|
||||
}
|
||||
function replaceWithFormat(str, from, to, format) {
|
||||
return str.replace(format(from), format(to));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* nosourcemap */
|
10
.obsidian/plugins/update-relative-links/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "update-relative-links",
|
||||
"name": "Update Relative Links",
|
||||
"version": "2.1.3",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Update relative links.",
|
||||
"author": "val",
|
||||
"authorUrl": "https://github.com/val3344/obsidian-update-relative-links",
|
||||
"isDesktopOnly": false
|
||||
}
|
206
.obsidian/workspace.json
vendored
Normal file
@ -0,0 +1,206 @@
|
||||
{
|
||||
"main": {
|
||||
"id": "ed000e1fdec3c650",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "afcdd2b616c0b37b",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "00d05d2d77d31c72",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "SanPinPLM/相关操作/1.EDM/32.浩辰CAD图纸模板制作.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "32.浩辰CAD图纸模板制作"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "42a5659eda9f7074",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "d59f9737238cec0c",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "262fdb4633fcf55d",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "文件列表"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "f065ac0941d6809e",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "7z",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "搜索"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "3c60fa22a0a5ddcc",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "书签"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "aff87e682ff58493",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "image",
|
||||
"state": {
|
||||
"file": "SanPinPLM/相关操作/1.EDM/assets/Pasted image 20250111204927.png"
|
||||
},
|
||||
"icon": "lucide-image",
|
||||
"title": "Pasted image 20250111204927"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 200
|
||||
},
|
||||
"right": {
|
||||
"id": "65248f9a3962ae93",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "3c0e70d05e58edb1",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "07b0a90e46430bb4",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "SanPinPLM/相关操作/1.EDM/32.浩辰CAD图纸模板制作.md"
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "32.浩辰CAD图纸模板制作 的大纲"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "e2f7484da718654a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "标签"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "8c0ffde16d40f63b",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "SanPinPLM/相关操作/3.PLM/22.任务类权限详解.md",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "22.任务类权限详解 的反向链接列表"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "e89425d59bc3b161",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "SanPinPLM/相关操作/3.PLM/22.任务类权限详解.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "22.任务类权限详解 的出链列表"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 200
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:打开快速切换": true,
|
||||
"graph:查看关系图谱": false,
|
||||
"canvas:新建白板": false,
|
||||
"daily-notes:打开/创建今天的日记": true,
|
||||
"templates:插入模板": false,
|
||||
"command-palette:打开命令面板": false,
|
||||
"hidden-folder-obsidian:显示文件夹": false
|
||||
}
|
||||
},
|
||||
"active": "00d05d2d77d31c72",
|
||||
"lastOpenFiles": [
|
||||
"SanPinPLM/相关操作/1.EDM/31.浩辰CAD机械版图纸模板制作.md",
|
||||
"SanPinPLM/相关操作/1.EDM/28.AutoCAD图纸模板制作.md",
|
||||
"SanPinPLM/相关操作/1.EDM/29.中望CAD图纸模板制作.md",
|
||||
"SanPinPLM/相关操作/1.EDM/185.流程分支设置.md",
|
||||
"SanPinPLM/相关操作/3.PLM/22.任务类权限详解.md",
|
||||
"SanPinPLM/相关操作/3.PLM/21.项目类权限详解.md",
|
||||
"SanPinPLM/相关操作/3.PLM/20.项目角色.md",
|
||||
"SanPinPLM/相关操作/4.other/15.自定义控件页面.md",
|
||||
"KMsoftPLM/二开记录/工装台账汇总.md",
|
||||
"SanPinPLM/相关操作/1.EDM/assets/Pasted image 20250111204927.png",
|
||||
"SanPinPLM/相关操作/2.PDM/15.浩辰CAD机械版接口安装.md",
|
||||
"SanPinPLM/相关操作/2.PDM/10.AutoCAD接口安装.md",
|
||||
"未命名.canvas",
|
||||
"AutoCAD/Files/CAD模板.7z",
|
||||
"AutoCAD/Files",
|
||||
"AutoCAD/新建文件夹",
|
||||
"AutoCAD/2.显示菜单栏.md",
|
||||
"AutoCAD/1.基础操作.md",
|
||||
"Obsidian/插件/Obsidian孤立文件管理插件Nuke Orphans.md",
|
||||
"Obsidian/插件/Obsidian看板任务管理插件CardBoard.md",
|
||||
"Obsidian/插件/Obsidian任务管理插件Tasks.md",
|
||||
"Obsidian/插件/Obsidian隐藏文件或文件夹插件Hidden Folder.md",
|
||||
"Obsidian/插件/Obsidian自动更新相对路径插件Update Relative Links.md",
|
||||
"Obsidian/插件/Obsidian附件管理插件Consistent Attachments and Links.md",
|
||||
"Obsidian/插件/Obsidian附件管理插件Attachment Management(不推荐).md",
|
||||
"VMWare/主机连虚拟机端口.md"
|
||||
]
|
||||
}
|
BIN
.trash/Pasted image 20250111204927.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
.trash/image-20250110104338550.png
Normal file
After Width: | Height: | Size: 195 KiB |
BIN
.trash/image-20250110105515575.png
Normal file
After Width: | Height: | Size: 189 KiB |
1
.trash/未命名.canvas
Normal file
@ -0,0 +1 @@
|
||||
{}
|
13
KMsoftPLM/二开/Oracle口令过期.md
Normal file
@ -0,0 +1,13 @@
|
||||
打开SQL Plus窗口,登录SYSTEM账户,密码是123
|
||||
|
||||
输入如下命令即可
|
||||
|
||||
```sql
|
||||
ALTER USER KKCS_PDM IDENTIFIED BY 123;
|
||||
ALTER USER KKCS_METADATA IDENTIFIED BY 123;
|
||||
ALTER USER KKCS_ORG IDENTIFIED BY 123;
|
||||
ALTER USER KKCS_TASK IDENTIFIED BY 123;
|
||||
ALTER USER KKCS_FILE IDENTIFIED BY 123;
|
||||
ALTER USER n_api IDENTIFIED BY 123;
|
||||
ALTER USER esb IDENTIFIED BY 123;
|
||||
```
|
BIN
KMsoftPLM/二开/assets/Pasted image 20241015094917.png
Normal file
After Width: | Height: | Size: 388 KiB |
BIN
KMsoftPLM/二开/assets/Pasted image 20241015095125.png
Normal file
After Width: | Height: | Size: 477 KiB |
BIN
KMsoftPLM/二开/assets/Pasted image 20241015095331.png
Normal file
After Width: | Height: | Size: 313 KiB |
BIN
KMsoftPLM/二开/assets/Pasted image 20241017145418.png
Normal file
After Width: | Height: | Size: 428 KiB |
BIN
KMsoftPLM/二开/assets/Pasted image 20241017145642.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
KMsoftPLM/二开/assets/Pasted image 20241017145732.png
Normal file
After Width: | Height: | Size: 409 KiB |
13
KMsoftPLM/二开/定版.md
Normal file
@ -0,0 +1,13 @@
|
||||
对象定版其实就是冻结,冻结需要先开放菜单,在 ==**系统定制 → 菜单定义 → 对象操作配置 → 选择对象 → 添加菜单项**==
|
||||
|
||||

|
||||
|
||||
在 **执行功能** 中选择 **冻结**
|
||||
|
||||
选择 **单选显示**
|
||||
|
||||

|
||||
|
||||
最后 **保存** 即可
|
||||
|
||||

|
13
KMsoftPLM/二开/对象建立关联关系.md
Normal file
@ -0,0 +1,13 @@
|
||||
在元数据中创建好对象类并绑定了关联关系后,可以在系统中创建对象
|
||||
|
||||
对象创建后双击打开,可以在 **关系** 中找到该对象所具备的“关联关系”(这里只是有这样的关联关系,不一定有实际的关联对象)
|
||||
|
||||

|
||||
|
||||
如果已经有了要关联的对象,可以通过 **添加被关联关系对象** 按钮添加关联对象
|
||||
|
||||

|
||||
|
||||
也可以直接创建关联对象,点击 **创建被关联关系对象** 即可
|
||||
|
||||

|
1
KMsoftPLM/二开/导航条功能配置.md
Normal file
@ -0,0 +1 @@
|
||||
为系统新增菜单功能,需要先上传脚本,在 **系统定制** → **二次开发脚本管理** 中添加脚本,然后在 **系统定制** → **系统功能扩展** → **导航条功能扩展** 中添加这个功能,最后在 **系统定制** → **菜单定义** → **导航条功能配置** 中添加菜单选项,并选择这个功能
|
0
KMsoftPLM/二开记录/工装台账汇总.md
Normal file
BIN
KMsoftPLM/报错处理/assets/7daf79ffcc3aeb788ada4e9830765d4.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
KMsoftPLM/报错处理/assets/image-20240418171947361.png
Normal file
After Width: | Height: | Size: 32 KiB |
15
KMsoftPLM/报错处理/上传文件失败.md
Normal file
@ -0,0 +1,15 @@
|
||||
# 问题
|
||||
|
||||
点击上传文件,提示文件服务没有启动
|
||||
|
||||

|
||||
|
||||
# 解决方法
|
||||
|
||||
这是因为没有做好配置设置
|
||||
|
||||
在KM CLoud目录下找到**run/config**目录,**打开wpFileConfig.ini文件,修改主服务地址**,并**将IsMaster配置为TRUE**
|
||||
|
||||

|
||||
|
||||
这样就可以正常上传文件了
|
BIN
KMsoftPLM/数据库/assets/image-20240418105717807.png
Normal file
After Width: | Height: | Size: 289 KiB |
13
KMsoftPLM/数据库/用户表.md
Normal file
@ -0,0 +1,13 @@
|
||||
# 用户表
|
||||
|
||||
在**KONGKU_ORG**(或叫**KM_ORG**)表空间中找到**PLM_USER**表
|
||||
|
||||

|
||||
|
||||
这个表中有两个字段共同管控着账号是否启用或锁定,即**CSTATE**字段与**CLOCKED**字段
|
||||
|
||||
输入错误密码过多导致账号锁定,其CLOCKED字段值为1,将CLOCKED字段值改为0即可解锁
|
||||
|
||||
新建账号的CSTATE字段值为2,停用账号的CSTATE字段值为0,将其修改为1即可启用
|
||||
|
||||
对于用户账户而言,启用账号会将CSTATE的值修改为1,将CLOCKED的值修改为0。在通常情况下,不会对CLOCKED的值进行修改
|
BIN
KMsoftPLM/相关操作/assets/IMG-20240418160639945.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
KMsoftPLM/相关操作/assets/IMG-20240418160640068.png
Normal file
After Width: | Height: | Size: 2.0 MiB |
BIN
KMsoftPLM/相关操作/assets/Pasted image 20241126140033.png
Normal file
After Width: | Height: | Size: 113 KiB |
BIN
KMsoftPLM/相关操作/assets/Pasted image 20241126140121.png
Normal file
After Width: | Height: | Size: 230 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240418095232508.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240418095450071.png
Normal file
After Width: | Height: | Size: 224 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240418103556852.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240418105717807.png
Normal file
After Width: | Height: | Size: 289 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240418110908370.png
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20240423111553324.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
KMsoftPLM/相关操作/assets/image-20241126140641125.png
Normal file
After Width: | Height: | Size: 99 KiB |
45
KMsoftPLM/相关操作/二开功能配置.md
Normal file
@ -0,0 +1,45 @@
|
||||
# 介绍
|
||||
|
||||
二开功能配置,即在系统中添加 [二次开发功能](../系统介绍/系统定制/二次开发脚本管理.md),并将其添加到 [对象类功能扩展](../系统介绍/系统定制/对象类功能扩展.md) 或 [系统功能扩展](../系统介绍/系统定制/系统功能扩展.md) 上,再通过 [菜单定义](../系统介绍/系统定制/菜单定义.md) 将功能添加到菜单栏中,通过 [功能授权](../系统介绍/安全管理/功能授权.md) 将权限开放给用户
|
||||
|
||||
# 说明
|
||||
|
||||
## 二次开发功能的权限项
|
||||
|
||||
**二次开发功能** 指定的权限项,与 **功能授权** 要授予用户的权限项是一样的。权限项的作用与 [菜单定义功能授权](../系统介绍/安全管理/功能授权.md) 的作用相似,设置二开功能A的权限与选定的功能权限B的授权分配保持一致,即只有具备功能B的操作权限,才能操作二开功能A
|
||||
|
||||
>案例:设置 **二开功能——测试对象功能扩展** 的权限项为 **事件日志**
|
||||
>
|
||||
>
|
||||
>
|
||||
>而在 [功能授权](../系统介绍/安全管理/功能授权.md) 中不给 “彦页” [日志管理](../系统介绍/安全管理/功能授权.md#日志管理) 的 **事件日志** 权限
|
||||
>
|
||||
>
|
||||
>
|
||||
>那么在具备此二开功能的对象中,“彦页” **不可执行** 测试对象功能扩展操作
|
||||
>
|
||||
>
|
||||
>
|
||||
>若在 [功能授权](../系统介绍/安全管理/功能授权.md) 中给予 “彦页” [日志管理](../系统介绍/安全管理/功能授权.md#日志管理) 的 **事件日志** 权限
|
||||
>
|
||||
>
|
||||
>
|
||||
>那么在具备此二开功能的对象中,“彦页” **可执行** 测试对象功能扩展操作
|
||||
>
|
||||
>
|
||||
|
||||
## 菜单定义添加二开功能
|
||||
|
||||
将二开功能添加到 [对象类功能扩展](../系统介绍/系统定制/对象类功能扩展.md) 或 [系统功能扩展](../系统介绍/系统定制/系统功能扩展.md) 上后,这项功能还没有添加到菜单栏中(事件类的功能不需要添加菜单)
|
||||
|
||||
需要通过 [菜单定义](../系统介绍/系统定制/菜单定义.md) 将二开功能添加进去
|
||||
|
||||

|
||||
|
||||
## 功能授权
|
||||
|
||||
将二开功能添加到菜单中后,还需要进行授权操作(如果用户本身就具备相应的权限项,则可以忽略这一步)
|
||||
|
||||
[二次开发功能的权限项](#二次开发功能的权限项) 是什么,就要在 [功能授权](../系统介绍/安全管理/功能授权.md) 中的 [应用级授权](../系统介绍/安全管理/功能授权.md#应用级可授予权限列表) 中给予用户什么权限
|
||||
|
||||

|
26
KMsoftPLM/相关操作/开目Cloud启动.md
Normal file
@ -0,0 +1,26 @@
|
||||
KMCloud的启动需要先确保Oracle服务已经启动,使用**Win+Q**快捷键搜索“服务”
|
||||
|
||||
将其打开后找到“**OracleServerORCL**”服务,确保其已经启动,状态一栏中显示“正在运行”
|
||||
|
||||

|
||||
|
||||
在KMCloud安装目录下找到run目录,打开run目录在其中找到“**run.bat**”文件,双击执行,如果显示多条某某java进程正在执行,即启动成功
|
||||
|
||||
再打开Tomcat安装目录,找到bin目录下的**startup.bat**文件,双击将其启动
|
||||
|
||||
等待片刻后打开浏览器,在浏览器地址栏中输入:**localhost:8080/kmsoft**
|
||||
|
||||
成功进入到登录页面:
|
||||
|
||||

|
||||
|
||||
常用登录账号有:
|
||||
|
||||
| 意义 | 账号 | 密码 |
|
||||
| ----- | ---------- | --- |
|
||||
| 超级管理员 | superadmin | 123 |
|
||||
| 测试管理员 | testadmin | 123 |
|
||||
| 安全管理员 | security | 123 |
|
||||
| 数据管理员 | dataadmin | 123 |
|
||||
| 系统管理员 | system | 123 |
|
||||
|
7
KMsoftPLM/相关操作/数据导入.md
Normal file
@ -0,0 +1,7 @@
|
||||
# 介绍
|
||||
|
||||
数据导入需要在 [零部件与BOM导入](../系统介绍/数据导入/零部件与BOM导入.md) 页面中进行操作
|
||||
|
||||
## 前置要求
|
||||
|
||||
需要在“系统定制”模块中找到 [系统配置](../系统介绍/系统定制/系统配置.md),在“配置工具”菜单中找到“文档管理”选项,对“通用配置”→“文档类型配置”中进行配置
|
35
KMsoftPLM/相关操作/用户设置.md
Normal file
@ -0,0 +1,35 @@
|
||||
# 前置要求
|
||||
|
||||
开目Cloud中创建用户只能由系统三员进行操作,需要 [系统三员](../系统介绍/用户/系统三员.md) 具备 [系统管理](../系统介绍/安全管理/三员授权.md#系统管理) 模块中的 [组织管理](../系统介绍/系统管理/组织管理.md) 功能权限
|
||||
|
||||
# 用户设置
|
||||
|
||||
## 介绍
|
||||
|
||||
在 **系统管理** → **组织管理** 中对部门、用户、职务进行设置,如图所示为组织管理页面
|
||||
|
||||

|
||||
|
||||
## 新建部门
|
||||
|
||||
在此页面中左侧是部门列表,点击新建部门按钮后,只需要在弹窗中输入部门的名称即可创建新的部门
|
||||
|
||||

|
||||
|
||||
## 新建用户
|
||||
|
||||
选择部门后,打开 **用户** 页签,点击 **新建用户** 按钮后,在弹窗中填写新用户的账号信息即可完成账号创建
|
||||
|
||||

|
||||
|
||||
### 账号启用
|
||||
|
||||
在系统中 [新建用户](#新建用户) 后,还不能直接用新建的账号进行登录,必须完成 [账号启用](账号启用.md),才能登录
|
||||
|
||||
在 **安全管理** → [用户安全设置](../系统介绍/安全管理/用户安全设置.md) 中该用户所属的部门,勾选该用户后,点击 [启用账号](../系统介绍/安全管理/用户安全设置.md#启用账号) 按钮即可
|
||||
|
||||

|
||||
|
||||
### 默认密码
|
||||
|
||||
所有用户账号在新建并启用后,其密码都是预设好的默认密码,若不知道,可以使用 **系统三员** 的账号打开 **安全管理** → [安全选项](../系统介绍/安全管理/安全选项.md) → [设置默认密码](../系统介绍/安全管理/安全选项.md#设置默认密码) 查看
|
91
KMsoftPLM/相关操作/账号启用.md
Normal file
@ -0,0 +1,91 @@
|
||||
# 用户账户启用
|
||||
|
||||
在开目PLM系统中,有如下几种方式用户无法进行登录
|
||||
|
||||
| 情况 | 提醒 |
|
||||
| -------------------------------------- | -------------------------------- |
|
||||
| 新建用户账户尚未被启用 | 账号为新建账号,请联系管理员启用 |
|
||||
| 用户输入密码达到特定次数后,账号被锁定 | 账号被锁定,请联系管理员启用 |
|
||||
| 用户账户在“用户安全设置”中被停用 | 账号已停用 |
|
||||
|
||||
## 启用账户方式一
|
||||
|
||||
前两种情况登录会提示账号需要联系管理员启用
|
||||
|
||||

|
||||
|
||||
第三种情况会提示账号已停用
|
||||
|
||||

|
||||
|
||||
若是用户账户未启用,则需要在“**安全管理**”模块中的 [用户安全设置](../系统介绍/安全管理/用户安全设置.md) 页面找到该用户所属的部门,勾选该用户后,点击 [启用账号](../系统介绍/安全管理/用户安全设置.md#启用账号) 按钮
|
||||
|
||||

|
||||
|
||||
启用后,该账户即可完成登录
|
||||
|
||||
若账户是被锁定状态,则需要点击“解锁用户”按钮,对用户账户进行解锁
|
||||
|
||||

|
||||
|
||||
## 启用账户方式二
|
||||
|
||||
除了通过系统提供的功能对用户账户进行启用外,还可以直接对数据库中的数据表字段直接进行修改
|
||||
|
||||
在**KONGKU_ORG**(或叫**KM_ORG**)表空间中找到**PLM_USER**表([用户表](../数据库/用户表.md))
|
||||
|
||||

|
||||
|
||||
这个表中有两个字段共同管控着账号是否启用或锁定,即**CSTATE**字段与**CLOCKED**字段
|
||||
|
||||
输入错误密码过多导致账号锁定,其CLOCKED字段值为1,将CLOCKED字段值改为0即可解锁
|
||||
|
||||
新建账号的CSTATE字段值为2,停用账号的CSTATE字段值为0,将其修改为1即可启用
|
||||
|
||||
对于用户账户而言,启用账号会将CSTATE的值修改为1,将CLOCKED的值修改为0。在通常情况下,不会对CLOCKED的值进行修改
|
||||
|
||||
# 管理员账户解锁
|
||||
|
||||
在开目系统中有三个管理员账户即[系统三员](../系统介绍/用户/系统三员.md),系统三员账户是无法被停用的,但是当输入错误密码次数达到限额后,系统会锁定账户
|
||||
|
||||
| 账户 | 意义 |
|
||||
| -------- | -------------- |
|
||||
| system | 系统管理员 |
|
||||
| security | 安全保密管理员 |
|
||||
| auditor | 安全审计管理员 |
|
||||
|
||||
## 解锁账户方式一
|
||||
|
||||
这三个管理员账户是无法被停用的,但是当输入错误密码次数达到限额后,系统会锁定账户,此时需要在“安全管理”模块中的“管理员安全模块”页面对管理员进行解锁
|
||||
|
||||

|
||||
|
||||
Notice:**管理员安全模块仅可对这三个管理员进行解锁**
|
||||
|
||||
## 解锁账户方式二
|
||||
|
||||
除了通过系统提供的功能对系统三员账户进行解锁外,还可以直接对数据库中的数据表字段直接进行修改
|
||||
|
||||
在**KONGKU_ORG**(或叫**KM_ORG**)表空间中找到**PLM_USER**表([用户表](../数据库/用户表.md))
|
||||
|
||||

|
||||
|
||||
由于这系统三员账户是不会被禁用的,所以在CSTATE字段中的值只能为1
|
||||
|
||||
当账户锁定时,需要将CLOCKED字段的值改为0进行解锁
|
||||
|
||||
# 超级管理员账户解锁
|
||||
|
||||
超级管理员账户:superadmin
|
||||
|
||||
这个账户是不会被任何账户所管理的,永远处于启用状态,不过当错误密码输入次数过多后,仍然会出现账号被锁定的情况
|
||||
|
||||
虽然在登录时会提示账号被锁定,要向管理员请求解决,但安全保密管理员收到请求后是无法通过系统中提供的功能为超级管理员账户解锁的,此时需要直接对数据库中的数据表字段进行修改
|
||||
|
||||
在**KONGKU_ORG**(或叫**KM_ORG**)表空间中找到**PLM_USER**表([用户表](../数据库/用户表.md))
|
||||
|
||||

|
||||
|
||||
超级管理员账户是不会被禁用的,所以在CSTATE字段中的值只能为1
|
||||
|
||||
当超级管理员账户锁定时,需要将CLOCKED字段的值改为0进行解锁
|
0
KMsoftPLM/系统介绍/安全管理/. 功能授权.md
Normal file
BIN
KMsoftPLM/系统介绍/安全管理/assets/IMG-20240423162057744.png
Normal file
After Width: | Height: | Size: 159 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20240419170331.png
Normal file
After Width: | Height: | Size: 250 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127091522.png
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127110548.png
Normal file
After Width: | Height: | Size: 218 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127111740.png
Normal file
After Width: | Height: | Size: 169 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127135047.png
Normal file
After Width: | Height: | Size: 260 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127140014.png
Normal file
After Width: | Height: | Size: 226 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127141240.png
Normal file
After Width: | Height: | Size: 430 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127142353.png
Normal file
After Width: | Height: | Size: 196 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127163910.png
Normal file
After Width: | Height: | Size: 338 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241127164208.png
Normal file
After Width: | Height: | Size: 119 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241128140723.png
Normal file
After Width: | Height: | Size: 172 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241128141523.png
Normal file
After Width: | Height: | Size: 250 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241128141901.png
Normal file
After Width: | Height: | Size: 122 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129162142.png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129163358.png
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129163656.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129170829.png
Normal file
After Width: | Height: | Size: 260 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129171736.png
Normal file
After Width: | Height: | Size: 311 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129172109.png
Normal file
After Width: | Height: | Size: 237 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241129172129.png
Normal file
After Width: | Height: | Size: 191 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223142235.png
Normal file
After Width: | Height: | Size: 287 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223142518.png
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223142826.png
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223144123.png
Normal file
After Width: | Height: | Size: 233 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223145342.png
Normal file
After Width: | Height: | Size: 317 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223145422.png
Normal file
After Width: | Height: | Size: 199 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/Pasted image 20241223150314.png
Normal file
After Width: | Height: | Size: 254 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240418153127932.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240418153203742.png
Normal file
After Width: | Height: | Size: 190 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240418153834304.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240418155009112.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240419163914995.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240423091732238.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240423091932952.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240423095401723.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240423100146414.png
Normal file
After Width: | Height: | Size: 205 KiB |
BIN
KMsoftPLM/系统介绍/安全管理/assets/image-20240423100255639.png
Normal file
After Width: | Height: | Size: 150 KiB |