├── .editorconfig ├── .env.development ├── .env.production ├── .eslintignore ├── .eslintrc.js ├── .github ├── ISSUE_TEMPLATE │ ├── ----.md │ └── bug-report-.md └── workflows │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .vscode ├── extensions.json └── settings.json ├── .yarnrc ├── README.md ├── commitlint.config.js ├── global.d.ts ├── index.html ├── jest.config.js ├── license ├── package.json ├── prettier.config.js ├── public └── favicon.ico ├── src ├── App.vue ├── api │ ├── model │ │ └── mofish.ts │ └── mofish.ts ├── assets │ ├── image │ │ ├── github.png │ │ ├── heart.png │ │ └── mofish.gif │ └── style │ │ ├── _font.scss │ │ ├── _reset.scss │ │ ├── _unite.scss │ │ ├── _zindex.scss │ │ ├── index.scss │ │ └── variable.scss ├── components │ ├── abstract │ │ ├── button │ │ │ ├── __tests__ │ │ │ │ └── button.test.ts │ │ │ ├── button.ts │ │ │ ├── button.vue │ │ │ └── types.ts │ │ └── toast │ │ │ ├── __tests__ │ │ │ └── toast.test.ts │ │ │ ├── toast.ts │ │ │ ├── toast.vue │ │ │ └── types.ts │ ├── container.vue │ ├── heart.vue │ ├── mofish-list.vue │ ├── todolist.vue │ └── v-footer.vue ├── main.ts ├── pages │ ├── index.vue │ ├── mofish.vue │ └── todolist.vue ├── router │ └── index.ts ├── store │ └── index.ts └── utils │ ├── index.ts │ └── request │ ├── base.ts │ ├── index.ts │ └── mofish.ts ├── stylelint.config.js ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | # base url 2 | VITE_LOCAL_URL = '/api' 3 | VITE_REALITY_URL = 'https://xxxxxxxxxxx' 4 | VITE_BASE_URL = '/api' 5 | 6 | # mofish url 7 | VITE_MOFISH_LOCAL_URL = '/mofish' 8 | VITE_MOFISH_REALITY_URL = 'https://api.tophub.fun' 9 | VITE_MOFISH_BASE_URL = '/mofish' 10 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # base url 2 | VITE_LOCAL_URL = '/api' 3 | VITE_REALITY_URL = 'https://xxxxxxxxxxx' 4 | VITE_BASE_URL = 'https://xxxxxxxxxxx' 5 | 6 | # mofish url 7 | VITE_MOFISH_LOCAL_URL = '/mofish' 8 | VITE_MOFISH_REALITY_URL = 'https://api.tophub.fun' 9 | VITE_MOFISH_BASE_URL = 'https://api.tophub.fun' 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage/ 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | static/ 41 | 42 | # TypeScript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env 62 | 63 | # parcel-bundler cache (https://parceljs.org/) 64 | .cache 65 | 66 | # next.js build output 67 | .next 68 | 69 | # nuxt.js build output 70 | .nuxt 71 | 72 | # Nuxt generate 73 | dist 74 | 75 | # vuepress build output 76 | .vuepress/dist 77 | 78 | # Serverless directories 79 | .serverless 80 | 81 | # IDE / Editor 82 | .idea 83 | 84 | # Service worker 85 | sw.* 86 | 87 | # macOS 88 | .DS_Store 89 | 90 | # Vim swap files 91 | *.swp 92 | 93 | # coverage 94 | coverage/ 95 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | node: true, 6 | // 使用 eslint-plugin-vue 解决 Vue3 defineProps、defineEmits、no-undef 规则警告 7 | // https://eslint.vuejs.org/user-guide/#usage 8 | 'vue/setup-compiler-macros': true 9 | }, 10 | parser: 'vue-eslint-parser', 11 | extends: [ 12 | 'plugin:prettier/recommended', 13 | 'plugin:vue/vue3-recommended', 14 | 'plugin:@typescript-eslint/recommended', 15 | 'prettier' 16 | ], 17 | parserOptions: { 18 | ecmaVersion: 'latest', 19 | parser: '@typescript-eslint/parser', 20 | sourceType: 'module' 21 | }, 22 | plugins: ['prettier', '@typescript-eslint'], 23 | rules: { 24 | 'prettier/prettier': 'error', 25 | 'vue/no-v-html': 'off', 26 | 'vue/multi-word-component-names': 'off', 27 | 'vue/no-multiple-template-root': 'off', 28 | 'vue/component-definition-name-casing': ['warn', 'kebab-case'], 29 | 'no-debugger': 'off', 30 | 'no-console': 'off', 31 | '@typescript-eslint/no-explicit-any': ['off'] 32 | }, 33 | globals: { defineOptions: 'writable' } 34 | } 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/----.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 博文模板 3 | about: 自己写博客的模板 4 | 5 | --- 6 | 7 |  8 | 9 | > 描述 10 | 11 | ### 标题 12 | 13 |
14 |
15 |
`s get reset. 110 | p { 111 | margin-top: 0; 112 | margin-bottom: 0; 113 | } 114 | 115 | // Abbreviations 116 | // 117 | // 1. remove the bottom border in Firefox 39-. 118 | // 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 119 | // 3. Add explicit cursor to indicate changed behavior. 120 | // 4. Duplicate behavior to the data-* attribute for our tooltip plugin 121 | 122 | abbr[title], 123 | abbr[data-original-title] { 124 | // 4 125 | text-decoration: underline; // 2 126 | text-decoration: underline dotted; // 2 127 | border-bottom: 0; // 1 128 | cursor: help; // 3 129 | } 130 | 131 | address { 132 | margin-bottom: 1em; 133 | font-style: normal; 134 | line-height: inherit; 135 | } 136 | 137 | input[type='text'], 138 | input[type='password'], 139 | input[type='number'], 140 | textarea { 141 | -webkit-appearance: none; 142 | -moz-appearance: textfield; 143 | } 144 | 145 | ol, 146 | ul, 147 | dl, 148 | dt, 149 | dd { 150 | margin: 0; 151 | padding: 0; 152 | } 153 | 154 | ul, 155 | ol { 156 | list-style-type: none; 157 | } 158 | 159 | dt { 160 | font-weight: 500; 161 | } 162 | 163 | dd { 164 | margin: 0; 165 | } 166 | 167 | dfn { 168 | font-style: italic; // Add the correct font style in Android 4.3- 169 | } 170 | 171 | b, 172 | strong { 173 | font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari 174 | } 175 | 176 | small { 177 | font-size: 80%; // Add the correct font size in all browsers 178 | } 179 | 180 | // 181 | // Prevent `sub` and `sup` elements from affecting the line height in 182 | // all browsers. 183 | // 184 | 185 | sub, 186 | sup { 187 | position: relative; 188 | font-size: 75%; 189 | line-height: 0; 190 | vertical-align: baseline; 191 | } 192 | 193 | sub { 194 | bottom: -0.25em; 195 | } 196 | sup { 197 | top: -0.5em; 198 | } 199 | 200 | // 201 | // Links 202 | // 203 | 204 | a { 205 | background-color: transparent; // remove the gray background on active links in IE 10. 206 | outline: none; 207 | cursor: pointer; 208 | transition: color 0.3s; 209 | text-decoration: none; 210 | -webkit-text-decoration-skip: objects; // remove gaps in links underline in iOS 8+ and Safari 8+. 211 | 212 | &:active, 213 | &:hover { 214 | outline: 0; 215 | } 216 | 217 | // https://github.com/ant-design/ant-design/issues/22503 218 | &:focus { 219 | outline: 0; 220 | } 221 | 222 | &[disabled] { 223 | cursor: not-allowed; 224 | pointer-events: none; 225 | } 226 | } 227 | 228 | // 229 | // Code 230 | // 231 | 232 | pre, 233 | code, 234 | kbd, 235 | samp { 236 | font-size: 1em; // Correct the odd `em` font sizing in all browsers. 237 | } 238 | 239 | pre { 240 | // remove browser default top margin 241 | margin-top: 0; 242 | // Reset browser default of `1em` to use `em`s 243 | margin-bottom: 1em; 244 | // Don't allow content to break outside 245 | overflow: auto; 246 | } 247 | 248 | // 249 | // Figures 250 | // 251 | figure { 252 | // Apply a consistent margin strategy (matches our type styles). 253 | margin: 0 0 1em; 254 | } 255 | 256 | // 257 | // Images and content 258 | // 259 | 260 | img { 261 | vertical-align: middle; 262 | border-style: none; // remove the border on images inside links in IE 10-. 263 | } 264 | 265 | svg:not(:root) { 266 | overflow: hidden; // Hide the overflow in IE 267 | } 268 | 269 | // Avoid 300ms click delay on touch devices that support the `touch-action` CSS property. 270 | // 271 | // In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11 272 | // DON'T remove the click delay when `` is present. 273 | // However, they DO support emoving the click delay via `touch-action: manipulation`. 274 | // See: 275 | // * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch 276 | // * http://caniuse.com/#feat=css-touch-action 277 | // * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay 278 | 279 | a, 280 | area, 281 | button, 282 | [role='button'], 283 | input:not([type='range']), 284 | label, 285 | select, 286 | summary, 287 | textarea { 288 | touch-action: manipulation; 289 | } 290 | 291 | // 292 | // Tables 293 | // 294 | 295 | table { 296 | border-collapse: collapse; // Prevent double borders 297 | } 298 | 299 | caption { 300 | padding-top: 0.75em; 301 | padding-bottom: 0.3em; 302 | text-align: left; 303 | caption-side: bottom; 304 | } 305 | 306 | th { 307 | // Matches default `
提示:因为接口跨域,所以线上无法直接查看,请下载项目后预览。
7 |