diff --git a/blog/font/blog/package-lock.json b/blog/font/blog/package-lock.json index 94b6024..ca018d7 100644 --- a/blog/font/blog/package-lock.json +++ b/blog/font/blog/package-lock.json @@ -9,9 +9,11 @@ "version": "0.0.0", "dependencies": { "axios": "^1.7.9", + "element-plus": "^2.9.0", + "marked": "^15.0.3", "pinia": "^2.2.6", "vue": "^3.5.13", - "vue-router": "^4.4.5" + "vue-router": "^4.0.13" }, "devDependencies": { "@tsconfig/node22": "^22.0.0", @@ -494,6 +496,24 @@ "node": ">=6.9.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.24.0", "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", @@ -902,6 +922,31 @@ "node": ">=18" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -961,6 +1006,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.1.3", "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", @@ -1284,6 +1340,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/node": { "version": "22.10.1", "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.10.1.tgz", @@ -1294,6 +1365,12 @@ "undici-types": "~6.20.0" } }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.1", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", @@ -1612,6 +1689,42 @@ } } }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/alien-signals": { "version": "0.2.2", "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-0.2.2.tgz", @@ -1632,6 +1745,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", @@ -1825,6 +1944,12 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", @@ -1909,6 +2034,32 @@ "dev": true, "license": "ISC" }, + "node_modules/element-plus": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.0.tgz", + "integrity": "sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", @@ -1981,6 +2132,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", @@ -2354,6 +2511,29 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2373,6 +2553,24 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/marked": { + "version": "15.0.3", + "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.3.tgz", + "integrity": "sha512-Ai0cepvl2NHnTcO9jYDtcOEtVBNVYR31XnEA3BndO7f5As1wzpcOceSUM8FDkNLJNIODcLpDTWay/qQhqbuMvg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", @@ -2475,6 +2673,12 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, "node_modules/npm-normalize-package-bin": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", @@ -3207,12 +3411,12 @@ } }, "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz", + "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.6.4" + "@vue/devtools-api": "^6.0.0" }, "funding": { "url": "https://github.com/sponsors/posva" diff --git a/blog/font/blog/package.json b/blog/font/blog/package.json index b67ae37..0acce60 100644 --- a/blog/font/blog/package.json +++ b/blog/font/blog/package.json @@ -12,9 +12,11 @@ }, "dependencies": { "axios": "^1.7.9", + "element-plus": "^2.9.0", + "marked": "^15.0.3", "pinia": "^2.2.6", "vue": "^3.5.13", - "vue-router": "^4.4.5" + "vue-router": "^4.0.13" }, "devDependencies": { "@tsconfig/node22": "^22.0.0", diff --git a/blog/font/blog/src/App.vue b/blog/font/blog/src/App.vue index ca8198c..ada0794 100644 --- a/blog/font/blog/src/App.vue +++ b/blog/font/blog/src/App.vue @@ -1,26 +1,75 @@ - + console.log('App.vue') + console.log(loginStore.userInfo.avatarurl); + + + + \ No newline at end of file +} + +#app { + height: 100%; + position: relative; /* 确保子元素可以相对于此进行定位 */ +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; + background-color: rgba(220, 221, 214, 0.8); /* 半透明背景色,以便文字可见 */ + color: white; + padding: 10px 20px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + z-index: 10; /* 确保头部在其他内容之上 */ +} +img { + width: 30px; /* 设置图片宽度 */ + height:30px; /* 设置图片高度 */ +} + \ No newline at end of file diff --git a/blog/font/blog/src/assets/img/abhor.svg b/blog/font/blog/src/assets/img/abhor.svg new file mode 100644 index 0000000..63e9a22 --- /dev/null +++ b/blog/font/blog/src/assets/img/abhor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/font/blog/src/assets/img/beijing.jpg b/blog/font/blog/src/assets/img/beijing.jpg new file mode 100644 index 0000000..988f2bd Binary files /dev/null and b/blog/font/blog/src/assets/img/beijing.jpg differ diff --git a/blog/font/blog/src/assets/img/deLogin.png b/blog/font/blog/src/assets/img/deLogin.png new file mode 100644 index 0000000..bd643aa Binary files /dev/null and b/blog/font/blog/src/assets/img/deLogin.png differ diff --git a/blog/font/blog/src/assets/img/deabhor.svg b/blog/font/blog/src/assets/img/deabhor.svg new file mode 100644 index 0000000..ad45d57 --- /dev/null +++ b/blog/font/blog/src/assets/img/deabhor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/font/blog/src/assets/img/defaultAvatar.png b/blog/font/blog/src/assets/img/defaultAvatar.png new file mode 100644 index 0000000..e20cd9e Binary files /dev/null and b/blog/font/blog/src/assets/img/defaultAvatar.png differ diff --git a/blog/font/blog/src/assets/img/delike.svg b/blog/font/blog/src/assets/img/delike.svg new file mode 100644 index 0000000..fd66701 --- /dev/null +++ b/blog/font/blog/src/assets/img/delike.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/font/blog/src/assets/img/index.png b/blog/font/blog/src/assets/img/index.png new file mode 100644 index 0000000..986f280 Binary files /dev/null and b/blog/font/blog/src/assets/img/index.png differ diff --git a/blog/font/blog/src/assets/img/like.svg b/blog/font/blog/src/assets/img/like.svg new file mode 100644 index 0000000..c249844 --- /dev/null +++ b/blog/font/blog/src/assets/img/like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/font/blog/src/assets/img/publicity.png b/blog/font/blog/src/assets/img/publicity.png new file mode 100644 index 0000000..b939a43 Binary files /dev/null and b/blog/font/blog/src/assets/img/publicity.png differ diff --git a/blog/font/blog/src/assets/img/zhuanfa.svg b/blog/font/blog/src/assets/img/zhuanfa.svg new file mode 100644 index 0000000..206cdd7 --- /dev/null +++ b/blog/font/blog/src/assets/img/zhuanfa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/font/blog/src/components/home/Publicity.vue b/blog/font/blog/src/components/home/Publicity.vue new file mode 100644 index 0000000..b89d394 --- /dev/null +++ b/blog/font/blog/src/components/home/Publicity.vue @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/login/PersonalSpace.vue b/blog/font/blog/src/components/login/PersonalSpace.vue new file mode 100644 index 0000000..b6bbcf1 --- /dev/null +++ b/blog/font/blog/src/components/login/PersonalSpace.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/login/Registered.vue b/blog/font/blog/src/components/login/Registered.vue new file mode 100644 index 0000000..cb39584 --- /dev/null +++ b/blog/font/blog/src/components/login/Registered.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/login/RetrievePassword.vue b/blog/font/blog/src/components/login/RetrievePassword.vue new file mode 100644 index 0000000..fab3837 --- /dev/null +++ b/blog/font/blog/src/components/login/RetrievePassword.vue @@ -0,0 +1,86 @@ + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/utils/Article.vue b/blog/font/blog/src/components/utils/Article.vue new file mode 100644 index 0000000..5105227 --- /dev/null +++ b/blog/font/blog/src/components/utils/Article.vue @@ -0,0 +1,84 @@ + + + + + + + diff --git a/blog/font/blog/src/components/utils/Paper.vue b/blog/font/blog/src/components/utils/Paper.vue new file mode 100644 index 0000000..67fc6e9 --- /dev/null +++ b/blog/font/blog/src/components/utils/Paper.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/utils/StartWriting.vue b/blog/font/blog/src/components/utils/StartWriting.vue new file mode 100644 index 0000000..3c16447 --- /dev/null +++ b/blog/font/blog/src/components/utils/StartWriting.vue @@ -0,0 +1,47 @@ + + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/components/writeBlog/Writing.vue b/blog/font/blog/src/components/writeBlog/Writing.vue new file mode 100644 index 0000000..11921e7 --- /dev/null +++ b/blog/font/blog/src/components/writeBlog/Writing.vue @@ -0,0 +1,113 @@ + + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/main.ts b/blog/font/blog/src/main.ts index 16a6b91..0c2429d 100644 --- a/blog/font/blog/src/main.ts +++ b/blog/font/blog/src/main.ts @@ -1,11 +1,17 @@ import { createApp } from 'vue'; import App from './App.vue'; -import router from './router'; + import { createPinia } from 'pinia'; +import ElementPlus from 'element-plus'; +import 'element-plus/dist/index.css'; +// 引入路由器 +import router from './router/index' const app = createApp(App); -app.use(router); +//使用路由 +app.use(router) app.use(createPinia()); +app.use(ElementPlus); app.mount('#app'); \ No newline at end of file diff --git a/blog/font/blog/src/page/Announcement.vue b/blog/font/blog/src/page/Announcement.vue new file mode 100644 index 0000000..f9e1022 --- /dev/null +++ b/blog/font/blog/src/page/Announcement.vue @@ -0,0 +1,65 @@ + + + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/page/Home.vue b/blog/font/blog/src/page/Home.vue new file mode 100644 index 0000000..7190a3b --- /dev/null +++ b/blog/font/blog/src/page/Home.vue @@ -0,0 +1,174 @@ + + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/page/Login.vue b/blog/font/blog/src/page/Login.vue new file mode 100644 index 0000000..05e9175 --- /dev/null +++ b/blog/font/blog/src/page/Login.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/blog/font/blog/src/router/index.js b/blog/font/blog/src/router/index.js deleted file mode 100644 index fcd6d46..0000000 --- a/blog/font/blog/src/router/index.js +++ /dev/null @@ -1,29 +0,0 @@ -import { createRouter, createWebHistory } from 'vue-router'; -import Home from '../views/Home.vue'; -import Login from '../views/Login.vue'; -import Register from '../views/Register.vue'; - -const routes = [ - { - path: '/', - name: 'Home', - component: Home, - }, - { - path: '/login', - name: 'Login', - component: Login, - }, - { - path: '/register', - name: 'Register', - component: Register, - }, -]; - -const router = createRouter({ - history: createWebHistory(), - routes, -}); - -export default router; \ No newline at end of file diff --git a/blog/font/blog/src/router/index.ts b/blog/font/blog/src/router/index.ts new file mode 100644 index 0000000..341ed2b --- /dev/null +++ b/blog/font/blog/src/router/index.ts @@ -0,0 +1,80 @@ +// 创建一个路由器,暴露出去 +// 导入路由组件 +import { createRouter, createWebHashHistory,createWebHistory } from 'vue-router' +//引入每个可能要呈现的组件 +// 引入首页 +import Home from '@/page/Home.vue' +// 引入登录页 +import Login from '@/page/Login.vue' +// 引入文章详情页 +import Paper from '@/components/utils/paper.vue' +// 引入书写页面 +import Writing from '@/components/writeBlog/Writing.vue' +// 引入找回密码和注册 +import RetrievePassword from '@/components/login/RetrievePassword.vue' +import Registered from '@/components/login/Registered.vue' +// 创建路由 + +const router = createRouter({ + // 路由模式 + history:createWebHistory(), + routes:[ + // 路由配置规则 + + { + path:'/home', + component:Home + }, + { + path:'/login', + component:Login + }, + // 文章详情页 + { + path:'/paper', + component:Paper + }, + // 书写页面 + { + path:'/writing', + component:Writing + }, + //找回密码 + { + path:'/retrievePassword', + component:RetrievePassword + }, + + //注册 + { + path:'/registered', + component:Registered + }, + //个人空间 + { + path:'/personalSpace', + component:()=>import('@/components/login/PersonalSpace.vue') + }, + + + // 重定向到首页 + { + path:'/', + redirect:'/home' + } + + ] +}) + + + + + + + + + + + +// 暴露出去 +export default router diff --git a/blog/font/blog/src/services/authService.js b/blog/font/blog/src/services/authService.js deleted file mode 100644 index 681e34f..0000000 --- a/blog/font/blog/src/services/authService.js +++ /dev/null @@ -1,32 +0,0 @@ -// src/services/authService.js -import axios from 'axios'; - -const API_URL = 'https://yourapi.com/api'; // 替换为你的API地址 - -export const login = async (email, password) => { - try { - const response = await axios.post(`${API_URL}/auth/login`, { email, password }); - if (response.data && response.data.token) { - localStorage.setItem('user', JSON.stringify(response.data)); // 假设返回的数据包含一个token - return true; - } - return false; - } catch (error) { - console.error('Login failed:', error); - throw error; // 或者你可以选择返回一个错误消息 - } -}; - -export const register = async (email, password) => { - try { - const response = await axios.post(`${API_URL}/auth/register`, { email, password }); - if (response.data) { - // 注册成功后的逻辑 - return true; - } - return false; - } catch (error) { - console.error('Register failed:', error); - throw error; - } -}; \ No newline at end of file diff --git a/blog/font/blog/src/stores/auth.js b/blog/font/blog/src/stores/auth.js deleted file mode 100644 index b68a6e7..0000000 --- a/blog/font/blog/src/stores/auth.js +++ /dev/null @@ -1,16 +0,0 @@ -import { defineStore } from 'pinia'; - -export const useAuthStore = defineStore('auth', { - state: () => ({ - isAuthenticated: false, - }), - actions: { - login() { - // 模拟登录过程 - this.isAuthenticated = true; - }, - logout() { - this.isAuthenticated = false; - }, - }, -}); \ No newline at end of file diff --git a/blog/font/blog/src/stores/login.ts b/blog/font/blog/src/stores/login.ts new file mode 100644 index 0000000..b74415a --- /dev/null +++ b/blog/font/blog/src/stores/login.ts @@ -0,0 +1,17 @@ +import { defineStore } from 'pinia'; +//全局登录状态管理 +export const useLoginStore = defineStore('login', { + state() { + return { + isLogin: false, + userInfo: { + id: '', + // 头像,默认值是未登录 + avatarurl: '../../assets/img/未登录头像.png', + username: '', + token: '' + + } + }; + } +}); \ No newline at end of file diff --git a/blog/font/blog/src/stores/paper.ts b/blog/font/blog/src/stores/paper.ts new file mode 100644 index 0000000..690a6a7 --- /dev/null +++ b/blog/font/blog/src/stores/paper.ts @@ -0,0 +1,106 @@ +import { defineStore } from 'pinia'; + +export const usePaperStore = defineStore('paper', { + state() { + return { + paper: { + id: '000', + title: '示例标题', + writer: 'LeJingS', + text: `## 标题 + +Markdown支持六级标题,使用`+"#"+`号表示,后面跟一个空格和标题文本。例如: + +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 + +##### 五级标题 + +###### 六级标题 + +## 强调文本 + +*斜体文本* 或者 *斜体文本* + +**粗体文本** 或者 **粗体文本** + +***粗斜体文本*** 或者 ***粗斜体文本*** + +## 列表 + +### 无序列表 + +- 使用减号 +- 使用加号 +- 使用星号 + +### 有序列表 + +1. 第一项 +2. 第二项 +3. 第三项 + +可以嵌套列表: + +1. 第一项 + - 嵌套子项 + - 另一个子项 +2. 第二项 + +## 链接 + +[链接文本](https://example.com/) 是Markdown中创建超链接的方式。 + +## 图片 + +![示例图片](https://via.placeholder.com/150) + +## 代码 + +内联代码使用反引号:\`var example = "code";\` + +多行代码或代码块使用三个反引号,并可指定语言以启用语法高亮: + +\`\`\`javascript +function helloWorld() { + console.log("Hello, world!"); +} +\`\`\` + +## 表格 + +| 表头 | 表头 | +| ------ | ------ | +| 单元格 | 单元格 | +| 单元格 | 单元格 | + +还可以定义对齐方式: + +| 左对齐 | 居中对齐 | 右对齐 | +| :----- | :------: | -----: | +| 数据 | 数据 | 数据 | +| 数据 | 数据 | 数据 | + +## 水平线 + +使用三个或更多个星号、减号或底线字符创建水平线: + +------ +------ +------ + +## 引用 + +> 这是一个引用。 +> 它可以跨越多个段落。 + +> > 也可以嵌套引用。` + } as Record + }; + } +}); \ No newline at end of file diff --git a/blog/font/blog/src/views/Home.vue b/blog/font/blog/src/views/Home.vue deleted file mode 100644 index 88ddd1b..0000000 --- a/blog/font/blog/src/views/Home.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/blog/font/blog/src/views/Login.vue b/blog/font/blog/src/views/Login.vue deleted file mode 100644 index 189d43c..0000000 --- a/blog/font/blog/src/views/Login.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - \ No newline at end of file diff --git a/blog/font/blog/src/views/Register.vue b/blog/font/blog/src/views/Register.vue deleted file mode 100644 index 00f38b4..0000000 --- a/blog/font/blog/src/views/Register.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - \ No newline at end of file diff --git a/blog/font/blog/vite.config.ts b/blog/font/blog/vite.config.ts index 4217010..786e6b8 100644 --- a/blog/font/blog/vite.config.ts +++ b/blog/font/blog/vite.config.ts @@ -10,6 +10,10 @@ export default defineConfig({ vue(), vueDevTools(), ], + server:{ + port:80, // 设置为你想要的端口号 + host: '0.0.0.0', // 监听所有网络接口 + }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) diff --git a/blog/server/demo/.idea/.gitignore b/blog/server/demo/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/blog/server/demo/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/blog/server/demo/.idea/compiler.xml b/blog/server/demo/.idea/compiler.xml new file mode 100644 index 0000000..d616f55 --- /dev/null +++ b/blog/server/demo/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/dataSources.xml b/blog/server/demo/.idea/dataSources.xml new file mode 100644 index 0000000..de12319 --- /dev/null +++ b/blog/server/demo/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306 + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/encodings.xml b/blog/server/demo/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/blog/server/demo/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/jarRepositories.xml b/blog/server/demo/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/blog/server/demo/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/misc.xml b/blog/server/demo/.idea/misc.xml new file mode 100644 index 0000000..df00c07 --- /dev/null +++ b/blog/server/demo/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/uiDesigner.xml b/blog/server/demo/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/blog/server/demo/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/.idea/vcs.xml b/blog/server/demo/.idea/vcs.xml new file mode 100644 index 0000000..c2365ab --- /dev/null +++ b/blog/server/demo/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/blog/server/demo/pom.xml b/blog/server/demo/pom.xml new file mode 100644 index 0000000..9950a6d --- /dev/null +++ b/blog/server/demo/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.0 + + + top.lejings + demo + 0.0.1-SNAPSHOT + demo + demo + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.4 + + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + 1.18.24 + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.mybatis.spring.boot + mybatis-spring-boot-starter-test + 3.0.4 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/blog/server/demo/src/main/java/top/lejings/demo/DemoApplication.java b/blog/server/demo/src/main/java/top/lejings/demo/DemoApplication.java new file mode 100644 index 0000000..67398e0 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package top.lejings.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/controller/AnnouncementsController.java b/blog/server/demo/src/main/java/top/lejings/demo/controller/AnnouncementsController.java new file mode 100644 index 0000000..7b14119 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/controller/AnnouncementsController.java @@ -0,0 +1,33 @@ +package top.lejings.demo.controller; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import top.lejings.demo.pojo.Announcements; +import top.lejings.demo.pojo.Result; +import top.lejings.demo.service.AnnouncementsService; + +import java.util.List; + +/* +* 公告响应 +* 对前端对于公告的所有请求接收 +* */ + +@Slf4j +@RestController +public class AnnouncementsController { + + @Autowired + private AnnouncementsService announcementsService; + + @GetMapping("/announcements") + public Result AnnouncementsAll(){ + log.info("查询所有公告数据"); + List announcementsList = announcementsService.announcementsAll(); + return Result.success(announcementsList); + } + +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/controller/PostsController.java b/blog/server/demo/src/main/java/top/lejings/demo/controller/PostsController.java new file mode 100644 index 0000000..e6f8403 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/controller/PostsController.java @@ -0,0 +1,44 @@ +package top.lejings.demo.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import top.lejings.demo.pojo.Posts; +import top.lejings.demo.pojo.Result; +import top.lejings.demo.service.PostsService; + +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/post") +public class PostsController { + @Autowired + private PostsService postsService; + + //概览 Overview + @GetMapping("/overview") + public Result PostsOverview() { + log.info("查询文章所有概览"); + List postsOverviewList = postsService.postsOverview(); + return Result.success(postsOverviewList); + } + //具体文章,接收参数 文章id essay + //请求url:127.0.0.1:8080/post/essay/4 + @GetMapping("/essay/{post_id}") + public Result PostsEssay(@PathVariable Integer post_id){ + log.info("查询id为{}的文章",post_id); + Posts posts = postsService.postsEssay(post_id); + return Result.success(posts); + } + + //新建文章,前端传来user_id,title,content + @PostMapping("/new") + public Result PostsNew(@RequestBody Posts posts){ + log.info("新建文章"); + + return Result.success(); + } + + +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/mapper/AnnouncementsMapper.java b/blog/server/demo/src/main/java/top/lejings/demo/mapper/AnnouncementsMapper.java new file mode 100644 index 0000000..503a694 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/mapper/AnnouncementsMapper.java @@ -0,0 +1,14 @@ +package top.lejings.demo.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import top.lejings.demo.pojo.Announcements; + +import java.util.List; + +@Mapper +public interface AnnouncementsMapper { + + @Select("select announcement_id,title,content,updated_at from announcements order by updated_at desc ") + List announcementsAll(); +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/mapper/PostsMapper.java b/blog/server/demo/src/main/java/top/lejings/demo/mapper/PostsMapper.java new file mode 100644 index 0000000..7cdb34b --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/mapper/PostsMapper.java @@ -0,0 +1,15 @@ +package top.lejings.demo.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import top.lejings.demo.pojo.Posts; + +import java.util.List; +@Mapper +public interface PostsMapper { + + List postsOverview(); + + + Posts postsEssay(Integer post_id); +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/pojo/Announcements.java b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Announcements.java new file mode 100644 index 0000000..a56698d --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Announcements.java @@ -0,0 +1,17 @@ +package top.lejings.demo.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Announcements { + private Integer announcement_id; + private String title; + private String content; + private LocalDateTime updated_at; //修改时间 +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/pojo/Posts.java b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Posts.java new file mode 100644 index 0000000..a675e9c --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Posts.java @@ -0,0 +1,20 @@ +package top.lejings.demo.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Posts { + private Integer post_id; + private Integer user_id; + private String title; + private String content; + private LocalDateTime updated_at; //修改时间 + private Integer priority;//优先级 + +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/pojo/Result.java b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Result.java new file mode 100644 index 0000000..279c272 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Result.java @@ -0,0 +1,28 @@ +package top.lejings.demo.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Result { + private Integer code;//响应码,1 代表成功; 0 代表失败 + private String msg; //响应信息 描述字符串 + private Object data; //返回的数据 + + + //增删改 成功响应 + public static Result success(){ + return new Result(1,"success",null); + } + //查询 成功响应 + public static Result success(Object data){ + return new Result(1,"success",data); + } + //失败响应 + public static Result error(String msg){ + return new Result(0,msg,null); + } +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/pojo/Users.java b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Users.java new file mode 100644 index 0000000..e2da33d --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/pojo/Users.java @@ -0,0 +1,21 @@ +package top.lejings.demo.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Users { + private Integer user_id; + private String username; + private String email; + private String password; + private String status;//账号状态: + private LocalDateTime created_at; + private LocalDateTime updated_at; //修改时间 + +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/service/AnnouncementsService.java b/blog/server/demo/src/main/java/top/lejings/demo/service/AnnouncementsService.java new file mode 100644 index 0000000..1c73c99 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/service/AnnouncementsService.java @@ -0,0 +1,9 @@ +package top.lejings.demo.service; + +import top.lejings.demo.pojo.Announcements; + +import java.util.List; + +public interface AnnouncementsService { + List announcementsAll(); +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/service/PostsService.java b/blog/server/demo/src/main/java/top/lejings/demo/service/PostsService.java new file mode 100644 index 0000000..a4752d9 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/service/PostsService.java @@ -0,0 +1,11 @@ +package top.lejings.demo.service; + +import top.lejings.demo.pojo.Posts; + +import java.util.List; + +public interface PostsService { + List postsOverview(); + + Posts postsEssay(Integer post_id); +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/service/impl/AnnouncementsServiceImpl.java b/blog/server/demo/src/main/java/top/lejings/demo/service/impl/AnnouncementsServiceImpl.java new file mode 100644 index 0000000..a347c32 --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/service/impl/AnnouncementsServiceImpl.java @@ -0,0 +1,19 @@ +package top.lejings.demo.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.lejings.demo.mapper.AnnouncementsMapper; +import top.lejings.demo.pojo.Announcements; +import top.lejings.demo.service.AnnouncementsService; + +import java.util.List; + +@Service +public class AnnouncementsServiceImpl implements AnnouncementsService { + @Autowired + private AnnouncementsMapper announcementsMapper; + + + @Override + public List announcementsAll() {return announcementsMapper.announcementsAll();} +} diff --git a/blog/server/demo/src/main/java/top/lejings/demo/service/impl/PostsServiceImpl.java b/blog/server/demo/src/main/java/top/lejings/demo/service/impl/PostsServiceImpl.java new file mode 100644 index 0000000..861f21b --- /dev/null +++ b/blog/server/demo/src/main/java/top/lejings/demo/service/impl/PostsServiceImpl.java @@ -0,0 +1,21 @@ +package top.lejings.demo.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.lejings.demo.mapper.PostsMapper; +import top.lejings.demo.pojo.Posts; +import top.lejings.demo.service.PostsService; + +import java.util.List; +@Service +public class PostsServiceImpl implements PostsService { + + @Autowired + private PostsMapper postsMapper; + + @Override + public List postsOverview() {return postsMapper.postsOverview();} + + @Override + public Posts postsEssay(Integer post_id) {return postsMapper.postsEssay(post_id);} +} diff --git a/blog/server/demo/src/main/resources/application.properties b/blog/server/demo/src/main/resources/application.properties new file mode 100644 index 0000000..4db5496 --- /dev/null +++ b/blog/server/demo/src/main/resources/application.properties @@ -0,0 +1,14 @@ + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.datasource.url=jdbc:mysql://localhost:3306/blog + +spring.datasource.username=root + +spring.datasource.password=123456 + + +mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl + +mybatis.configuration.map-underscore-to-camel-case=true + diff --git a/blog/server/demo/src/main/resources/top/lejings/demo/mapper/PostsMapper.xml b/blog/server/demo/src/main/resources/top/lejings/demo/mapper/PostsMapper.xml new file mode 100644 index 0000000..0903f3d --- /dev/null +++ b/blog/server/demo/src/main/resources/top/lejings/demo/mapper/PostsMapper.xml @@ -0,0 +1,56 @@ + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/src/test/java/top/lejings/demo/DemoApplicationTests.java b/blog/server/demo/src/test/java/top/lejings/demo/DemoApplicationTests.java new file mode 100644 index 0000000..31c7233 --- /dev/null +++ b/blog/server/demo/src/test/java/top/lejings/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package top.lejings.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/blog/server/demo/target/classes/application.properties b/blog/server/demo/target/classes/application.properties new file mode 100644 index 0000000..4db5496 --- /dev/null +++ b/blog/server/demo/target/classes/application.properties @@ -0,0 +1,14 @@ + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.datasource.url=jdbc:mysql://localhost:3306/blog + +spring.datasource.username=root + +spring.datasource.password=123456 + + +mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl + +mybatis.configuration.map-underscore-to-camel-case=true + diff --git a/blog/server/demo/target/classes/top/lejings/demo/DemoApplication.class b/blog/server/demo/target/classes/top/lejings/demo/DemoApplication.class new file mode 100644 index 0000000..9bf5ac6 Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/DemoApplication.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/controller/AnnouncementsController.class b/blog/server/demo/target/classes/top/lejings/demo/controller/AnnouncementsController.class new file mode 100644 index 0000000..f2279bc Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/controller/AnnouncementsController.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/controller/PostsController.class b/blog/server/demo/target/classes/top/lejings/demo/controller/PostsController.class new file mode 100644 index 0000000..9442bdb Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/controller/PostsController.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/mapper/AnnouncementsMapper.class b/blog/server/demo/target/classes/top/lejings/demo/mapper/AnnouncementsMapper.class new file mode 100644 index 0000000..e071cee Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/mapper/AnnouncementsMapper.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.class b/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.class new file mode 100644 index 0000000..d6da53b Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.xml b/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.xml new file mode 100644 index 0000000..0903f3d --- /dev/null +++ b/blog/server/demo/target/classes/top/lejings/demo/mapper/PostsMapper.xml @@ -0,0 +1,56 @@ + + + + + + + \ No newline at end of file diff --git a/blog/server/demo/target/classes/top/lejings/demo/pojo/Announcements.class b/blog/server/demo/target/classes/top/lejings/demo/pojo/Announcements.class new file mode 100644 index 0000000..44435a6 Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/pojo/Announcements.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/pojo/Posts.class b/blog/server/demo/target/classes/top/lejings/demo/pojo/Posts.class new file mode 100644 index 0000000..8430029 Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/pojo/Posts.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/pojo/Result.class b/blog/server/demo/target/classes/top/lejings/demo/pojo/Result.class new file mode 100644 index 0000000..b10e2d2 Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/pojo/Result.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/pojo/Users.class b/blog/server/demo/target/classes/top/lejings/demo/pojo/Users.class new file mode 100644 index 0000000..9576612 Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/pojo/Users.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/service/AnnouncementsService.class b/blog/server/demo/target/classes/top/lejings/demo/service/AnnouncementsService.class new file mode 100644 index 0000000..34fd72a Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/service/AnnouncementsService.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/service/PostsService.class b/blog/server/demo/target/classes/top/lejings/demo/service/PostsService.class new file mode 100644 index 0000000..2146b1a Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/service/PostsService.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/service/impl/AnnouncementsServiceImpl.class b/blog/server/demo/target/classes/top/lejings/demo/service/impl/AnnouncementsServiceImpl.class new file mode 100644 index 0000000..f10a60c Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/service/impl/AnnouncementsServiceImpl.class differ diff --git a/blog/server/demo/target/classes/top/lejings/demo/service/impl/PostsServiceImpl.class b/blog/server/demo/target/classes/top/lejings/demo/service/impl/PostsServiceImpl.class new file mode 100644 index 0000000..b2a736e Binary files /dev/null and b/blog/server/demo/target/classes/top/lejings/demo/service/impl/PostsServiceImpl.class differ diff --git a/blog/server/learn.md b/blog/server/learn.md deleted file mode 100644 index e69de29..0000000 diff --git a/blog/接口文档/v0.1.md b/blog/接口文档/v0.1.md index e2dc693..609de5f 100644 --- a/blog/接口文档/v0.1.md +++ b/blog/接口文档/v0.1.md @@ -1,18 +1,133 @@ # 接口文档 -### 登录 +### 数据库设计 + +用户表 (users) +用于存储用户信息,支持登录、注册、找回密码等功能,并包含用户状态。 + +Sql + +``` +CREATE TABLE users ( + user_id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + email VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, -- 建议使用安全哈希算法存储密码 + status ENUM('admin', 'normal', 'blocked', 'deactivated', 'pending') DEFAULT 'pending', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + is_active BOOLEAN DEFAULT TRUE, + activation_token VARCHAR(255), -- 用于激活账户或重置密码 + reset_password_token VARCHAR(255), -- 密码重置令牌 + reset_password_expires TIMESTAMP -- 密码重置令牌有效期 +); +``` + + + + + +管理员表 (administrators) +用于标识哪些用户是管理员。这里假设如果用户的状态为admin,则不需要再额外记录到administrators表中,简化了数据库结构。 + +Sql + +``` +-- 如果需要单独维护管理员列表,可以保留此表;否则可以根据用户状态判断是否为管理员。 +CREATE TABLE administrators ( + admin_id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL UNIQUE, + FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE +); +``` + + + +文章表 (posts) +用于存储用户发布的文章。注意:只有状态为normal和admin的用户才能发布文章。 + +Sql + +``` +CREATE TABLE posts ( + post_id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE +); +``` + + + + + +点赞点踩表 (reactions) +记录用户对文章的点赞和点踩操作。只有状态为normal和admin的用户才能进行这些互动。 + +Sql + +``` +CREATE TABLE reactions ( + reaction_id INT AUTO_INCREMENT PRIMARY KEY, + post_id INT NOT NULL, + user_id INT NOT NULL, + type ENUM('like', 'dislike') NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (post_id) REFERENCES posts(post_id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE, + UNIQUE (post_id, user_id) -- 每个用户对每篇文章只能有一个反应 +); +``` + + + + + +公告表 (announcements) +用于发布站内公告。只有状态为admin的用户可以发布或编辑公告。 + +Sql + + +```sql +CREATE TABLE announcements ( + announcement_id INT AUTO_INCREMENT PRIMARY KEY, + admin_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + is_published BOOLEAN DEFAULT FALSE, + FOREIGN KEY (admin_id) REFERENCES users(user_id) ON DELETE CASCADE -- 直接引用用户表中的user_id +); +``` + + + +应用逻辑注意事项 +权限控制:在应用程序逻辑中,确保根据用户的 status 字段来控制不同操作的权限。例如,只有 admin 用户可以发布或编辑公告,而 blocked 或 deactivated 用户不能执行任何操作。 +状态转换:定义清晰的状态转换规则。例如,从 pending 转换为 normal 需要管理员审批;blocked 用户不能自行恢复状态,需由管理员处理等。 + + + + + +ALTER TABLE reactions ADD CONSTRAINT unique_user_post_reaction UNIQUE (post_id, user_id); + + + + -url:/login -### 注册 -url:/register -获取令牌