@ -0,0 +1,12 @@ | |||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. | |||
# For additional information regarding the format and rule options, please see: | |||
# https://github.com/browserslist/browserslist#queries | |||
# You can see what browsers were selected by your queries by running: | |||
# npx browserslist | |||
> 0.5% | |||
last 2 versions | |||
Firefox ESR | |||
not dead | |||
not IE 9-11 # For IE 9-11 support, remove 'not'. |
@ -0,0 +1,14 @@ | |||
# Editor configuration, see http://editorconfig.org | |||
root = true | |||
[*] | |||
charset = utf-8 | |||
indent_style = space | |||
indent_size = 2 | |||
insert_final_newline = true | |||
trim_trailing_whitespace = true | |||
end_of_line = lf | |||
[*.md] | |||
max_line_length = off | |||
trim_trailing_whitespace = false |
@ -0,0 +1,177 @@ | |||
{ | |||
"root": true, | |||
"ignorePatterns": [ | |||
"src/test.ts", | |||
"**/*.spec.ts", | |||
"projects/**/*" | |||
], | |||
"overrides": [ | |||
{ | |||
"files": [ | |||
"*.ts" | |||
], | |||
"parserOptions": { | |||
"project": [ | |||
"tsconfig.json" | |||
], | |||
"createDefaultProgram": true | |||
}, | |||
"extends": [ | |||
"plugin:@angular-eslint/recommended", | |||
"plugin:@angular-eslint/template/process-inline-templates" | |||
], | |||
"rules": { | |||
"spaced-comment": [ | |||
"error", | |||
"always", | |||
{ | |||
"line": { | |||
"markers": [ | |||
"/" | |||
], | |||
"exceptions": [ | |||
"-", | |||
"+" | |||
] | |||
}, | |||
"block": { | |||
"markers": [ | |||
"!" | |||
], | |||
"exceptions": [ | |||
"*" | |||
], | |||
"balanced": true | |||
} | |||
} | |||
], | |||
"curly": [ | |||
"error", | |||
"all" | |||
], | |||
"eol-last": "error", | |||
"guard-for-in": "error", | |||
"indent": [ | |||
"error", | |||
2, | |||
{ | |||
"SwitchCase": 1 | |||
} | |||
], | |||
"no-labels": "error", | |||
"max-len": [ | |||
"error", | |||
140, | |||
4 | |||
], | |||
"no-caller": "error", | |||
"no-bitwise": "error", | |||
"no-console": "off", | |||
"no-restricted-syntax": [ | |||
"error", | |||
{ | |||
"selector": "CallExpression[callee.object.name=\"console\"][callee.property.name!=/^(log|warn|error|info|trace)$/]", | |||
"message": "Unexpected property on console object was called" | |||
} | |||
], | |||
"no-new-wrappers": "error", | |||
"no-debugger": "error", | |||
"no-empty": "off", | |||
"no-eval": "error", | |||
"no-shadow": [ | |||
"error", | |||
{ | |||
"hoist": "functions" | |||
} | |||
], | |||
"no-throw-literal": "error", | |||
"no-fallthrough": "error", | |||
"no-trailing-spaces": "error", | |||
"no-unused-expressions": [ | |||
"error", | |||
{ | |||
"allowTernary": true | |||
} | |||
], | |||
"no-var": "error", | |||
"prefer-const": [ | |||
"error", | |||
{ | |||
"destructuring": "any", | |||
"ignoreReadBeforeAssign": false | |||
} | |||
], | |||
"quotes": [ | |||
"error", | |||
"single", | |||
{ | |||
"allowTemplateLiterals": true, | |||
"avoidEscape": true | |||
} | |||
], | |||
"radix": "error", | |||
"semi": [ | |||
"error", | |||
"always" | |||
], | |||
"eqeqeq": [ | |||
"error", | |||
"allow-null" | |||
], | |||
"camelcase": "off", | |||
"@angular-eslint/directive-selector": [ | |||
"error", | |||
{ | |||
"type": "attribute", | |||
"prefix": [ | |||
"app", | |||
"cust" | |||
], | |||
"style": "camelCase" | |||
} | |||
], | |||
"@angular-eslint/component-selector": [ | |||
"error", | |||
{ | |||
"type": "element", | |||
"prefix": [ | |||
"app", | |||
"cust" | |||
], | |||
"style": "kebab-case" | |||
} | |||
], | |||
"@angular-eslint/no-inputs-metadata-property": "error", | |||
"@angular-eslint/no-outputs-metadata-property": "error", | |||
"@angular-eslint/no-host-metadata-property": "error", | |||
"@angular-eslint/no-input-rename": "error", | |||
"@angular-eslint/no-output-rename": "error", | |||
"@angular-eslint/use-lifecycle-interface": "error", | |||
"@angular-eslint/use-pipe-transform-interface": "error", | |||
"@angular-eslint/component-class-suffix": "error", | |||
"@angular-eslint/directive-class-suffix": "error", | |||
"@angular-eslint/use-component-view-encapsulation": "off", | |||
"@angular-eslint/no-attribute-decorator": "error", | |||
"@angular-eslint/no-output-native": "error", | |||
"@angular-eslint/no-output-on-prefix": "error", | |||
"@angular-eslint/no-forward-ref": "off", | |||
"@angular-eslint/no-unused-css": "off", | |||
"@angular-eslint/contextual-lifecycle": "error", | |||
"@angular-eslint/no-pipe-impure": "error", | |||
"@angular-eslint/no-empty-lifecycle-method": [ | |||
"off" | |||
], | |||
"@angular-eslint/no-conflicting-lifecycle": "off" | |||
} | |||
}, | |||
{ | |||
"files": [ | |||
"*.html" | |||
], | |||
"extends": [ | |||
"plugin:@angular-eslint/template/recommended" | |||
], | |||
"rules": {} | |||
} | |||
] | |||
} |
@ -0,0 +1,51 @@ | |||
# See http://help.github.com/ignore-files/ for more about ignoring files. | |||
# compiled output | |||
/dist | |||
/tmp | |||
/out-tsc | |||
/doc | |||
# dependencies | |||
/node_modules | |||
# IDEs and editors | |||
/.idea | |||
.project | |||
.classpath | |||
.c9/ | |||
*.launch | |||
.settings/ | |||
*.sublime-workspace | |||
# IDE - VSCode | |||
.vscode/* | |||
!.vscode/settings.json | |||
!.vscode/tasks.json | |||
!.vscode/launch.json | |||
!.vscode/extensions.json | |||
# misc | |||
/.sass-cache | |||
/connect.lock | |||
/coverage | |||
/libpeerconnection.log | |||
npm-debug.log | |||
testem.log | |||
/typings | |||
# e2e | |||
/e2e/*.js | |||
/e2e/*.map | |||
# System Files | |||
.DS_Store | |||
Thumbs.db | |||
package-lock.json | |||
gitDiff.sh | |||
.update | |||
# SonarQube | |||
.scannerwork | |||
sonar-project.properties |
@ -0,0 +1,3 @@ | |||
registry=https://registry.npmmirror.com | |||
unsafe-perm=true | |||
@webdpt:registry=https://repo.digiwincloud.com.cn/maven/repository/npm-webdpt/ |
@ -0,0 +1,24 @@ | |||
{ | |||
"version": "0.2.0", | |||
"configurations": [ | |||
{ | |||
"type": "node", | |||
"request": "launch", | |||
"name": "Launch via NPM", | |||
"runtimeExecutable": "npm", | |||
"runtimeArgs": [ | |||
"run-script", | |||
"schematics-debug" | |||
], | |||
"stopOnEntry": true, | |||
"port": 9229, | |||
"skipFiles": [ | |||
"<node_internals>/**" | |||
], | |||
"resolveSourceMapLocations": [ | |||
"${workspaceFolder}/**", | |||
"!**/node_modules/**" | |||
], | |||
} | |||
] | |||
} |
@ -0,0 +1,3 @@ | |||
{ | |||
"typescript.tsdk": "node_modules\\typescript\\lib" | |||
} |
@ -0,0 +1,28 @@ | |||
# Ng-Web端平台 | |||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.8. | |||
需搭配nodejs 8.8以上(含npm) | |||
## Development server | |||
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. | |||
## Code scaffolding | |||
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. | |||
## Build | |||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. | |||
## Running unit tests | |||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). | |||
## Running end-to-end tests | |||
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). | |||
## Further help | |||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). |
@ -0,0 +1,200 @@ | |||
{ | |||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json", | |||
"version": 1, | |||
"newProjectRoot": "projects", | |||
"projects": { | |||
"ng-webdpt": { | |||
"root": "", | |||
"sourceRoot": "src", | |||
"projectType": "application", | |||
"architect": { | |||
"build": { | |||
"builder": "@angular-devkit/build-angular:browser", | |||
"options": { | |||
"allowedCommonJsDependencies": [ | |||
"crypto-js", | |||
"ag-grid-angular", | |||
"ag-grid-community", | |||
"@ant-design/colors", | |||
"date-fns/format", | |||
"date-fns/parse", | |||
"qs", | |||
"@webdpt/framework/themes" | |||
], | |||
"outputPath": "dist", | |||
"index": "src/index.html", | |||
"main": "src/main.ts", | |||
"tsConfig": "src/tsconfig.app.json", | |||
"polyfills": "src/polyfills.ts", | |||
"assets": [ | |||
"src/assets", | |||
"src/favicon.ico", | |||
{ | |||
"glob": "**/*", | |||
"input": "./node_modules/@webdpt/framework/assets/dw-framework", | |||
"output": "assets/dw-framework" | |||
}, | |||
{ | |||
"glob": "**/*", | |||
"input": "src/assets", | |||
"output": "assets" | |||
}, | |||
{ | |||
"glob": "**/*", | |||
"input": "./node_modules/@ant-design/icons-angular/src/inline-svg/", | |||
"output": "assets" | |||
}, | |||
"src/manifest.webmanifest" | |||
], | |||
"styles": [ | |||
"src/styles.less" | |||
], | |||
"scripts": [ | |||
"node_modules/jsencrypt/bin/jsencrypt.js" | |||
], | |||
"vendorChunk": true, | |||
"extractLicenses": false, | |||
"buildOptimizer": false, | |||
"sourceMap": true, | |||
"optimization": false, | |||
"namedChunks": true | |||
}, | |||
"configurations": { | |||
"production": { | |||
"budgets": [ | |||
{ | |||
"type": "anyComponentStyle", | |||
"maximumWarning": "6kb" | |||
} | |||
], | |||
"optimization": true, | |||
"outputHashing": "all", | |||
"sourceMap": false, | |||
"namedChunks": false, | |||
"extractLicenses": true, | |||
"vendorChunk": false, | |||
"buildOptimizer": true, | |||
"fileReplacements": [ | |||
{ | |||
"replace": "src/environments/environment.ts", | |||
"with": "src/environments/environment.prod.ts" | |||
} | |||
], | |||
"serviceWorker": true | |||
}, | |||
"service-worker-dev": { | |||
"budgets": [ | |||
{ | |||
"type": "anyComponentStyle", | |||
"maximumWarning": "6kb" | |||
} | |||
], | |||
"outputHashing": "all", | |||
"namedChunks": false, | |||
"extractLicenses": true, | |||
"vendorChunk": false, | |||
"serviceWorker": true | |||
}, | |||
"development": { | |||
"buildOptimizer": false, | |||
"optimization": false, | |||
"vendorChunk": true, | |||
"extractLicenses": false, | |||
"sourceMap": true, | |||
"namedChunks": true | |||
} | |||
}, | |||
"defaultConfiguration": "production" | |||
}, | |||
"serve": { | |||
"builder": "@angular-devkit/build-angular:dev-server", | |||
"options": { | |||
"browserTarget": "ng-webdpt:build:development" | |||
}, | |||
"configurations": { | |||
"production": { | |||
"browserTarget": "ng-webdpt:build:production" | |||
} | |||
} | |||
}, | |||
"extract-i18n": { | |||
"builder": "@angular-devkit/build-angular:extract-i18n", | |||
"options": { | |||
"browserTarget": "ng-webdpt:build" | |||
} | |||
}, | |||
"test": { | |||
"builder": "@angular-devkit/build-angular:karma", | |||
"options": { | |||
"main": "src/test.ts", | |||
"karmaConfig": "./karma.conf.js", | |||
"polyfills": "src/polyfills.ts", | |||
"tsConfig": "src/tsconfig.spec.json", | |||
"scripts": [ | |||
"node_modules/jsencrypt/bin/jsencrypt.js" | |||
], | |||
"styles": [ | |||
"src/styles.less" | |||
], | |||
"assets": [ | |||
"src/assets", | |||
"src/favicon.ico", | |||
{ | |||
"glob": "**/*", | |||
"input": "./node_modules/@webdpt/framework/assets/dw-framework", | |||
"output": "assets/dw-framework" | |||
}, | |||
{ | |||
"glob": "**/*", | |||
"input": "src/assets", | |||
"output": "assets" | |||
}, | |||
{ | |||
"glob": "**/*", | |||
"input": "./node_modules/@ant-design/icons-angular/src/inline-svg/", | |||
"output": "assets" | |||
}, | |||
"src/manifest.webmanifest" | |||
] | |||
} | |||
}, | |||
"e2e": { | |||
"builder": "@angular-devkit/build-angular:protractor", | |||
"options": { | |||
"protractorConfig": "e2e/protractor.conf.js", | |||
"devServerTarget": "ng-webdpt:serve" | |||
}, | |||
"configurations": { | |||
"production": { | |||
"devServerTarget": "ng-webdpt:serve:production" | |||
} | |||
} | |||
}, | |||
"lint": { | |||
"builder": "@angular-eslint/builder:lint", | |||
"options": { | |||
"lintFilePatterns": [ | |||
"src/**/*.ts", | |||
"src/**/*.html" | |||
] | |||
} | |||
} | |||
} | |||
} | |||
}, | |||
"defaultProject": "ng-webdpt", | |||
"schematics": { | |||
"@schematics/angular:component": { | |||
"prefix": "app", | |||
"style": "less" | |||
}, | |||
"@schematics/angular:directive": { | |||
"prefix": "app" | |||
} | |||
}, | |||
"cli": { | |||
"warnings": {}, | |||
"analytics": false, | |||
"defaultCollection": "@angular-eslint/schematics" | |||
} | |||
} |
@ -0,0 +1,23 @@ | |||
import { AppPage } from './app.po'; | |||
import { browser, logging } from 'protractor'; | |||
describe('workspace-project App', () => { | |||
let page: AppPage; | |||
beforeEach(() => { | |||
page = new AppPage(); | |||
}); | |||
it('should display welcome message', () => { | |||
page.navigateTo(); | |||
expect(page.getTitleText()).toEqual(''); | |||
}); | |||
afterEach(async () => { | |||
// Assert that there are no errors emitted from the browser | |||
const logs = await browser.manage().logs().get(logging.Type.BROWSER); | |||
expect(logs).not.toContain(jasmine.objectContaining({ | |||
level: logging.Level.SEVERE, | |||
} as logging.Entry)); | |||
}); | |||
}); |
@ -0,0 +1,11 @@ | |||
import { browser, by, element } from 'protractor'; | |||
export class AppPage { | |||
navigateTo(): Promise<any> { | |||
return browser.get(browser.baseUrl) as Promise<any>; | |||
} | |||
getTitleText(): Promise<string> { | |||
return element(by.css('app-root')).getText() as Promise<string>; | |||
} | |||
} |
@ -0,0 +1,13 @@ | |||
{ | |||
"extends": "../tsconfig.json", | |||
"compilerOptions": { | |||
"outDir": "../out-tsc/e2e", | |||
"module": "commonjs", | |||
"target": "es2015", | |||
"types": [ | |||
"jasmine", | |||
"jasminewd2", | |||
"node" | |||
] | |||
} | |||
} |
@ -0,0 +1,36 @@ | |||
// Karma configuration file, see link for more information | |||
// https://karma-runner.github.io/1.0/config/configuration-file.html | |||
module.exports = function (config) { | |||
config.set({ | |||
basePath: '', | |||
frameworks: ['jasmine', '@angular-devkit/build-angular'], | |||
plugins: [ | |||
require('karma-jasmine'), | |||
require('karma-chrome-launcher'), | |||
require('karma-jasmine-html-reporter'), | |||
require('karma-coverage'), | |||
require('@angular-devkit/build-angular/plugins/karma') | |||
], | |||
client: { | |||
clearContext: false // leave Jasmine Spec Runner output visible in browser | |||
}, | |||
coverageReporter: { | |||
dir: require('path').join(__dirname, './coverage/ng-webdpt'), | |||
subdir: '.', | |||
reporters: [ | |||
{ type: 'html' }, | |||
{ type: 'lcovonly' }, | |||
{ type: 'text-summary' } | |||
] | |||
}, | |||
reporters: ['progress', 'kjhtml'], | |||
port: 9876, | |||
colors: true, | |||
logLevel: config.LOG_INFO, | |||
autoWatch: true, | |||
browsers: ['ChromeHeadless'], | |||
singleRun: false, | |||
restartOnFileChange: true | |||
}); | |||
}; |
@ -0,0 +1,10 @@ | |||
module.exports = { | |||
packages: { | |||
'@webdpt/components': { | |||
ignorableDeepImportMatchers: [ | |||
/ng-quicksilver\/date-picker\/standard-types/, | |||
/iv-viewer\// | |||
] | |||
} | |||
}, | |||
}; |
@ -0,0 +1,39 @@ | |||
{ | |||
"index": "/index.html", | |||
"assetGroups": [ | |||
{ | |||
"name": "app", | |||
"installMode": "lazy", | |||
"resources": { | |||
"files": [ | |||
"/favicon.ico", | |||
"/index.html", | |||
"/*.css", | |||
"/*.js" | |||
] | |||
} | |||
}, { | |||
"name": "assets", | |||
"installMode": "lazy", | |||
"updateMode": "lazy", | |||
"resources": { | |||
"files": [ | |||
"/assets/**", | |||
"!/assets/**/*.json" | |||
] | |||
} | |||
} | |||
], | |||
"dataGroups": [ | |||
{ | |||
"name": "app", | |||
"urls": ["**"], | |||
"cacheConfig": { | |||
"strategy": "freshness", | |||
"maxSize": 0, | |||
"maxAge": "0u", | |||
"timeout": "3s" | |||
} | |||
} | |||
] | |||
} |
@ -0,0 +1,127 @@ | |||
{ | |||
"name": "ng-webdpt", | |||
"version": "0.0.0", | |||
"license": "MIT", | |||
"scripts": { | |||
"postinstall": "npx patch-package@6.5.1 && ngcc", | |||
"ng": "ng", | |||
"start": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng serve", | |||
"start-prod": "ng serve --configuration production", | |||
"build": "ng build", | |||
"test": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng test", | |||
"framework-test": "ng test @webdpt/framework --code-coverage --watch", | |||
"components-test": "ng test @webdpt/components --code-coverage --watch", | |||
"mfa-app-test": "ng test @webdpt/mfa-app --code-coverage --watch", | |||
"lint": "ng lint ng-webdpt", | |||
"e2e": "ng e2e", | |||
"buildCss": "node themeCssBuild", | |||
"generate-i18n-files": "ngx-translate-extract -i ./src -o ./src/i18n/default-en.json --clean --sort --format namespaced-json", | |||
"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --configuration production && node node_modules/@webdpt/scripts/builds/replace-sw.js && npm run dw-zip", | |||
"doc:build": "compodoc -p src/tsconfig.app.json -d ./doc", | |||
"doc:serve": "compodoc -s -r 4201 -d ./doc", | |||
"doc:buildandserve": "compodoc -p ./tsconfig.json -s -r 4201 -d ./doc", | |||
"sonar": "sonar-scanner", | |||
"gmc": "node node_modules/@webdpt/scripts/builds/generate.js", | |||
"dw-zip": "node node_modules/@webdpt/scripts/builds/dw-zip.js" | |||
}, | |||
"private": true, | |||
"dependencies": { | |||
"@angular-architects/module-federation": "^12.2.0", | |||
"@angular/animations": "12.2.16", | |||
"@angular/cdk": "^12.1.0", | |||
"@angular/common": "12.2.16", | |||
"@angular/compiler": "12.2.16", | |||
"@angular/core": "12.2.16", | |||
"@angular/forms": "12.2.16", | |||
"@angular/platform-browser": "12.2.16", | |||
"@angular/platform-browser-dynamic": "12.2.16", | |||
"@angular/router": "12.2.16", | |||
"@angular/service-worker": "12.2.16", | |||
"@ant-design/icons-angular": "^12.0.3", | |||
"@ng-dynamic-forms/core": "^14.0.0", | |||
"@ngx-translate/core": "^13.0.0", | |||
"@ngx-translate/http-loader": "^6.0.0", | |||
"@types/requirejs": "^2.1.31", | |||
"@webdpt/analytics": "5.2.11-1000", | |||
"@webdpt/components": "5.2.11-1000", | |||
"@webdpt/framework-js": "5.2.11-1000", | |||
"@webdpt/framework": "5.2.11-1000", | |||
"@webdpt/iv-viewer": "2.0.1", | |||
"@webdpt/programs": "5.2.11-1000", | |||
"ag-grid-angular": "^26.0.0", | |||
"ag-grid-community": "^26.0.0", | |||
"angular-gridster2": "^12.0.0", | |||
"angular-in-memory-web-api": "^0.9.0", | |||
"axios": "^1.4.0", | |||
"classlist.js": "1.1.20150312", | |||
"core-js": "^3.8.0", | |||
"crypto-js": "^3.1.9-1", | |||
"date-fns": "^2.10.0", | |||
"fast-deep-equal": "^3.1.3", | |||
"i18next": "^22.5.1", | |||
"injection-js": "^2.4.0", | |||
"jsencrypt": "^3.0.0-rc.1", | |||
"moment": "2.24.0", | |||
"ng-zorro-antd": "https://repo.digiwincloud.com.cn/maven/repository/npm-webdpt/ng-zorro-antd/-/ng-zorro-antd-12.1.1-1000.tgz", | |||
"ngx-color": "5.1.3", | |||
"ngx-highlightjs": "^2.1.1", | |||
"ngx-mask": "^12.0.0", | |||
"resize-observer-polyfill": "^1.5.1", | |||
"rrule": "2.6.0", | |||
"rxjs": "~6.6.0", | |||
"sonarqube-scanner": "^2.4.1", | |||
"tslint-sonarts": "^1.9.0", | |||
"web-animations-js": "^2.3.2" | |||
}, | |||
"devDependencies": { | |||
"@angular-devkit/build-angular": "12.2.16", | |||
"@angular-devkit/core": "12.2.16", | |||
"@angular-devkit/schematics": "12.2.16", | |||
"@angular-devkit/schematics-cli": "12.2.16", | |||
"@angular-eslint/builder": "^12.7.0", | |||
"@angular-eslint/eslint-plugin": "^12.7.0", | |||
"@angular-eslint/eslint-plugin-template": "^12.7.0", | |||
"@angular-eslint/schematics": "^12.7.0", | |||
"@angular-eslint/template-parser": "^12.7.0", | |||
"@angular/cli": "12.2.16", | |||
"@angular/compiler-cli": "12.2.16", | |||
"@angular/language-service": "12.2.16", | |||
"@biesbjerg/ngx-translate-extract": "^2.3.4", | |||
"@compodoc/compodoc": "^1.1.3", | |||
"@phenomnomnominal/tsquery": "^4.1.0", | |||
"@schematics/angular": "12.2.16", | |||
"@schematics/update": "0.1102.12", | |||
"@types/jasmine": "~3.6.0", | |||
"@types/jasminewd2": "~2.0.3", | |||
"@types/node": "^12.11.1", | |||
"@typescript-eslint/eslint-plugin": "4.28.2", | |||
"@typescript-eslint/parser": "4.28.2", | |||
"@webdpt/schematics": "5.2.11-1000", | |||
"@webdpt/scripts": "5.2.11-1000", | |||
"@webdpt/tslint-rules": "5.2.11-1000", | |||
"archiver": "5.3.1", | |||
"codelyzer": "^6.0.0", | |||
"commander": "^5.1.0", | |||
"cpx": "^1.5.0", | |||
"eslint": "^7.26.0", | |||
"inquirer": "^7.3.0", | |||
"jasmine-core": "~3.8.0", | |||
"jasmine-spec-reporter": "~5.0.0", | |||
"karma": "~6.3.15", | |||
"karma-chrome-launcher": "~3.1.0", | |||
"karma-coverage": "~2.0.3", | |||
"karma-jasmine": "~4.0.0", | |||
"karma-jasmine-html-reporter": "^1.5.0", | |||
"less": "^3.10.3", | |||
"ng-packagr": "^12.1.1", | |||
"protractor": "~7.0.0", | |||
"qs": "^6.11.2", | |||
"raw-loader": "0.5.1", | |||
"ts-node": "~7.0.0", | |||
"tslib": "^2.0.0", | |||
"tslint": "~6.1.0", | |||
"typescript": "~4.3.5", | |||
"webpack-bundle-analyzer": "^3.7.0", | |||
"zone.js": "~0.11.4" | |||
} | |||
} |
@ -0,0 +1,24 @@ | |||
diff --git a/node_modules/@schematics/update/migrate/schema.json b/node_modules/@schematics/update/migrate/schema.json | |||
index 58fca36..257ee01 100644 | |||
--- a/node_modules/@schematics/update/migrate/schema.json | |||
+++ b/node_modules/@schematics/update/migrate/schema.json | |||
@@ -1,6 +1,6 @@ | |||
{ | |||
"$schema": "http://json-schema.org/schema", | |||
- "id": "PostUpdateSchema", | |||
+ "$id": "PostUpdateSchema", | |||
"type": "object", | |||
"properties": { | |||
"package": { | |||
diff --git a/node_modules/@schematics/update/update/schema.json b/node_modules/@schematics/update/update/schema.json | |||
index d921b9d..465cf9e 100644 | |||
--- a/node_modules/@schematics/update/update/schema.json | |||
+++ b/node_modules/@schematics/update/update/schema.json | |||
@@ -1,6 +1,6 @@ | |||
{ | |||
"$schema": "http://json-schema.org/schema", | |||
- "id": "SchematicsUpdateSchema", | |||
+ "$id": "SchematicsUpdateSchema", | |||
"title": "Schematic Options Schema", | |||
"type": "object", | |||
"properties": { |
@ -0,0 +1,9 @@ | |||
{ | |||
"envType": "angular", | |||
"dap": { | |||
"enabled": true | |||
}, | |||
"athena": { | |||
"enabled": false | |||
} | |||
} |
@ -0,0 +1,20 @@ | |||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. | |||
# For additional information regarding the format and rule options, please see: | |||
# https://github.com/browserslist/browserslist#queries | |||
# You can see what browsers were selected by your queries by running: | |||
# npx browserslist | |||
#> 0.5% | |||
#last 2 versions | |||
#Firefox ESR | |||
#not dead | |||
#not IE 9-11 # For IE 9-11 support, remove 'not'. | |||
last 1 Chrome version | |||
last 1 Firefox version | |||
last 2 Edge major versions | |||
last 2 Safari major versions | |||
last 2 iOS major versions | |||
Firefox ESR | |||
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. |
@ -0,0 +1,35 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { RouterModule, Routes } from '@angular/router'; | |||
import { PageNotFoundComponent } from './page-not-found.component'; | |||
const routes: Routes = [ | |||
{ | |||
path: '', | |||
pathMatch: 'prefix', | |||
loadChildren: (): Promise<any> => import('./implementation/implementation.module').then(m => m.ImplementationModule) | |||
}, | |||
{ | |||
path: '**', | |||
component: PageNotFoundComponent | |||
} | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
RouterModule.forRoot( | |||
routes, | |||
{ relativeLinkResolution: 'legacy' } | |||
// , { enableTracing: true } // debugging purposes only | |||
), | |||
], | |||
declarations: [ | |||
PageNotFoundComponent | |||
], | |||
exports: [ | |||
RouterModule | |||
] | |||
}) | |||
export class AppRoutingModule { | |||
} |
@ -0,0 +1,29 @@ | |||
import { TestBed, waitForAsync } from '@angular/core/testing'; | |||
import { RouterTestingModule } from '@angular/router/testing'; | |||
import { DwLanguageService } from '@webdpt/framework/language'; | |||
import { of } from 'rxjs/internal/observable/of'; | |||
import { AppComponent } from './app.component'; | |||
describe('AppComponent', () => { | |||
beforeEach(waitForAsync(() => { | |||
TestBed.configureTestingModule({ | |||
imports: [ | |||
RouterTestingModule | |||
], | |||
providers: [ | |||
{ provide: DwLanguageService, useValue: { | |||
currentLanguage: 'zh_TW', | |||
setUp: (lan: string): void => { }, | |||
language$: of('zh_TW') | |||
} } | |||
], | |||
declarations: [ | |||
AppComponent | |||
], | |||
}).compileComponents(); | |||
})); | |||
it('should create the app', waitForAsync(() => { | |||
const fixture = TestBed.createComponent(AppComponent); | |||
const app = fixture.debugElement.componentInstance; | |||
expect(app).toBeTruthy(); | |||
})); | |||
}); |
@ -0,0 +1,13 @@ | |||
import { Component } from '@angular/core'; | |||
import { DwLanguageService } from '@webdpt/framework/language'; | |||
@Component({ | |||
selector: 'app-root', | |||
template: ` | |||
<router-outlet></router-outlet> | |||
`, | |||
styleUrls: ['./app.component.css'] | |||
}) | |||
export class AppComponent { | |||
constructor(langService: DwLanguageService) {} | |||
} |
@ -0,0 +1,42 @@ | |||
import { BrowserModule } from "@angular/platform-browser"; | |||
import { NgModule } from "@angular/core"; | |||
import { HttpClientJsonpModule, HttpClientModule } from "@angular/common/http"; | |||
import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; | |||
import { AppComponent } from "./app.component"; | |||
import { AppRoutingModule } from "./app-routing.module"; | |||
import { FrameworkModule } from "@webdpt/framework"; | |||
import { FrameworkUICoreModule } from "@webdpt/components/providers"; | |||
import { DwServiceWorkerModule } from "@webdpt/framework/service-worker"; | |||
import { DwDapModule } from "@webdpt/framework/dap"; | |||
import { DwProgramsModule } from "@webdpt/programs"; | |||
import { ImplementationModule } from "./implementation/implementation.module"; | |||
import { SYSTEM_CONFIG } from "./config/system-config"; | |||
import { SystemModule } from "./config/system.module"; | |||
import { environment } from "../environments/environment"; | |||
@NgModule({ | |||
imports: [ | |||
BrowserModule, | |||
BrowserAnimationsModule, | |||
AppRoutingModule, | |||
HttpClientModule, | |||
HttpClientJsonpModule, | |||
/** ************* 端平台 ***************/ | |||
FrameworkModule.forRoot([], SYSTEM_CONFIG), | |||
FrameworkUICoreModule.forRoot(), | |||
// --------------------------------------------------------- | |||
// | 選配 | |||
// --------------------------------------------------------- | |||
DwDapModule, // DAP平台 | |||
// DwProgramsModule, // 平台作業 | |||
SystemModule.forRoot([]), | |||
ImplementationModule.forRoot([]), | |||
// DwServiceWorkerModule.forRoot(60 * 60 * 1000, environment.production), | |||
], | |||
declarations: [AppComponent], | |||
providers: [], | |||
bootstrap: [AppComponent], | |||
}) | |||
export class AppModule {} |
@ -0,0 +1,9 @@ | |||
/* eslint-disable quotes */ | |||
/** | |||
* IAM 的 digi-middleware-auth-app [各應用系統的AppToken]. | |||
*/ | |||
// eslint-disable-next-line max-len | |||
export const DigiMiddlewareAuthApp = | |||
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IkF0aGVuYSIsInNpZCI6MTYzNjc3NzI1NzgyNTkyfQ.3QLTPVKsk2Mp3j_aQ3X8bQW1wCJMNWeCkL6VPoK352c"; | |||
// export const DigiMiddlewareAuthUser = "981dc293-8ccd-470f-9e36-99ba30af1324"; | |||
export const DigiMiddlewareAuthUser = "66f9ca43-efdc-4f35-b7a1-fc56852ba3a6"; |
@ -0,0 +1,62 @@ | |||
import { DigiMiddlewareAuthApp } from './app-auth-token'; | |||
import { IDWDmcUserInfo } from '@webdpt/framework/config'; | |||
// 開發環境變數 | |||
export const SYSTEM_CONFIG: IAppConfig = { | |||
dwAppId: 'Athena', | |||
dwAppName: '数智未来峰会', | |||
defaultApp: '/', | |||
dwLogoPath: './assets/img/dwLogo.svg', | |||
dwDateFormat: 'yyyy/MM/dd', | |||
dwTimeFormat: 'HH:mm:ss', | |||
dwUsingTab: false, | |||
dwTabMultiOpen: false, | |||
defaultLogin: '/login', | |||
dwAppAuthToken: DigiMiddlewareAuthApp, | |||
dwLoadMaskHttp: true, | |||
dwLoadMaskDelay: 0, | |||
dwDmcUserInfo: { | |||
username: '', | |||
password: '' | |||
}, | |||
dwTabStoreStrategy: 'session' | |||
}; | |||
export interface IAppConfig { | |||
dwAppId: string; // Application ID(對應到互聯應用管理中心) | |||
dwAppName: string; // Application NAME(對應到互聯應用管理中心) | |||
defaultApp: string; // 首頁路徑 | |||
dwLogoPath: string; // Logo圖檔路徑 | |||
dwDateFormat: string; // 日期格式 | |||
dwTimeFormat: string; // 時間格式 | |||
dwUsingTab: boolean; // 是否啟用多頁佈局 | |||
dwTabMultiOpen: boolean; // 多頁佈局預設是否可重覆開啟作業 | |||
defaultLogin: string; // 登入頁路徑 | |||
dwAppAuthToken: string; // IAM 的 digi-middleware-auth-app [各應用系統的AppToken]. | |||
dwLoadMaskHttp: boolean; // HTTP加載遮罩是否啟用 | |||
dwLoadMaskDelay: number; // 延遲顯示加載效果的時間毫秒 | |||
dwDmcUserInfo: IDWDmcUserInfo; // 文檔中心的登入帳密 | |||
dwTabStoreStrategy?: 'session' | 'local' | 'none'; // 多頁籤儲存策略 | |||
} | |||
function loadJSON(filePath: string): any { | |||
const json = loadTextFileAjaxSync(filePath, 'application/json'); | |||
const obj = JSON.parse(json); | |||
return obj; | |||
} | |||
function loadTextFileAjaxSync(filePath: string, mimeType: string): string { | |||
const xmlhttp = new XMLHttpRequest(); | |||
xmlhttp.open('GET', filePath, false); | |||
if (mimeType != null) { | |||
if (xmlhttp.overrideMimeType) { | |||
xmlhttp.overrideMimeType(mimeType); | |||
} | |||
} | |||
xmlhttp.send(); | |||
if (xmlhttp.status === 200) { | |||
return xmlhttp.responseText; | |||
} else { | |||
return null; | |||
} | |||
} |
@ -0,0 +1,35 @@ | |||
import { ModuleWithProviders, NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { Provider } from '@angular/compiler/src/core'; | |||
import { DwMockModule } from '@webdpt/framework/mock'; | |||
import { DW_MOCK, DW_APP_AUTH_TOKEN } from '@webdpt/framework/config'; | |||
import { environment } from '../../environments/environment'; | |||
import { DigiMiddlewareAuthApp } from './app-auth-token'; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
DwMockModule | |||
], | |||
declarations: [] | |||
}) | |||
export class SystemModule { | |||
static forRoot(providers: Provider[]): ModuleWithProviders<SystemModule> { | |||
return { | |||
ngModule: SystemModule, | |||
providers: [ | |||
{ | |||
provide: DW_MOCK, | |||
useValue: environment.mock | |||
}, | |||
{ | |||
provide: DW_APP_AUTH_TOKEN, | |||
useValue: DigiMiddlewareAuthApp | |||
}, | |||
...providers | |||
] | |||
}; | |||
} | |||
} |
@ -0,0 +1,11 @@ | |||
import { Routes } from '@angular/router'; | |||
import { IMPLEMENTATION_ROUTES } from '../implementation/implementation-routes'; | |||
export const CUSTOMIZATION_ROUTES: Routes = [ | |||
// 設定客製應用模組路由 | |||
// 應用開發應用模組路由 | |||
...IMPLEMENTATION_ROUTES | |||
]; |
@ -0,0 +1,10 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { Routes, RouterModule } from '@angular/router'; | |||
const routes: Routes = []; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule] | |||
}) | |||
export class CustomizationRoutingModule { } |
@ -0,0 +1,13 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { CustomizationRoutingModule } from './customization-routing.module'; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
CustomizationRoutingModule | |||
], | |||
declarations: [] | |||
}) | |||
export class CustomizationModule { } |
@ -0,0 +1,26 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { RouterModule, Routes } from '@angular/router'; | |||
import { ForgetComponent } from './forget.component'; | |||
const routes: Routes = [ | |||
{ | |||
path: '', | |||
component: ForgetComponent, | |||
pathMatch: 'prefix', | |||
data: { | |||
dwRouteData: { | |||
programId: 'dw-forget' | |||
} | |||
} | |||
} | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
RouterModule.forChild(routes) | |||
], | |||
exports: [RouterModule] | |||
}) | |||
export class ForgetRoutingModule { | |||
} |
@ -0,0 +1,20 @@ | |||
.forget-bg { | |||
background-color: rgba(0, 21, 41, 1); | |||
min-height: 100vh; | |||
} | |||
.forget-logo { | |||
margin-bottom: 10px; | |||
padding-top: 100px; | |||
} | |||
.forget-copyright { | |||
text-align: center; | |||
padding-bottom: 1rem; | |||
} | |||
.forget-copyright span { | |||
font-size: 14px; | |||
} | |||
span { | |||
color: white; | |||
} |
@ -0,0 +1,19 @@ | |||
<div nz-row class="forget-bg"> | |||
<div nz-col [nzSpan]="24" class="forget-content"> | |||
<div nz-row class="forget-main-block"> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'"> | |||
</div> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'6'" [nzLg]="'6'"> | |||
<img class="forget-logo" src="{{dwLogoPath | translate}}"> | |||
<dw-forget-block [verificationType]="verificationType"></dw-forget-block> | |||
</div> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'"> | |||
</div> | |||
</div> | |||
<div nz-row class="forget-copyright-block"> | |||
<div nz-col [nzSpan]="24" class="forget-copyright"> | |||
<span>© Data Systems Consulting Co., Ltd. All rights reserved.</span> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@ -0,0 +1,82 @@ | |||
import { Component, Injectable, Input, Pipe, PipeTransform } from '@angular/core'; | |||
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; | |||
import { RouterTestingModule } from '@angular/router/testing'; | |||
import { TranslatePipe, TranslateService } from '@ngx-translate/core'; | |||
import { DwForgetModule } from '@webdpt/components/user/forget-block'; | |||
import { Logo_Path } from '@webdpt/framework/config'; | |||
import { Observable } from 'rxjs/internal/Observable'; | |||
import { of } from 'rxjs/internal/observable/of'; | |||
import { ForgetComponent } from './forget.component'; | |||
import { ForgetModule } from './forget.module'; | |||
describe('ForgetComponent', () => { | |||
let component: ForgetComponent; | |||
let fixture: ComponentFixture<ForgetComponent>; | |||
beforeEach(waitForAsync(() => { | |||
TestBed.configureTestingModule({ | |||
imports: [ | |||
ForgetModule, | |||
RouterTestingModule | |||
], | |||
providers: [ | |||
{ provide: TranslateService, useClass: TranslateServiceStub }, | |||
{ provide: TranslatePipe, useClass: TranslatePipeMock }, | |||
{ provide: Logo_Path, useValue: '/mock-logo-path' } | |||
], | |||
declarations: [ForgetComponent] | |||
}) | |||
.overrideModule(DwForgetModule, | |||
{ | |||
set: { | |||
imports: [], | |||
declarations: [MockDwForgetBlockComponent], | |||
exports: [MockDwForgetBlockComponent] | |||
} | |||
}) | |||
.compileComponents(); | |||
})); | |||
beforeEach(() => { | |||
fixture = TestBed.createComponent(ForgetComponent); | |||
component = fixture.componentInstance; | |||
fixture.detectChanges(); | |||
}); | |||
it('should create', () => { | |||
expect(component).toBeTruthy(); | |||
}); | |||
}); | |||
@Pipe({ | |||
name: 'translate' | |||
}) | |||
export class TranslatePipeMock implements PipeTransform { | |||
public name = 'translate'; | |||
public transform(query: string, ...args: any[]): any { | |||
return query; | |||
} | |||
} | |||
@Injectable() | |||
export class TranslateServiceStub { | |||
public instant(key: string, interpolateParams?: Object): string { | |||
return key; | |||
} | |||
public get<T>(key: T): Observable<T> { | |||
return of(key); | |||
} | |||
public onTranslationChange = of({ lang: 'TW' }); | |||
public onLangChange = of({ translations: null }); | |||
public onDefaultLangChange = of(true); | |||
public currentLang = 'zh_TW'; | |||
} | |||
@Component({ | |||
selector: 'dw-forget-block', | |||
template: ` | |||
<div>MockDwForgetBlockComponent</div> | |||
` | |||
}) | |||
export class MockDwForgetBlockComponent { | |||
@Input() verificationType: any; | |||
} |
@ -0,0 +1,26 @@ | |||
import { Component, Inject, OnInit } from '@angular/core'; | |||
import { Logo_Path } from '@webdpt/framework/config'; | |||
import { IDwForgetverificationType } from '@webdpt/framework/account'; | |||
@Component({ | |||
selector: 'app-forget', | |||
templateUrl: './forget.component.html', | |||
styleUrls: ['./forget.component.css'] | |||
}) | |||
export class ForgetComponent implements OnInit { | |||
verificationType: Array<IDwForgetverificationType> = []; | |||
constructor( | |||
@Inject(Logo_Path) public dwLogoPath: string | |||
) { } | |||
ngOnInit(): void { | |||
this.verificationType = [ | |||
IDwForgetverificationType.EMAIL, | |||
IDwForgetverificationType.MOBILEPHONE | |||
]; | |||
} | |||
} |
@ -0,0 +1,25 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { SharedModule } from '../../shared/shared.module'; | |||
import { ForgetRoutingModule } from './forget-routing.module'; | |||
import { ForgetComponent } from './forget.component'; | |||
import { DwForgetModule } from '@webdpt/components/user/forget-block'; | |||
import { NzGridModule } from 'ng-zorro-antd/grid'; | |||
import { TranslateModule } from '@ngx-translate/core'; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
ForgetRoutingModule, | |||
SharedModule, | |||
DwForgetModule, | |||
NzGridModule, | |||
TranslateModule | |||
], | |||
declarations: [ | |||
ForgetComponent | |||
] | |||
}) | |||
export class ForgetModule { } |
@ -0,0 +1,34 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { RouterModule, Routes } from '@angular/router'; | |||
import { LoginComponent } from './login/login.component'; | |||
const routes: Routes = [ | |||
{ | |||
path: '', | |||
component: LoginComponent, | |||
pathMatch: 'prefix', | |||
data: { | |||
dwRouteData: { | |||
programId: 'dw-login' | |||
} | |||
} | |||
}, | |||
// { | |||
// path: 'register', | |||
// component: RegisterComponent | |||
// }, | |||
// { | |||
// path: 'forgot', | |||
// component: ForgotComponent | |||
// } | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
RouterModule.forChild(routes) | |||
], | |||
exports: [RouterModule] | |||
}) | |||
export class LoginRoutingModule { | |||
} |
@ -0,0 +1,24 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { SharedModule } from '../shared/shared.module'; | |||
import { LoginRoutingModule } from './login-routing.module'; | |||
import { LoginComponent } from './login/login.component'; | |||
import { DwLoginModule } from '@webdpt/components/login'; | |||
import { NzGridModule } from 'ng-zorro-antd/grid'; | |||
import { TranslateModule } from '@ngx-translate/core'; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
LoginRoutingModule, | |||
SharedModule, | |||
DwLoginModule, | |||
NzGridModule, | |||
TranslateModule | |||
], | |||
declarations: [ | |||
LoginComponent | |||
] | |||
}) | |||
export class LoginModule { } |
@ -0,0 +1,30 @@ | |||
.login-bg { | |||
background-color: rgba(0, 21, 41, 1); | |||
height: 100%; | |||
padding-top: 100px; | |||
} | |||
.login-logo { | |||
margin-bottom: 10px; | |||
} | |||
.login-form { | |||
min-width: 250px; | |||
} | |||
.login-form-forgot { | |||
float: right; | |||
} | |||
.login-form-button { | |||
width: 100%; | |||
} | |||
.login-copyright { | |||
text-align: center; | |||
} | |||
.login-copyright span { | |||
font-size: 14px; | |||
} | |||
span { | |||
color: white; | |||
} |
@ -0,0 +1,19 @@ | |||
<div nz-row class="login-bg"> | |||
<div nz-col nzSpan="24" class="login-content"> | |||
<div nz-row class="login-main-block"> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'"> | |||
</div> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'6'" [nzLg]="'6'" style="z-index: 1"> | |||
<img class="login-logo" src="{{dwLogoPath | translate}}"> | |||
<dw-login-block [showRemember]="true" [showLanguage]="true"></dw-login-block> | |||
</div> | |||
<div nz-col [nzXs]="'8'" [nzSm]="'8'" [nzMd]="'9'" [nzLg]="'9'"> | |||
</div> | |||
</div> | |||
<div nz-row class="login-copyright-block" nzJustify="center"> | |||
<div nz-col nzSpan="24" class="login-copyright"> | |||
<span>© Data Systems Consulting Co., Ltd. All rights reserved.</span> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@ -0,0 +1,84 @@ | |||
import { Component, Injectable, Input, Pipe, PipeTransform } from '@angular/core'; | |||
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; | |||
import { RouterTestingModule } from '@angular/router/testing'; | |||
import { TranslatePipe, TranslateService } from '@ngx-translate/core'; | |||
import { DwLoginModule } from '@webdpt/components/login'; | |||
import { Logo_Path } from '@webdpt/framework/config'; | |||
import { Observable } from 'rxjs/internal/Observable'; | |||
import { of } from 'rxjs/internal/observable/of'; | |||
import { LoginModule } from '../login.module'; | |||
import { LoginComponent } from './login.component'; | |||
describe('LoginComponent', () => { | |||
let component: LoginComponent; | |||
let fixture: ComponentFixture<LoginComponent>; | |||
beforeEach(waitForAsync(() => { | |||
TestBed.configureTestingModule({ | |||
imports: [ | |||
LoginModule, | |||
RouterTestingModule | |||
], | |||
providers: [ | |||
{ provide: TranslateService, useClass: TranslateServiceStub }, | |||
{ provide: TranslatePipe, useClass: TranslatePipeMock }, | |||
{ provide: Logo_Path, useValue: '/mock-logo-path' } | |||
], | |||
declarations: [LoginComponent] | |||
}) | |||
.overrideModule(DwLoginModule, { | |||
set: { | |||
imports: [], | |||
declarations: [MockLoginComponent], | |||
exports: [MockLoginComponent] | |||
} | |||
}) | |||
.compileComponents(); | |||
})); | |||
beforeEach(() => { | |||
fixture = TestBed.createComponent(LoginComponent); | |||
component = fixture.componentInstance; | |||
fixture.detectChanges(); | |||
}); | |||
it('should create', () => { | |||
expect(component).toBeTruthy(); | |||
}); | |||
}); | |||
@Pipe({ | |||
name: 'translate' | |||
}) | |||
export class TranslatePipeMock implements PipeTransform { | |||
public name = 'translate'; | |||
public transform(query: string, ...args: any[]): any { | |||
return query; | |||
} | |||
} | |||
@Injectable() | |||
export class TranslateServiceStub { | |||
public instant(key: string, interpolateParams?: Object): string { | |||
return key; | |||
} | |||
public get<T>(key: T): Observable<T> { | |||
return of(key); | |||
} | |||
public onTranslationChange = of({ lang: 'TW' }); | |||
public onLangChange = of({ translations: null }); | |||
public onDefaultLangChange = of(true); | |||
public currentLang = 'zh_TW'; | |||
} | |||
@Component({ | |||
selector: 'dw-login-block', | |||
template: ` | |||
<div>mockLoginComponent</div> | |||
` | |||
}) | |||
export class MockLoginComponent { | |||
@Input() showRemember; | |||
@Input() showLanguage; | |||
} | |||
@ -0,0 +1,16 @@ | |||
import { Component, Inject, OnInit } from '@angular/core'; | |||
import { Logo_Path } from '@webdpt/framework/config'; | |||
@Component({ | |||
selector: 'app-login', | |||
templateUrl: './login.component.html', | |||
styleUrls: ['./login.component.css'] | |||
}) | |||
export class LoginComponent { | |||
constructor( | |||
@Inject(Logo_Path) public dwLogoPath: string, | |||
) { } | |||
} |
@ -0,0 +1,26 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { Routes, RouterModule } from '@angular/router'; | |||
import { DwAuthGuardService } from '@webdpt/framework/auth'; | |||
import { DwDefaultAppGuardService } from '@webdpt/framework/program-info'; | |||
import { HomeComponent } from './home.component'; | |||
const routes: Routes = [ | |||
{ | |||
path: '', | |||
component: HomeComponent, | |||
pathMatch: 'prefix', | |||
canActivate: [DwAuthGuardService, DwDefaultAppGuardService], | |||
data: { | |||
dwRouteData: { | |||
programId: 'home' | |||
} | |||
} | |||
} | |||
]; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule] | |||
}) | |||
export class HomeRoutingModule { } |
@ -0,0 +1,6 @@ | |||
::ng-deep .dw-f-header { | |||
display: none; | |||
} | |||
::ng-deep .dw-f-menusider { | |||
display: none; | |||
} |
@ -0,0 +1,3 @@ | |||
<p (click)="toLink()"> | |||
home works! | |||
</p> |
@ -0,0 +1,28 @@ | |||
/* eslint-disable quotes */ | |||
import { Component, OnInit } from "@angular/core"; | |||
import { DwSsoService } from "@webdpt/framework"; | |||
import { DigiMiddlewareAuthApp } from "../../../app/config/app-auth-token"; | |||
@Component({ | |||
selector: "app-home", | |||
templateUrl: "./home.component.html", | |||
styleUrls: ["./home.component.css"], | |||
}) | |||
export class HomeComponent implements OnInit { | |||
constructor(private ssoService: DwSsoService) {} | |||
userToken: string; | |||
// eslint-disable-next-line @angular-eslint/use-lifecycle-interface | |||
ngOnInit() { | |||
const _this = this; | |||
} | |||
toLink() { | |||
// const url = | |||
// "http://PCC_MECH2-test.apps.digiwincloud.com.cn/sso-login?userToken=981dc293-8ccd-470f-9e36-99ba30af1324"; | |||
const url = | |||
"https://athena-test.digiwincloud.com.cn/sso-login?userToken=" + | |||
this.userToken; | |||
// const url = | |||
// "https://athena-dev-platform-test.digiwincloud.com.cn/sso-login?userToken=981dc293-8ccd-470f-9e36-99ba30af1324"; | |||
// console.log("url", url); | |||
window.open(url); | |||
} | |||
} |
@ -0,0 +1,12 @@ | |||
import { NgModule } from "@angular/core"; | |||
import { CommonModule } from "@angular/common"; | |||
import { SharedModule } from "../shared/shared.module"; | |||
import { HomeRoutingModule } from "./home-routing.module"; | |||
import { HomeComponent } from "./home.component"; | |||
@NgModule({ | |||
imports: [CommonModule, SharedModule, HomeRoutingModule], | |||
declarations: [HomeComponent], | |||
}) | |||
export class HomeModule {} |
@ -0,0 +1,23 @@ | |||
/* eslint-disable quotes */ | |||
import { Routes } from "@angular/router"; | |||
export const IMPLEMENTATION_ROUTES: Routes = [ | |||
// 設定應用開發應用模組路由 | |||
// { | |||
// path: "", // 首頁 | |||
// // eslint-disable-next-line quotes | |||
// pathMatch: "prefix", | |||
// loadChildren: (): Promise<any> => | |||
// import("./programs/large-home/large-home.module").then( | |||
// (m) => m.LargeHomeModule | |||
// ), | |||
// }, | |||
// { | |||
// path: "", // 新的路由 | |||
// pathMatch: "prefix", | |||
// loadChildren: (): any => | |||
// import("./programs/large-home/large-home.module").then( | |||
// (m) => m.LargeHomeModule | |||
// ), | |||
// }, | |||
]; |
@ -0,0 +1,46 @@ | |||
/* eslint-disable quotes */ | |||
import { NgModule } from "@angular/core"; | |||
import { RouterModule, Routes } from "@angular/router"; | |||
import { MODULE_ROUTES } from "../routes"; | |||
import { DwLayoutDefaultComponent } from "@webdpt/components/layout"; | |||
import { DwSsoLoginComponent } from "@webdpt/components/sso-login"; | |||
import { LayoutComponent } from "./layout/layout.component"; | |||
import { | |||
DwAuthGuardService, | |||
DwDefaultAppGuardService, | |||
} from "@webdpt/framework"; | |||
const routes: Routes = [ | |||
{ | |||
path: "", | |||
pathMatch: "prefix", | |||
component: LayoutComponent, | |||
canActivate: [DwAuthGuardService, DwDefaultAppGuardService], // 登录拦截 | |||
children: [...MODULE_ROUTES], | |||
data: { | |||
tabSetHosting: true, | |||
}, | |||
}, | |||
{ | |||
path: "login", | |||
pathMatch: "full", | |||
loadChildren: (): Promise<any> => | |||
import("./auth/login.module").then((m) => m.LoginModule), | |||
}, | |||
{ | |||
path: "forget", | |||
pathMatch: "full", | |||
loadChildren: (): Promise<any> => | |||
import("./auth/forget/forget.module").then((m) => m.ForgetModule), | |||
}, | |||
{ | |||
path: "sso-login", | |||
pathMatch: "full", | |||
component: DwSsoLoginComponent, | |||
}, | |||
]; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule], | |||
}) | |||
export class ImplementationRoutingModule {} |
@ -0,0 +1,77 @@ | |||
import { NgModule, ModuleWithProviders } from "@angular/core"; | |||
import { CommonModule } from "@angular/common"; | |||
import { Provider } from "@angular/compiler/src/core"; | |||
import { HTTP_INTERCEPTORS } from "@angular/common/http"; | |||
import { | |||
DW_MENU_JSON, | |||
DW_PROGRAM_JSON, | |||
DW_TAB_ROUTE_CONFIG_JSON, | |||
DW_LANGUAGE_JSON, | |||
} from "@webdpt/framework/config"; | |||
import { DW_PROGRAM_PAGE, DW_PROGRAM_ACTION } from "@webdpt/framework/config"; | |||
import { DwHttpApiInterceptor } from "@webdpt/framework/http"; | |||
import { ImplementationRoutingModule } from "./implementation-routing.module"; | |||
import { SharedModule } from "./shared/shared.module"; | |||
import { menuJson } from "./menu/model/menu.config"; | |||
import { programInfoJson } from "./program-info/model/program.config"; | |||
import { programPageInfoJson } from "./program-info/model/program-page.config"; | |||
import { programActionInfoJson } from "./program-info/model/program-action.config"; | |||
import { tabRouteConfigJson } from "./tab-route/model/tab-route-config"; | |||
import { languageList } from "./language/model/language.config"; | |||
import { openSelectModalDefault } from "./shared/select-modal/default"; | |||
import { openOrgTreeModalDefault } from "./shared/organize-tree-modal/default"; | |||
import { DW_SELECT_MODAL_DEFAULT } from "@webdpt/components/modals/select"; | |||
import { DW_ORGTREE_MODAL_DEFAULT } from "@webdpt/framework/organize-tree-core"; | |||
import { LayoutComponent } from "./layout/layout.component"; | |||
// import { themeConfig } from '../config/theme.config'; | |||
import { DwMainLayoutModule } from "@webdpt/components/layout"; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
ImplementationRoutingModule, | |||
SharedModule, // 共享模組 | |||
DwMainLayoutModule, | |||
], | |||
declarations: [LayoutComponent], | |||
providers: [], | |||
}) | |||
export class ImplementationModule { | |||
static forRoot( | |||
providers: Provider[] | |||
): ModuleWithProviders<ImplementationModule> { | |||
return { | |||
ngModule: ImplementationModule, | |||
providers: [ | |||
// --------------------------------------------------------- | |||
// | 選配 | |||
// --------------------------------------------------------- | |||
// 靜態設定檔 | |||
// { provide: DW_THEME, useValue: themeConfig }, // 主題設定檔 | |||
{ provide: DW_MENU_JSON, useValue: menuJson }, // Menu靜態設定檔 | |||
{ provide: DW_LANGUAGE_JSON, useValue: languageList }, // 可用語言清單 | |||
{ provide: DW_PROGRAM_JSON, useValue: programInfoJson }, // 作業靜態設定檔 | |||
{ provide: DW_PROGRAM_PAGE, useValue: programPageInfoJson }, // 作業子頁面設定檔 | |||
{ provide: DW_PROGRAM_ACTION, useValue: programActionInfoJson }, // 作業功能設定檔 | |||
{ provide: DW_TAB_ROUTE_CONFIG_JSON, useValue: tabRouteConfigJson }, // 多頁佈局預設開啟作業 | |||
{ provide: DW_SELECT_MODAL_DEFAULT, useValue: openSelectModalDefault }, // 開窗服務的共用設定值 | |||
{ | |||
provide: DW_ORGTREE_MODAL_DEFAULT, | |||
useValue: openOrgTreeModalDefault, | |||
}, // 組織人員樹開窗元件 | |||
// Http API 攔截器 | |||
DwHttpApiInterceptor, | |||
{ | |||
provide: HTTP_INTERCEPTORS, | |||
// 用來替換api的網址 | |||
// request.url = '/users'; => request.url = 'http://api/users'; | |||
useExisting: DwHttpApiInterceptor, | |||
multi: true, | |||
}, | |||
...providers, | |||
], | |||
}; | |||
} | |||
} |
@ -0,0 +1,15 @@ | |||
// 可用語言清單靜態設定檔 | |||
export const languageList = [ | |||
{ | |||
'value': 'en_US', | |||
'label': 'English' | |||
}, | |||
{ | |||
'value': 'zh_CN', | |||
'label': '简体' | |||
}, | |||
{ | |||
'value': 'zh_TW', | |||
'label': '繁體' | |||
} | |||
]; |
@ -0,0 +1,66 @@ | |||
<!-- <ng-template #headerRightActionTemplate> | |||
自訂headerRightActionTemplate | |||
</ng-template> --> | |||
<div class="layout-box"> | |||
<!-- <div class="get-token-box" (click)="toLinkSystem()"> | |||
sid请求token跳转 | |||
</div> --> | |||
<!-- <dw-layout-app> | |||
<dw-layout-basic-side [collapsedWidth]="0" [breakpoint]="'lg'" [routeSelectMenu]="false" | |||
> | |||
</dw-layout-basic-side> | |||
</dw-layout-app> --> | |||
<div class="top-box"> | |||
<div class="top-system-content "> | |||
<div class="system-box "(click)="toLinkSystem('partsCloud')"> | |||
<span style="color:#fff;opacity: 1;">零部件云</span> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="center-box"> | |||
<div class="system-content div-position1"> | |||
<div class="system-box "(click)="toLinkSystem('DMP')"> | |||
<span style="color:#fff;opacity: 1;">数据中台</span> | |||
</div> | |||
</div> | |||
<div class="system-content div-position2 "> | |||
<div class="system-box"(click)="toLinkSystem('chatFile')"> | |||
<span style="color:#fff;opacity: 1;">chatFile</span> | |||
</div> | |||
</div> | |||
<div class="system-content div-position3 "> | |||
<div class="system-box"(click)="toLinkSystem('KMO')"> | |||
<span style="color:#fff;opacity: 1;">知识中台</span> | |||
</div> | |||
</div> | |||
<div class="system-content div-position4 "> | |||
<div class="system-box"(click)="toLinkSystem('EIP')"> | |||
<span style="color:#fff;opacity: 1;">智驱工作台</span> | |||
</div> | |||
</div> | |||
<div class="system-content div-position5 "> | |||
<div class="system-box"(click)="toLinkSystem('AIOT')"> | |||
<span style="color:#fff;opacity: 1;">AIOT</span> | |||
</div> | |||
</div> | |||
<div class="system-content div-position6 "> | |||
<div class="system-box"(click)="toLinkSystem('equipmentCloud')"> | |||
<span style="color:#fff;opacity: 1;">装备云</span> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="bottom-box"> | |||
<div class="bottom-system-content "> | |||
<div class="system-box"(click)="toLinkSystem('E10229')"> | |||
<span style="color:#fff;opacity: 1;">E10</span> | |||
</div> | |||
</div> | |||
<div class="bottom-system-content "> | |||
<div class="system-box"(click)="toLinkSystem('T100bs')"> | |||
<span style="color:#fff;opacity: 1;">T100</span> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@ -0,0 +1,159 @@ | |||
/deep/.dw-f-header { | |||
// display: none; | |||
box-shadow: none; | |||
} | |||
/deep/.dw-f-menusider { | |||
display: none; | |||
} | |||
/deep/.dw-f-header .dw-header-left { | |||
display: none; | |||
} | |||
/deep/.dw-f-header .dw-header-right .dw-f-header-item { | |||
display: none; | |||
} | |||
/deep/.dw-header-icon { | |||
position: fixed; | |||
right: 10px; | |||
color: #fff; | |||
} | |||
/deep/nz-layout.ant-layout { | |||
display: inline-block; | |||
} | |||
.layout-box { | |||
position: relative; | |||
width: 100%; | |||
height: 100%; | |||
overflow: hidden; | |||
background-image: url("../../../assets/img/new-bg.jpg"); | |||
background-repeat: no-repeat; | |||
background-size: cover; | |||
background-position: center; | |||
.top-box { | |||
// background: rgba(0, 0, 0, 0.5); | |||
width: 85%; | |||
height: 10%; | |||
position: absolute; | |||
display: flex; | |||
justify-content: flex-end; | |||
box-sizing: border-box; | |||
left: 0; | |||
top: 16%; | |||
/* bottom: 0; */ | |||
right: 0; | |||
margin: auto; | |||
} | |||
.top-system-content { | |||
width: 80px; | |||
height: 80px; | |||
box-shadow: 2px 2px 4px rgba(124, 199, 243, 0.6); | |||
// opacity: 0.6; | |||
border-radius: 40px; | |||
background: rgba(0, 0, 0, 0.5); | |||
margin: 5px; | |||
padding: 10px; | |||
font-weight: bold; | |||
display: flex; | |||
text-align: center; | |||
justify-content: flex-start; | |||
align-items: center; | |||
cursor: pointer; | |||
} | |||
.center-box { | |||
// background: rgba(0, 0, 0, 0.5); | |||
width: 60%; | |||
height: 50%; | |||
position: absolute; | |||
display: flex; | |||
justify-content: space-between; | |||
box-sizing: border-box; | |||
left: 0; | |||
top: 20%; | |||
bottom: 0; | |||
right: 0; | |||
margin: auto; | |||
} | |||
.system-content { | |||
width: 80px; | |||
height: 80px; | |||
box-shadow: 2px 2px 4px rgba(124, 199, 243, 0.6); | |||
// opacity: 0.6; | |||
border-radius: 40px; | |||
background: rgba(0, 0, 0, 0.5); | |||
margin: 5px; | |||
padding: 10px; | |||
font-weight: bold; | |||
display: flex; | |||
text-align: left; | |||
justify-content: flex-start; | |||
align-items: center; | |||
cursor: pointer; | |||
.div-position7 { | |||
right: 5%; | |||
position: absolute; | |||
top: 35%; | |||
} | |||
} | |||
.div-position1 { | |||
left: 20%; | |||
position: absolute; | |||
top: 20%; | |||
} | |||
.div-position2 { | |||
position: absolute; | |||
right: 20%; | |||
top: 20%; | |||
} | |||
.div-position3 { | |||
right: 22%; | |||
position: absolute; | |||
top: 46%; | |||
} | |||
.div-position4 { | |||
left: 24%; | |||
position: absolute; | |||
top: 46%; | |||
} | |||
.div-position5 { | |||
left: 7%; | |||
position: absolute; | |||
top: 32%; | |||
} | |||
.div-position6 { | |||
right: 5%; | |||
position: absolute; | |||
top: 35%; | |||
} | |||
.bottom-box { | |||
// background: rgba(245, 186, 186, 0.5); | |||
width: 60%; | |||
height: 100px; | |||
position: absolute; | |||
display: flex; | |||
justify-content: flex-start; | |||
box-sizing: border-box; | |||
left: 0; | |||
bottom: 5%; | |||
right: 0; | |||
margin: auto; | |||
} | |||
.bottom-system-content { | |||
width: 80px; | |||
height: 80px; | |||
box-shadow: 2px 2px 4px rgba(124, 199, 243, 0.6); | |||
// opacity: 0.6; | |||
border-radius: 40px; | |||
background: rgba(0, 0, 0, 0.5); | |||
margin: 5px; | |||
padding: 10px; | |||
font-weight: bold; | |||
display: flex; | |||
text-align: center; | |||
justify-content: flex-start; | |||
align-items: center; | |||
cursor: pointer; | |||
} | |||
} | |||
// .system-content:hover .system-box { | |||
// transform: scale(1.1); /* 鼠标悬停时放大1.1倍 */ | |||
// } |
@ -0,0 +1,140 @@ | |||
/* eslint-disable quotes */ | |||
import { systemList } from "./system"; | |||
// import { DwHttpApiInterceptor } from "@webdpt/framework/http"; | |||
/* eslint-disable quotes */ | |||
import { Component, OnInit } from "@angular/core"; | |||
import { | |||
DigiMiddlewareAuthApp, | |||
DigiMiddlewareAuthUser, | |||
} from "app/config/app-auth-token"; | |||
import { CommonService } from "../service/common.service"; | |||
@Component({ | |||
selector: "app-layout", | |||
templateUrl: "./layout.component.html", | |||
styleUrls: ["./layout.component.less"], | |||
}) | |||
export class LayoutComponent implements OnInit { | |||
// 登出: https://iam-test.digiwincloud.com.cn/api/iam/v2/identity/logout | |||
userToken: string; | |||
systemList = {}; | |||
user_info = { | |||
userId: "", // 当前用户账号 | |||
tenantId: "", // 当前用户租户id | |||
productKey: "", // json字段的头部 | |||
}; | |||
queryDisplayList: any; | |||
constructor(private commonService: CommonService) {} | |||
ngOnInit(): void { | |||
this.systemList = systemList; | |||
this.getSystem(); | |||
} | |||
toLinkSystem(type?) { | |||
// 1. 通过获取user_token获取单点登录链接 | |||
// 请求获取user_token | |||
switch (type) { | |||
case "DMP": | |||
this.getUserToken(type, this.systemList["T100bs"]); | |||
break; | |||
case "chatFile": | |||
this.getUserToken(type, this.systemList["chatFile"]); | |||
break; | |||
case "KMO": | |||
this.getUserToken(type, this.systemList["KMO"]); | |||
break; | |||
case "EIP": | |||
this.getUserToken(type, this.systemList["EIP"]); | |||
break; | |||
case "AIOT": | |||
this.getUserToken(type, this.systemList["AIOT"]); | |||
break; | |||
case "equipmentCloud": | |||
this.getUserToken(type, this.systemList["equipmentCloud"]); | |||
break; | |||
case "partsCloud": | |||
this.getUserToken(type, this.systemList["partsCloud"]); | |||
break; | |||
case "E10229": | |||
this.getUserToken(type, this.systemList["E10229"]); | |||
break; | |||
case "T100bs": | |||
this.getUserToken(type, this.systemList["T100bs"]); | |||
break; | |||
} | |||
} | |||
/** | |||
* 通过请求queryDisplayList接口登录 | |||
*/ | |||
getSystem() { | |||
const headers = { | |||
"Digi-Middleware-Auth-App": DigiMiddlewareAuthApp, | |||
"Digi-Middleware-Auth-User": DigiMiddlewareAuthUser, | |||
}; | |||
this.commonService | |||
.getRequestWithHeaders( | |||
"https://semc.apps.digiwincloud.com.cn/tenant/semc/applink/queryDisplayList", | |||
headers | |||
) | |||
.then((res) => { | |||
this.queryDisplayList = res.response; | |||
console.log("queryDisplayList", this.queryDisplayList); | |||
}) | |||
.catch((error) => console.error(error)); | |||
} | |||
/** | |||
* 通过tenantId获取用户token | |||
*/ | |||
async getUserToken(type, item) { | |||
if (item.ssoLogin) { | |||
// 单点登录跳转 queryDisplayList接口的数据 底部 e10 t100 | |||
console.log("单点登录跳转录的方式", type); | |||
const queryDisplayList = this.queryDisplayList.filter((arr) => { | |||
return arr.code === type; | |||
}); | |||
// console.log("cloudwebsite", queryDisplayList[0]["cloudwebsite"]); | |||
window.open(queryDisplayList[0]["cloudwebsite"]); | |||
} else if (item.mockLogin) { | |||
console.log("模拟登录的方式", type); | |||
// 通过书康哥接口请求 模拟登录 | |||
const DwUserInfo = JSON.parse(sessionStorage.getItem("DwUserInfo")); | |||
console.log("DwUserInfo", DwUserInfo); | |||
this.user_info.userId = DwUserInfo["userId"]; | |||
this.user_info.tenantId = DwUserInfo["tenantId"]; | |||
this.user_info.productKey = type; | |||
console.log("user_info", this.user_info); | |||
const getUrl = | |||
"https://demo-athenaopt.apps.digiwincloud.com.cn/restful/standard/demo/api/default/login"; | |||
this.commonService | |||
.postWithHeaders(getUrl, this.user_info, {}) | |||
.then((res) => { | |||
// console.log("res", res); | |||
if (res && res.response) { | |||
this.userToken = res.response.user_token; | |||
const url = item.url + "/sso-login?userToken=" + this.userToken; | |||
window.open(url); | |||
} | |||
}); | |||
} else { | |||
console.log("切换租户的方式", type); | |||
// 接口 refresh/tenant 切换租户方式 | |||
const getUrl = | |||
this.commonService.iamUrl + "/api/iam/v2/identity/token/refresh/tenant"; | |||
console.log("iamUrl", this.commonService.iamUrl); | |||
const headers = { | |||
"Digi-Middleware-Auth-App": DigiMiddlewareAuthApp, | |||
"Digi-Middleware-Auth-User": DigiMiddlewareAuthUser, | |||
}; | |||
const data = { | |||
tenantSid: item.sid, | |||
}; | |||
this.userToken = await this.commonService | |||
.postWithHeaders(getUrl, data, headers) | |||
.then((res) => { | |||
// console.log("res", res); | |||
return res.user_token; | |||
}); | |||
let url = ""; | |||
url = item.url + "/sso-login?userToken=" + this.userToken; | |||
window.open(url); | |||
} | |||
} | |||
} |
@ -0,0 +1,76 @@ | |||
/* eslint-disable quotes */ | |||
export const systemList = { | |||
DMP: { | |||
title: "数据中台", | |||
sid: 150269977879104, | |||
id: "zhoujg", | |||
name: "鼎捷集团售前", | |||
url: "https://dmp-dmf-hw-ys.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
chatFile: { | |||
title: "chatFile", | |||
sid: 610301619790400, | |||
id: "ShanghaiWorldExpo", | |||
name: "ChatFile演示", | |||
url: "https://kcf.apps.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
KMO: { | |||
title: "知识中台", | |||
sid: 610301619790400, | |||
id: "ShanghaiWorldExpo", | |||
name: "ChatFile演示", | |||
url: "https://kcf.apps.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
EIP: { | |||
title: "智驱工作台", | |||
sid: 821224928908288, | |||
id: "digiwinSummit", | |||
name: "数智未来峰会", | |||
url: "https://athena.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
AIOT: { | |||
title: "AIOT", | |||
sid: 190963220054592, | |||
id: "zhoujg999", | |||
name: "鼎鼎塑料集团", | |||
url: "https://console.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
equipmentCloud: { | |||
title: "装备云", | |||
sid: 821224928908288, | |||
id: "digiwinSummit", | |||
name: "数智未来峰会", | |||
url: "https://athena.digiwincloud.com.cn", | |||
mockLogin: false, | |||
ssoLogin: false, | |||
}, | |||
partsCloud: { | |||
title: "零部件云", | |||
sid: 821224928908288, | |||
id: "digiwinSummit", | |||
name: "数智未来峰会", | |||
url: "https://athena.digiwincloud.com.cn", | |||
mockLogin: true, | |||
ssoLogin: false, | |||
}, | |||
E10229: { | |||
title: "E10", | |||
mockLogin: false, | |||
ssoLogin: true, | |||
}, | |||
T100bs: { | |||
title: "T100", | |||
mockLogin: false, | |||
ssoLogin: true, | |||
}, | |||
}; |
@ -0,0 +1,5 @@ | |||
import { menuData } from './menu.model'; // Menu靜態設定檔 | |||
export const menuJson = [ | |||
...menuData | |||
]; |
@ -0,0 +1 @@ | |||
export const menuData = []; |
@ -0,0 +1,6 @@ | |||
import { programActionData } from './program-action.model'; | |||
export const programActionInfoJson = [ | |||
...programActionData // ProgramAction靜態設定檔 | |||
]; |
@ -0,0 +1 @@ | |||
export const programActionData = []; |
@ -0,0 +1,6 @@ | |||
import { programPageData } from './program-page.model'; | |||
export const programPageInfoJson = [ | |||
...programPageData // ProgramPage靜態設定檔 | |||
]; |
@ -0,0 +1 @@ | |||
export const programPageData = []; |
@ -0,0 +1,5 @@ | |||
import { programData } from './program.model'; | |||
export const programInfoJson = [ | |||
...programData, // Program靜態設定檔 | |||
]; |
@ -0,0 +1,8 @@ | |||
export const programData = [ | |||
{ | |||
'id': 'home', | |||
'module': 'root', // 沒有模組歸屬不做模組切分,不上傳到IAM做權限控管 | |||
'type': '', | |||
'routerLink': '/' | |||
}, | |||
]; |
@ -0,0 +1,41 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { RouterModule, Routes } from '@angular/router'; | |||
import { LagrgeHomeComponent } from './lagrge-home.component'; | |||
import { DwLanguageService } from '@webdpt/framework/language'; | |||
import { DwAuthGuardService } from '@webdpt/framework/auth'; | |||
const routes: Routes = [ | |||
{ | |||
path: '', | |||
pathMatch: 'prefix', | |||
canActivate: [DwAuthGuardService], | |||
data: { | |||
dwRouteData: { | |||
programId: 'lagrge-home', | |||
dwAuthId: 'lagrge-home' | |||
} | |||
}, | |||
resolve: { | |||
transaction: DwLanguageService | |||
}, | |||
children: [ | |||
{ | |||
path: "", | |||
pathMatch: "prefix", | |||
component: LagrgeHomeComponent, | |||
canActivate: [DwAuthGuardService], | |||
data: { | |||
dwRouteData: { | |||
dwAuthId: 'lagrge-home', | |||
} | |||
} | |||
} | |||
] | |||
} | |||
]; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule] | |||
}) | |||
export class LagrgeHomeRoutingModule { } |
@ -0,0 +1,3 @@ | |||
<div> | |||
自定义 | |||
</div> |
@ -0,0 +1,25 @@ | |||
import { ComponentFixture, TestBed } from '@angular/core/testing'; | |||
import { LagrgeHomeComponent } from './lagrge-home.component'; | |||
describe('LagrgeHomeComponent', () => { | |||
let component: LagrgeHomeComponent; | |||
let fixture: ComponentFixture<LagrgeHomeComponent>; | |||
beforeEach(async () => { | |||
await TestBed.configureTestingModule({ | |||
declarations: [ LagrgeHomeComponent ] | |||
}) | |||
.compileComponents(); | |||
}); | |||
beforeEach(() => { | |||
fixture = TestBed.createComponent(LagrgeHomeComponent); | |||
component = fixture.componentInstance; | |||
fixture.detectChanges(); | |||
}); | |||
it('should create', () => { | |||
expect(component).toBeTruthy(); | |||
}); | |||
}); |
@ -0,0 +1,15 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
@Component({ | |||
selector: 'app-lagrge-home', | |||
templateUrl: './lagrge-home.component.html', | |||
styleUrls: ['./lagrge-home.component.less'] | |||
}) | |||
export class LagrgeHomeComponent implements OnInit { | |||
constructor() { } | |||
ngOnInit(): void { | |||
} | |||
} |
@ -0,0 +1,17 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { LagrgeHomeRoutingModule } from './lagrge-home-routing.module'; | |||
import { LagrgeHomeComponent } from './lagrge-home.component'; | |||
@NgModule({ | |||
declarations: [ | |||
LagrgeHomeComponent | |||
], | |||
imports: [ | |||
CommonModule, | |||
LagrgeHomeRoutingModule | |||
] | |||
}) | |||
export class LagrgeHomeModule { } |
@ -0,0 +1,13 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { Routes, RouterModule } from '@angular/router'; | |||
const routes: Routes = [ | |||
{ | |||
path: 'lagrge-home', loadChildren: () => import('./lagrge-home/lagrge-home.module').then(m => m.LagrgeHomeModule) | |||
}]; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule] | |||
}) | |||
export class LargeHomeRoutingModule { } |
@ -0,0 +1,18 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { LargeHomeRoutingModule } from './large-home-routing.module'; | |||
const programsModules = [ | |||
]; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
LargeHomeRoutingModule, | |||
...programsModules | |||
], | |||
declarations: [] | |||
}) | |||
export class LargeHomeModule { } |
@ -0,0 +1,117 @@ | |||
/* eslint-disable quotes */ | |||
import { HttpClient } from "@angular/common/http"; | |||
import { Inject, Injectable } from "@angular/core"; | |||
import { Observable } from "rxjs"; | |||
import { DwSystemConfigService } from "@webdpt/framework/config"; | |||
import { DW_AUTH_TOKEN } from "@webdpt/framework/auth"; | |||
@Injectable({ providedIn: "root" }) | |||
export class CommonService { | |||
atdmUrl: string; | |||
bpmUrl: string; | |||
atmcUrl: any; | |||
frcUrl: any; | |||
eocUrl: any; | |||
iamUrl: any; | |||
themeMapUrl: any; | |||
pageData: any; | |||
// 记录机制的content参数 | |||
content: any; | |||
uibotUrl: string; | |||
isDisabled: boolean; | |||
caLqsUrl: string; | |||
constructor( | |||
@Inject(DW_AUTH_TOKEN) protected authToken: any, | |||
private http: HttpClient, | |||
private configService: DwSystemConfigService | |||
) { | |||
this.configService.get("atdmUrl").subscribe((url: string): void => { | |||
this.atdmUrl = url; | |||
}); | |||
this.configService.get("bpmUrl").subscribe((url): void => { | |||
this.bpmUrl = url; | |||
}); | |||
this.configService.get("atmcUrl").subscribe((url): void => { | |||
this.atmcUrl = url; | |||
}); | |||
this.configService.get("frcUrl").subscribe((url): void => { | |||
this.frcUrl = url; | |||
}); | |||
this.configService.get("eocUrl").subscribe((url): void => { | |||
this.eocUrl = url; | |||
}); | |||
this.configService.get("uibotUrl").subscribe((url: string): void => { | |||
this.uibotUrl = url; | |||
}); | |||
this.configService.get("caLqsUrl").subscribe((url: string): void => { | |||
this.caLqsUrl = url; | |||
// console.log("caLqsUrl", this.caLqsUrl); | |||
}); | |||
this.configService.get("iamUrl").subscribe((url: string): void => { | |||
this.iamUrl = url; | |||
console.log("iamUrl", this.iamUrl); | |||
}); | |||
} | |||
getHeader(): any { | |||
if (this.authToken?.token) { | |||
return { | |||
"digi-middleware-auth-user": this.authToken.token, | |||
token: this.authToken.token, | |||
}; | |||
} | |||
return {}; | |||
} | |||
/** | |||
* | |||
* @param url | |||
* @param data | |||
* @param headers | |||
* @returns | |||
*/ | |||
postWithHeaders(url, data, headers) { | |||
headers = headers || {}; | |||
headers["Content-Type"] = "application/json"; // 设置默认的Content-Type | |||
const options = { | |||
method: "POST", | |||
headers: headers, | |||
body: JSON.stringify(data), | |||
}; | |||
return fetch(url, options) | |||
.then((response) => { | |||
if (response.ok) { | |||
return response.json(); | |||
} | |||
throw new Error("请求出错!"); | |||
}) | |||
.catch((error) => { | |||
console.error("请求出错!", error); | |||
throw error; | |||
}); | |||
} | |||
/** | |||
* | |||
* @param url | |||
* @param headers | |||
* @returns | |||
*/ | |||
getRequestWithHeaders(url, headers) { | |||
return fetch(url, { | |||
method: "GET", | |||
headers: headers, | |||
}) | |||
.then((response) => { | |||
if (!response.ok) { | |||
throw new Error("Network response was not ok " + response.statusText); | |||
} | |||
return response.json(); | |||
}) | |||
.catch((error) => { | |||
console.error( | |||
"There has been a problem with your fetch operation:", | |||
error | |||
); | |||
}); | |||
} | |||
} |
@ -0,0 +1,4 @@ | |||
import { IDwOrgTreeDefault } from '@webdpt/framework/organize-tree-core'; | |||
import { NzTreeNode } from 'ng-zorro-antd/tree'; | |||
export const openOrgTreeModalDefault: IDwOrgTreeDefault<NzTreeNode> = {}; |
@ -0,0 +1,20 @@ | |||
import { IDwSelectModalCustomizeConfig } from '@webdpt/components/modals/select'; | |||
export const openSelectModalDefault: IDwSelectModalCustomizeConfig = { | |||
modalTitle: 'default', // modal 標題. | |||
modalWidth: '80%', // modal 寬度. | |||
modalOkText: 'dw-determine', // 確認按鈕文字. | |||
modalCancelText: 'dw-cancel', // 取消按鈕文字. | |||
tableIdField: '', // 使用的 id 欄位. | |||
tableNameField: '', // 使用的 name 欄位. | |||
tableColDefs: [], // 表格欄位定義. | |||
tableMultiSelect: true, // 多選或單選. | |||
tableShowTag: true, // 是否顯示下方的 tag. | |||
tableIsFilter: true, // 是否提供搜尋. | |||
tablePageSize: 3, // 每頁展示多少數據,可雙向繫結. | |||
tableShowPagination: true, // 是否顯示分頁器. | |||
tableShowSizeChanger: true, // 是否可以改變 dwPageSize. | |||
tableNoResult: '', // 無數據時顯示內容, 空值則使用預設值. | |||
tablePageSizeOptions: [5, 10, 15, 20], // 頁數選擇器可選值. | |||
dataSource: null // 資料源 service. | |||
}; |
@ -0,0 +1,24 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; | |||
import { DwExceptionModule } from '@webdpt/components/exception'; | |||
/** | |||
* 共享模組 | |||
* | |||
* @export | |||
* @class SharedModule | |||
*/ | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
FormsModule, | |||
ReactiveFormsModule | |||
], | |||
exports: [ | |||
FormsModule, | |||
ReactiveFormsModule, | |||
DwExceptionModule | |||
] | |||
}) | |||
export class SharedModule { } |
@ -0,0 +1 @@ | |||
@import './variable.less'; |
@ -0,0 +1,10 @@ | |||
// 多頁佈局預設開啟作業 | |||
export const tabRouteConfigJson = [ | |||
{ | |||
'id': 'home', | |||
'canClose': false, | |||
'defaultOpen': true, | |||
'canMultiOpen': false, | |||
'iconClass': 'dwType:home' | |||
} | |||
]; |
@ -0,0 +1,17 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { DwToolsRoutingModule } from '@webdpt/components/tools-routing'; | |||
import { SharedModule } from './shared/shared.module'; | |||
import { DwCmsRoutingModule } from '@webdpt/programs'; | |||
@NgModule({ | |||
imports: [ | |||
SharedModule, // 專案的共享模組 | |||
DwToolsRoutingModule, // 平台組件的預設路由模組 | |||
// --------------------------------------------------------- | |||
// | 選配 | |||
// --------------------------------------------------------- | |||
// DwCmsRoutingModule // 平台作業路由 | |||
] | |||
}) | |||
export class ToolsRoutingWrapper { } |
@ -0,0 +1,10 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { Routes, RouterModule } from '@angular/router'; | |||
const routes: Routes = []; | |||
@NgModule({ | |||
imports: [RouterModule.forChild(routes)], | |||
exports: [RouterModule] | |||
}) | |||
export class IndustryRoutingModule { } |
@ -0,0 +1,13 @@ | |||
import { NgModule } from '@angular/core'; | |||
import { CommonModule } from '@angular/common'; | |||
import { IndustryRoutingModule } from './industry-routing.module'; | |||
@NgModule({ | |||
imports: [ | |||
CommonModule, | |||
IndustryRoutingModule | |||
], | |||
declarations: [] | |||
}) | |||
export class IndustryModule { } |
@ -0,0 +1,12 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
@Component({ | |||
selector: 'app-prog001', | |||
template: `<h1>404</h1>` | |||
}) | |||
export class PageNotFoundComponent { | |||
constructor() { } | |||
} |
@ -0,0 +1,12 @@ | |||
import { Routes } from '@angular/router'; | |||
import { CUSTOMIZATION_ROUTES } from './customization/customization-routes'; | |||
export const MODULE_ROUTES: Routes = [ | |||
{ | |||
path: 'dpt', // 路徑為/dpt/* | |||
pathMatch: 'prefix', | |||
loadChildren: (): Promise<any> => import('./implementation/tools-routing-wrapper.module').then(m => m.ToolsRoutingWrapper) | |||
}, | |||
...CUSTOMIZATION_ROUTES | |||
]; |
@ -0,0 +1,6 @@ | |||
/* You can add global styles to this file, and also import other style files */ | |||
@webdpt-path: "@webdpt"; | |||
@import "~@{webdpt-path}/components/style/index.less"; | |||
@import "~@{webdpt-path}/programs/style/index.less"; | |||
@import './implementation/style/index.less'; | |||
@import './customization/style/index.less'; |
@ -0,0 +1,19 @@ | |||
{ | |||
"apiUrl": "@WEB_SERVICE_URL@", | |||
"iamUrl":"https://iam.digiwincloud.com.cn", | |||
"emcUrl": "@EMC_SERVICE_URL@", | |||
"omUrl": "@OM_URL@", | |||
"consoleUrl": "@CONSOLE_URL@", | |||
"marketUrl": "@MARKET_URL@", | |||
"omcUrl": "@OMC_SERVICE_URL@", | |||
"gmcUrl": "@GMC_SERVICE_URL@", | |||
"cacUrl": "@CAC_SERVICE_URL@", | |||
"frUrl": "@FINEREPORT_URL@", | |||
"dmcUrl": "@DMC_SERVICE_URL@", | |||
"analytics": { | |||
"gtm": "@ANALYTICS_GTM@", | |||
"baidu": "@ANALYTICS_BAIDU@" | |||
}, | |||
"multiTenant": "true", | |||
"dwAppSecret": "@DW_APP_SECRET@" | |||
} |
@ -0,0 +1,19 @@ | |||
{ | |||
"apiUrl": "@WEB_SERVICE_URL@", | |||
"iamUrl":"https://iam.digiwincloud.com.cn", | |||
"emcUrl": "@EMC_SERVICE_URL@", | |||
"omUrl": "@OM_URL@", | |||
"consoleUrl": "@CONSOLE_URL@", | |||
"marketUrl": "@MARKET_URL@", | |||
"omcUrl": "@OMC_SERVICE_URL@", | |||
"gmcUrl": "@GMC_SERVICE_URL@", | |||
"cacUrl": "@CAC_SERVICE_URL@", | |||
"frUrl": "@FINEREPORT_URL@", | |||
"dmcUrl": "@DMC_SERVICE_URL@", | |||
"analytics": { | |||
"gtm": "@ANALYTICS_GTM@", | |||
"baidu": "@ANALYTICS_BAIDU@" | |||
}, | |||
"multiTenant": "true", | |||
"dwAppSecret": "@DW_APP_SECRET@" | |||
} |
@ -0,0 +1,5 @@ | |||
{ | |||
"prog": { | |||
"lagrge-home": "lagrge-home" | |||
} | |||
} |
@ -0,0 +1,5 @@ | |||
{ | |||
"prog": { | |||
"lagrge-home": "大屏首页" | |||
} | |||
} |
@ -0,0 +1,5 @@ | |||
{ | |||
"prog": { | |||
"lagrge-home": "大屏首頁" | |||
} | |||
} |