├── .browserslistrc ├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ └── build.yml ├── .gitignore ├── .lintstagedrc.js ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .stylelintrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── Dockerfile ├── Dockerfile.dev ├── LICENSE ├── README-zh_CN.md ├── README.md ├── _cli-tpl └── test │ └── __path__ │ └── __name@dasherize@if-flat__ │ ├── __name@dasherize__.component.html │ ├── __name@dasherize__.component.spec.ts │ └── __name@dasherize__.component.ts ├── _mock ├── README.md ├── _user.ts └── index.ts ├── angular.json ├── e2e ├── protractor.conf.js ├── src │ ├── app.e2e-spec.ts │ └── app.po.ts └── tsconfig.json ├── image-files ├── etc │ └── nginx │ │ └── nginx.conf └── usr │ └── local │ └── bin │ ├── docker-entrypoint-dev.sh │ └── docker-entrypoint.sh ├── karma.conf.js ├── package-lock.json ├── package.json ├── proxy.conf.json ├── scripts └── color-less.js ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── core │ │ ├── README.md │ │ ├── core.module.ts │ │ ├── i18n │ │ │ ├── i18n.service.spec.ts │ │ │ └── i18n.service.ts │ │ ├── index.ts │ │ ├── module-import-guard.ts │ │ ├── net │ │ │ └── default.interceptor.ts │ │ └── startup │ │ │ └── startup.service.ts │ ├── global-config.module.ts │ ├── layout │ │ ├── default │ │ │ ├── default.component.html │ │ │ ├── default.component.ts │ │ │ ├── header │ │ │ │ ├── components │ │ │ │ │ ├── fullscreen.component.ts │ │ │ │ │ ├── i18n.component.ts │ │ │ │ │ ├── icon.component.ts │ │ │ │ │ ├── notify.component.ts │ │ │ │ │ ├── search.component.ts │ │ │ │ │ ├── storage.component.ts │ │ │ │ │ ├── task.component.ts │ │ │ │ │ └── user.component.ts │ │ │ │ ├── header.component.html │ │ │ │ ├── header.component.ts │ │ │ │ └── index.md │ │ │ ├── setting-drawer │ │ │ │ ├── setting-drawer-item.component.html │ │ │ │ ├── setting-drawer-item.component.ts │ │ │ │ ├── setting-drawer.component.html │ │ │ │ └── setting-drawer.component.ts │ │ │ └── sidebar │ │ │ │ ├── sidebar.component.html │ │ │ │ └── sidebar.component.ts │ │ ├── fullscreen │ │ │ ├── fullscreen.component.html │ │ │ └── fullscreen.component.ts │ │ ├── layout.module.ts │ │ └── passport │ │ │ ├── passport.component.html │ │ │ ├── passport.component.less │ │ │ └── passport.component.ts │ ├── routes │ │ ├── account │ │ │ ├── account-routing.module.ts │ │ │ ├── account.module.ts │ │ │ ├── form │ │ │ │ ├── form.component.html │ │ │ │ └── form.component.ts │ │ │ ├── index │ │ │ │ ├── index.component.html │ │ │ │ ├── index.component.less │ │ │ │ └── index.component.ts │ │ │ └── view │ │ │ │ ├── view.component.html │ │ │ │ └── view.component.ts │ │ ├── analysis │ │ │ ├── analysis-routing.module.ts │ │ │ ├── analysis.module.ts │ │ │ └── index │ │ │ │ ├── index.component.html │ │ │ │ ├── index.component.less │ │ │ │ └── index.component.ts │ │ ├── callback │ │ │ └── callback.component.ts │ │ ├── dashboard │ │ │ ├── dashboard.component.html │ │ │ ├── dashboard.component.less │ │ │ └── dashboard.component.ts │ │ ├── exception │ │ │ ├── 403.component.ts │ │ │ ├── 404.component.ts │ │ │ ├── 500.component.ts │ │ │ ├── exception-routing.module.ts │ │ │ ├── exception.module.ts │ │ │ └── trigger.component.ts │ │ ├── passport │ │ │ ├── lock │ │ │ │ ├── lock.component.html │ │ │ │ ├── lock.component.less │ │ │ │ └── lock.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.less │ │ │ │ └── login.component.ts │ │ │ ├── register-result │ │ │ │ ├── register-result.component.html │ │ │ │ └── register-result.component.ts │ │ │ └── register │ │ │ │ ├── register.component.html │ │ │ │ ├── register.component.less │ │ │ │ └── register.component.ts │ │ ├── record │ │ │ ├── create-by-desc │ │ │ │ ├── create-by-desc.component.html │ │ │ │ └── create-by-desc.component.ts │ │ │ ├── form │ │ │ │ ├── form.component.html │ │ │ │ └── form.component.ts │ │ │ ├── import │ │ │ │ ├── import.component.html │ │ │ │ └── import.component.ts │ │ │ ├── index │ │ │ │ ├── index.component.html │ │ │ │ ├── index.component.less │ │ │ │ └── index.component.ts │ │ │ ├── record-routing.module.ts │ │ │ └── record.module.ts │ │ ├── recurrence │ │ │ ├── form │ │ │ │ ├── form.component.html │ │ │ │ └── form.component.ts │ │ │ ├── index │ │ │ │ ├── index.component.html │ │ │ │ └── index.component.ts │ │ │ ├── recurrence-routing.module.ts │ │ │ └── recurrence.module.ts │ │ ├── routes-routing.module.ts │ │ ├── routes.module.ts │ │ └── settings │ │ │ ├── categories │ │ │ ├── categories.component.html │ │ │ ├── categories.component.ts │ │ │ ├── edit │ │ │ │ ├── edit.component.html │ │ │ │ └── edit.component.ts │ │ │ └── view │ │ │ │ ├── view.component.html │ │ │ │ └── view.component.ts │ │ │ ├── personal │ │ │ ├── base │ │ │ │ ├── base.component.html │ │ │ │ └── base.component.ts │ │ │ ├── binding │ │ │ │ ├── binding.component.html │ │ │ │ └── binding.component.ts │ │ │ ├── personal.component.html │ │ │ ├── personal.component.less │ │ │ ├── personal.component.ts │ │ │ └── security │ │ │ │ ├── security.component.html │ │ │ │ └── security.component.ts │ │ │ ├── rules │ │ │ ├── form │ │ │ │ ├── form.component.html │ │ │ │ └── form.component.ts │ │ │ ├── rules.component.html │ │ │ └── rules.component.ts │ │ │ ├── settings-routing.module.ts │ │ │ ├── settings.module.ts │ │ │ └── tags │ │ │ ├── edit │ │ │ ├── edit.component.html │ │ │ └── edit.component.ts │ │ │ ├── tags.component.html │ │ │ ├── tags.component.ts │ │ │ └── view │ │ │ ├── view.component.html │ │ │ └── view.component.ts │ └── shared │ │ ├── index.ts │ │ ├── json-schema │ │ └── json-schema.module.ts │ │ ├── search │ │ ├── search.component.html │ │ ├── search.component.less │ │ └── search.component.ts │ │ ├── shared-delon.module.ts │ │ ├── shared-zorro.module.ts │ │ ├── shared.module.ts │ │ ├── st-widget │ │ └── st-widget.module.ts │ │ └── utils │ │ └── yuan.ts ├── assets │ ├── .gitkeep │ ├── alain-default.less │ ├── import-template.csv │ ├── logo-color.svg │ ├── logo-full.svg │ ├── logo.svg │ ├── tmp │ │ ├── app-data.json │ │ ├── i18n │ │ │ ├── el-GR.json │ │ │ ├── en-US.json │ │ │ ├── hr-HR.json │ │ │ ├── ko-KR.json │ │ │ ├── pl-PL.json │ │ │ ├── sl-SI.json │ │ │ ├── tr-TR.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ │ └── img │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── avatar.jpg │ │ │ ├── bg1.jpg │ │ │ ├── bg10.jpg │ │ │ ├── bg2.jpg │ │ │ ├── bg3.jpg │ │ │ ├── bg4.jpg │ │ │ ├── bg5.jpg │ │ │ ├── bg6.jpg │ │ │ ├── bg7.jpg │ │ │ ├── bg8.jpg │ │ │ ├── bg9.jpg │ │ │ └── half-float-bg-1.jpg │ └── zorro.svg ├── environments │ ├── environment.hmr.ts │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── hmr.ts ├── index.html ├── main.ts ├── polyfills.ts ├── style-icons-auto.ts ├── style-icons.ts ├── styles.less ├── styles │ ├── index.less │ └── theme.less ├── test.ts └── typings.d.ts ├── tsconfig.app.json ├── tsconfig.base.json ├── tsconfig.json ├── tsconfig.spec.json ├── tslint.json └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. 18 | not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. 19 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [forecho] 2 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Deploy CI 2 | on: 3 | push: 4 | branches: [master] 5 | pull_request: 6 | branches: [master] 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | node-version: [14.x] 14 | 15 | steps: 16 | - uses: actions/checkout@v1 17 | - name: Setup kernel for react native, increase watchers 18 | run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p 19 | 20 | - name: Cache node modules 21 | uses: actions/cache@v1 22 | with: 23 | path: ~/.npm 24 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 25 | restore-keys: | 26 | ${{ runner.os }}-node- 27 | 28 | - name: Node ${{ matrix.node-version }} 29 | uses: actions/setup-node@v1 30 | with: 31 | node-version: ${{ matrix.node-version }} 32 | 33 | - name: npm ci and npm run build 34 | run: | 35 | npm ci 36 | (echo y; echo y; echo y; echo y;) | sudo npm install -g @angular/cli 37 | ng build --prod 38 | 39 | - name: Deploy 40 | uses: peaceiris/actions-gh-pages@v3 41 | with: 42 | github_token: ${{ secrets.GITHUB_TOKEN }} 43 | publish_dir: ./dist 44 | user_name: 'github-actions[bot]' 45 | user_email: 'github-actions[bot]@users.noreply.github.com' 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | # Only exists if Bazel was run 8 | /bazel-out 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # profiling files 14 | chrome-profiler-events*.json 15 | speed-measure-plugin*.json 16 | 17 | # IDEs and editors 18 | /.idea 19 | .project 20 | .classpath 21 | .c9/ 22 | *.launch 23 | .settings/ 24 | *.sublime-workspace 25 | 26 | # IDE - VSCode 27 | .vscode/* 28 | !.vscode/settings.json 29 | !.vscode/tasks.json 30 | !.vscode/launch.json 31 | !.vscode/extensions.json 32 | .history/* 33 | 34 | # misc 35 | /.sass-cache 36 | /connect.lock 37 | /coverage 38 | /libpeerconnection.log 39 | npm-debug.log 40 | yarn-error.log 41 | testem.log 42 | /typings 43 | 44 | # System Files 45 | .DS_Store 46 | Thumbs.db 47 | -------------------------------------------------------------------------------- /.lintstagedrc.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | module.exports = { 4 | 'src/**/*.ts': () => [`npm run lint:ts`, 'git add'], 5 | 'src/**/*.html': ['./node_modules/.bin/prettier --write', 'git add'], 6 | 'src/**/*.less': ['npm run lint:style', 'git add'], 7 | }; 8 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 12.14.1 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # add files you wish to ignore here 2 | **/*.md 3 | **/*.svg 4 | **/test.ts 5 | 6 | .stylelintrc 7 | .prettierrc 8 | 9 | src/assets/* 10 | src/index.html 11 | node_modules/ 12 | .vscode/ 13 | coverage/ 14 | dist/ 15 | package.json 16 | tslint.json 17 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 140, 3 | "singleQuote": true, 4 | "semi": true, 5 | "trailingComma": "all", 6 | "proseWrap": "never" 7 | } 8 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "stylelint-config-standard", 4 | "stylelint-config-rational-order", 5 | "stylelint-config-prettier" 6 | ], 7 | "plugins": [ 8 | "stylelint-order", 9 | "stylelint-declaration-block-no-ignored-properties" 10 | ], 11 | "rules": { 12 | "no-descending-specificity": null, 13 | "plugin/declaration-block-no-ignored-properties": true, 14 | "selector-type-no-unknown": [ 15 | true, 16 | { 17 | "ignoreTypes": [ 18 | "/^g2-/", 19 | "/^nz-/", 20 | "/^app-/" 21 | ] 22 | } 23 | ], 24 | "selector-pseudo-element-no-unknown": [ 25 | true, 26 | { 27 | "ignorePseudoElements": [ 28 | "ng-deep" 29 | ] 30 | } 31 | ] 32 | }, 33 | "ignoreFiles": [ 34 | "src/assets/**/*" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "cipchk.ng-alain-extension-pack" 4 | ] 5 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "chrome", 9 | "request": "launch", 10 | "name": "Launch Chrome against localhost", 11 | "url": "http://localhost:4200", 12 | "webRoot": "${workspaceRoot}", 13 | "sourceMaps": true 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "./node_modules/typescript/lib", 3 | "editor.formatOnSave": true, 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll.tslint": true, 6 | "source.fixAll.stylelint": true 7 | }, 8 | "[markdown]": { 9 | "editor.formatOnSave": false 10 | }, 11 | "[javascript]": { 12 | "editor.formatOnSave": false 13 | }, 14 | "[json]": { 15 | "editor.formatOnSave": false 16 | }, 17 | "[jsonc]": { 18 | "editor.formatOnSave": false 19 | }, 20 | "files.watcherExclude": { 21 | "**/.git/*/**": true, 22 | "**/node_modules/*/**": true, 23 | "**/dist/*/**": true, 24 | "**/coverage/*/**": true 25 | }, 26 | "files.associations": { 27 | "*.json": "jsonc", 28 | ".prettierrc": "jsonc", 29 | ".stylelintrc": "jsonc" 30 | }, 31 | // Angular schematics 插件: https://marketplace.visualstudio.com/items?itemName=cyrilletuzi.angular-schematics 32 | "ngschematics.schematics": [ 33 | "ng-alain" 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:stable-alpine AS production-stage 2 | 3 | WORKDIR /srv 4 | 5 | COPY image-files/ / 6 | 7 | COPY dist /srv 8 | 9 | EXPOSE 80 10 | 11 | ENTRYPOINT [ "docker-entrypoint.sh" ] 12 | 13 | CMD ["nginx", "-g", "daemon off;"] 14 | -------------------------------------------------------------------------------- /Dockerfile.dev: -------------------------------------------------------------------------------- 1 | ################################# 2 | # Development 3 | ################################# 4 | FROM node:13-alpine as build-stage 5 | 6 | WORKDIR /app 7 | 8 | COPY package*.json ./ 9 | 10 | # Install app dependencies 11 | RUN npm install -g @angular/cli 12 | RUN npm set progress=false 13 | RUN npm install 14 | 15 | # Copy all files to app folder 16 | COPY . . 17 | 18 | # Add configuration files 19 | COPY image-files/ / 20 | 21 | # Install nginx 22 | RUN apk --update add nginx 23 | 24 | # Expose port 80 25 | EXPOSE 80 26 | 27 | ENTRYPOINT ["docker-entrypoint-dev.sh"] 28 | -------------------------------------------------------------------------------- /README-zh_CN.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
2 |
3 |
4 |
5 |
Please tell me what happened in a few words, don't go into details.
30 |ハルカソラトキヘダツヒカリ
39 |请告诉我,我应该说点什么好?
48 |Please tell me what happened in a few words, don't go into details.
57 |Please tell me what happened in a few words, don't go into details.
66 |{{ item.name }}
58 |5 | 6 | 下载模版文件 7 | 8 |
9 | 10 |点击或拖动文件到此区域上传
36 |37 | 支持多次上传,每次上传的文件要么全部失败,要么全部成功导入数据。 38 |
39 |51 | {{ record.transaction?.description }} 52 | ({{ record.transaction.remark }}) 53 |
54 |来源:{{ record.source_text }}
63 |
71 | {{ record.direction === 'expense' ? '-' : '' }}
72 | {{ record.currency_code }}
73 | {{ record.currency_amount }}
74 |
${code}
`,
50 | nzOnOk: () => this.getData(),
51 | });
52 | });
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/app/routes/settings/personal/personal.component.html:
--------------------------------------------------------------------------------
1 |