├── src ├── assets │ ├── .gitkeep │ ├── 05 │ │ ├── 彩色-150x108.png │ │ ├── 彩色-300x217.png │ │ ├── 彩色-768x555.png │ │ ├── 个人计划-1024x740.png │ │ ├── 个人计划-1200x867.png │ │ ├── 个人计划-150x108.png │ │ ├── 个人计划-1536x1110.png │ │ ├── 个人计划-1980x1431.png │ │ ├── 个人计划-2048x1480.png │ │ ├── 个人计划-300x217.png │ │ ├── 个人计划-768x555.png │ │ ├── 人事管理-2048x1480.png │ │ ├── 团队协作-1024x740.png │ │ ├── 团队协作-1200x867.png │ │ ├── 团队协作-150x108.png │ │ ├── 团队协作-1536x1110.png │ │ ├── 团队协作-1980x1431.png │ │ ├── 团队协作-2048x1480.png │ │ ├── 团队协作-300x217.png │ │ ├── 团队协作-768x555.png │ │ ├── 客户管理-2048x1480.png │ │ ├── 彩色-1024x740.png │ │ ├── 彩色-1200x867.png │ │ ├── 彩色-1536x1110.png │ │ ├── 彩色-1980x1431.png │ │ ├── 活动管理-2048x1480.png │ │ ├── 组织管理-1024x740.png │ │ ├── 组织管理-1200x867.png │ │ ├── 组织管理-150x108.png │ │ ├── 组织管理-1536x1110.png │ │ ├── 组织管理-1980x1431.png │ │ ├── 组织管理-2048x1480.png │ │ ├── 组织管理-300x217.png │ │ ├── 组织管理-768x555.png │ │ ├── 计划管理-2048x1480.png │ │ ├── 设计管理-2048x1480.png │ │ ├── 门店管理-2048x1480.png │ │ ├── 项目管理-2048x1480.png │ │ ├── 首页云-1024x740.png │ │ ├── 首页云-1200x867.png │ │ ├── 首页云-150x108.png │ │ ├── 首页云-1536x1110.png │ │ ├── 首页云-1980x1431.png │ │ ├── 首页云-2048x1480.png │ │ ├── 首页云-300x217.png │ │ ├── 首页云-768x555.png │ │ ├── 首页火箭-1024x740.png │ │ ├── 首页火箭-1200x867.png │ │ ├── 首页火箭-150x108.png │ │ ├── 首页火箭-1536x1110.png │ │ ├── 首页火箭-1980x1431.png │ │ ├── 首页火箭-2048x1480.png │ │ ├── 首页火箭-300x217.png │ │ ├── 首页火箭-768x555.png │ │ ├── dot-shapes-1024x740.png │ │ ├── dot-shapes-1200x867.png │ │ ├── dot-shapes-150x108.png │ │ ├── dot-shapes-1536x1110.png │ │ ├── dot-shapes-1980x1431.png │ │ ├── dot-shapes-2048x1480.png │ │ ├── dot-shapes-300x217.png │ │ ├── dot-shapes-768x555.png │ │ ├── 彩色-2048x1480.png.png │ │ ├── 个人计划.png │ │ ├── 人事管理.png │ │ ├── 内容管理.png │ │ ├── 团队协作.png │ │ ├── 客户管理.png │ │ ├── 彩色.png │ │ ├── 活动管理.png │ │ ├── 涂改液.png │ │ ├── 简洁UI.png │ │ ├── 组织管理.png │ │ ├── 计划管理.png │ │ ├── 设计管理.png │ │ ├── 门店管理.png │ │ ├── 项目管理.png │ │ ├── 首页云.png │ │ ├── 首页火箭.png │ │ ├── dot-shapes.png │ │ ├── 人事管理-1024x740.png │ │ ├── 人事管理-1200x867.png │ │ ├── 人事管理-150x108.png │ │ ├── 人事管理-1536x1110.png │ │ ├── 人事管理-1980x1431.png │ │ ├── 人事管理-300x217.png │ │ ├── 人事管理-768x555.png │ │ ├── 内容管理-1024x740.png │ │ ├── 内容管理-1200x867.png │ │ ├── 内容管理-150x108.png │ │ ├── 内容管理-1536x1110.png │ │ ├── 内容管理-1980x1431.png │ │ ├── 内容管理-300x217.png │ │ ├── 内容管理-768x555.png │ │ ├── 客户管理-1024x740.png │ │ ├── 客户管理-1200x867.png │ │ ├── 客户管理-150x108.png │ │ ├── 客户管理-1536x1110.png │ │ ├── 客户管理-1980x1431.png │ │ ├── 客户管理-300x217.png │ │ ├── 客户管理-768x555.png │ │ ├── 活动管理-1024x740.png │ │ ├── 活动管理-1200x867.png │ │ ├── 活动管理-150x108.png │ │ ├── 活动管理-1536x1110.png │ │ ├── 活动管理-1980x1431.png │ │ ├── 活动管理-300x217.png │ │ ├── 活动管理-768x555.png │ │ ├── 计划管理-1024x740.png │ │ ├── 计划管理-1200x867.png │ │ ├── 计划管理-150x108.png │ │ ├── 计划管理-1536x1110.png │ │ ├── 计划管理-1980x1431.png │ │ ├── 计划管理-300x217.png │ │ ├── 计划管理-768x555.png │ │ ├── 设计管理-1024x740.png │ │ ├── 设计管理-1200x867.png │ │ ├── 设计管理-150x108.png │ │ ├── 设计管理-1536x1110.png │ │ ├── 设计管理-1980x1431.png │ │ ├── 设计管理-300x217.png │ │ ├── 设计管理-768x555.png │ │ ├── 门店管理-1024x740.png │ │ ├── 门店管理-1200x867.png │ │ ├── 门店管理-150x108.png │ │ ├── 门店管理-1536x1110.png │ │ ├── 门店管理-1980x1431.png │ │ ├── 门店管理-300x217.png │ │ ├── 门店管理-768x555.png │ │ ├── 项目管理-1024x740.png │ │ ├── 项目管理-1200x867.png │ │ ├── 项目管理-150x108.png │ │ ├── 项目管理-1536x1110.png │ │ ├── 项目管理-1980x1431.png │ │ ├── 项目管理-300x217.png │ │ └── 项目管理-768x555.png │ ├── emoji │ │ └── 64.png │ ├── img │ │ ├── arrow.png │ │ ├── sort_asc.png │ │ ├── sort_desc.png │ │ ├── ajax-loader.gif │ │ ├── sort_asc_disabled.png │ │ └── cross-out.svg │ ├── tmp │ │ ├── img │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── bg1.jpg │ │ │ ├── bg10.jpg │ │ │ ├── bg2.jpg │ │ │ ├── bg3.jpg │ │ │ ├── bg4.jpg │ │ │ ├── bg5.jpg │ │ │ ├── bg6.jpg │ │ │ ├── bg7.jpg │ │ │ ├── bg8.jpg │ │ │ ├── bg9.jpg │ │ │ ├── avatar.jpg │ │ │ └── half-float-bg-1.jpg │ │ ├── on-boarding.json │ │ └── app-data.json │ ├── fonts │ │ ├── slick.eot │ │ ├── slick.ttf │ │ ├── slick.woff │ │ └── elementskit.woff │ ├── music │ │ ├── bong.mp3 │ │ ├── dong.mp3 │ │ ├── notification.mp3 │ │ ├── post-message.mp3 │ │ └── receive-message.mp3 │ ├── manifest.json │ └── logo.svg ├── app │ ├── routes │ │ ├── bot │ │ │ ├── bot │ │ │ │ ├── bot.component.less │ │ │ │ ├── bot.component.html │ │ │ │ └── bot.component.ts │ │ │ ├── bot-routing.module.ts │ │ │ └── bot.module.ts │ │ ├── pro │ │ │ ├── account │ │ │ │ ├── settings │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── cache.component.less │ │ │ │ │ │ ├── cache.component.ts │ │ │ │ │ │ └── cache.component.html │ │ │ │ │ ├── notification │ │ │ │ │ │ ├── notification.component.ts │ │ │ │ │ │ └── notification.component.html │ │ │ │ │ ├── security │ │ │ │ │ │ ├── security.component.ts │ │ │ │ │ │ └── security.component.html │ │ │ │ │ ├── settings.component.html │ │ │ │ │ ├── base │ │ │ │ │ │ └── base.component.less │ │ │ │ │ └── settings.component.less │ │ │ │ └── center │ │ │ │ │ ├── projects │ │ │ │ │ ├── projects.component.less │ │ │ │ │ ├── projects.component.ts │ │ │ │ │ └── projects.component.html │ │ │ │ │ ├── articles │ │ │ │ │ ├── articles.component.ts │ │ │ │ │ └── articles.component.html │ │ │ │ │ ├── applications │ │ │ │ │ ├── applications.component.less │ │ │ │ │ ├── applications.component.ts │ │ │ │ │ └── applications.component.html │ │ │ │ │ └── center.component.less │ │ │ ├── enterprise │ │ │ │ ├── settings │ │ │ │ │ ├── notification │ │ │ │ │ │ ├── notification.component.html │ │ │ │ │ │ └── notification.component.ts │ │ │ │ │ ├── structure │ │ │ │ │ │ └── structure.component.less │ │ │ │ │ ├── binding │ │ │ │ │ │ ├── binding.component.ts │ │ │ │ │ │ └── binding.component.html │ │ │ │ │ ├── plan │ │ │ │ │ │ └── plan.component.less │ │ │ │ │ ├── settings.component.html │ │ │ │ │ └── base │ │ │ │ │ │ └── base.component.less │ │ │ │ └── center │ │ │ │ │ ├── projects │ │ │ │ │ ├── projects.component.less │ │ │ │ │ ├── projects.component.ts │ │ │ │ │ └── projects.component.html │ │ │ │ │ ├── articles │ │ │ │ │ ├── articles.component.ts │ │ │ │ │ └── articles.component.html │ │ │ │ │ ├── applications │ │ │ │ │ ├── applications.component.less │ │ │ │ │ ├── applications.component.ts │ │ │ │ │ └── applications.component.html │ │ │ │ │ └── center.component.less │ │ │ └── profile │ │ │ │ ├── advanced │ │ │ │ ├── advanced.component.less │ │ │ │ └── advanced.component.ts │ │ │ │ └── basic │ │ │ │ ├── basic.component.html │ │ │ │ └── basic.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.less │ │ │ │ ├── lock.component.html │ │ │ │ └── lock.component.ts │ │ │ ├── verify │ │ │ │ ├── email-verify.component.less │ │ │ │ ├── email-verify.component.html │ │ │ │ └── email-verify.component.ts │ │ │ ├── register-result │ │ │ │ ├── register-result.component.ts │ │ │ │ └── register-result.component.html │ │ │ ├── register │ │ │ │ └── register.component.less │ │ │ └── login │ │ │ │ └── login.component.less │ │ ├── pricing │ │ │ └── pricing.component.ts │ │ ├── index │ │ │ └── index.component.ts │ │ ├── conversation │ │ │ ├── conversation.module.ts │ │ │ └── conversation-routing.module.ts │ │ └── routes.module.ts │ ├── layout │ │ ├── fullscreen │ │ │ ├── fullscreen.component.html │ │ │ └── fullscreen.component.ts │ │ ├── default │ │ │ ├── default.component.html │ │ │ ├── header │ │ │ │ ├── index.md │ │ │ │ ├── header.component.html │ │ │ │ └── components │ │ │ │ │ ├── fullscreen.component.ts │ │ │ │ │ ├── storage.component.ts │ │ │ │ │ └── user.component.ts │ │ │ ├── sidebar │ │ │ │ ├── sidebar.component.ts │ │ │ │ └── sidebar.component.html │ │ │ ├── theme-btn │ │ │ │ ├── theme-btn.component.less │ │ │ │ └── theme-btn.component.html │ │ │ └── setting-drawer │ │ │ │ ├── setting-drawer-item.component.ts │ │ │ │ └── setting-drawer-item.component.html │ │ ├── front │ │ │ └── front.component.ts │ │ └── passport │ │ │ ├── passport.component.ts │ │ │ └── passport.component.html │ ├── shared │ │ ├── lib │ │ │ └── ngx-emoji-mart │ │ │ │ ├── picker.module.d.ts.__ivy_ngcc_bak │ │ │ │ ├── ngx-emoji │ │ │ │ ├── emoji.module.d.ts.__ivy_ngcc_bak │ │ │ │ ├── data │ │ │ │ │ ├── skins.d.ts │ │ │ │ │ ├── categories.d.ts │ │ │ │ │ ├── emojis.d.ts │ │ │ │ │ └── data.interfaces.d.ts │ │ │ │ ├── ctrl-ngx-emoji-mart-ngx-emoji.d.ts.__ivy_ngcc_bak │ │ │ │ ├── ctrl-ngx-emoji-mart-ngx-emoji.d.ts │ │ │ │ ├── emoji.module.d.ts.map │ │ │ │ ├── index.d.ts │ │ │ │ ├── ctrl-ngx-emoji-mart-ngx-emoji.d.ts.map │ │ │ │ ├── emoji.module.d.ts │ │ │ │ ├── emoji.service.d.ts.__ivy_ngcc_bak │ │ │ │ ├── emoji.service.d.ts.map │ │ │ │ ├── emoji.service.d.ts │ │ │ │ └── package.json │ │ │ │ ├── ctrl-ngx-emoji-mart.d.ts.__ivy_ngcc_bak │ │ │ │ ├── utils │ │ │ │ └── index.d.ts │ │ │ │ ├── svgs │ │ │ │ └── index.d.ts │ │ │ │ ├── ctrl-ngx-emoji-mart.d.ts │ │ │ │ ├── picker.module.d.ts.map │ │ │ │ ├── ctrl-ngx-emoji-mart.d.ts.map │ │ │ │ ├── public_api.d.ts │ │ │ │ ├── emoji-frequently.service.d.ts.__ivy_ngcc_bak │ │ │ │ ├── esm2015 │ │ │ │ ├── ctrl-ngx-emoji-mart.js │ │ │ │ ├── ngx-emoji │ │ │ │ │ ├── ctrl-ngx-emoji-mart-ngx-emoji.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── emoji.module.js │ │ │ │ │ └── data │ │ │ │ │ │ └── data.interfaces.js │ │ │ │ └── public_api.js │ │ │ │ ├── anchors.component.d.ts.__ivy_ngcc_bak │ │ │ │ ├── emoji-frequently.service.d.ts │ │ │ │ ├── emoji-frequently.service.d.ts.map │ │ │ │ ├── skins.component.d.ts.__ivy_ngcc_bak │ │ │ │ ├── anchors.component.d.ts.map │ │ │ │ ├── skins.component.d.ts.map │ │ │ │ ├── preview.component.d.ts.__ivy_ngcc_bak │ │ │ │ ├── emoji-search.service.d.ts.__ivy_ngcc_bak │ │ │ │ ├── search.component.d.ts.__ivy_ngcc_bak │ │ │ │ ├── preview.component.d.ts.map │ │ │ │ ├── skins.component.d.ts │ │ │ │ ├── emoji-search.service.d.ts.map │ │ │ │ ├── anchors.component.d.ts │ │ │ │ ├── search.component.d.ts.map │ │ │ │ ├── LICENSE │ │ │ │ ├── emoji-search.service.d.ts │ │ │ │ ├── picker.module.d.ts │ │ │ │ ├── search.component.d.ts │ │ │ │ ├── preview.component.d.ts │ │ │ │ ├── category.component.d.ts.__ivy_ngcc_bak │ │ │ │ └── category.component.d.ts.map │ │ ├── index.ts │ │ ├── service │ │ │ ├── index.ts │ │ │ ├── subscribe.service.ts │ │ │ ├── echo.service.ts │ │ │ ├── notify.service.ts │ │ │ └── conversation.service.ts │ │ ├── json-schema │ │ │ ├── index.md │ │ │ └── json-schema.module.ts │ │ ├── utils │ │ │ └── yuan.ts │ │ ├── st-widget │ │ │ └── st-widget.module.ts │ │ └── README.md │ ├── core │ │ ├── README.md │ │ ├── index.ts │ │ ├── module-import-guard.ts │ │ └── core.module.ts │ ├── model │ │ └── common │ │ │ └── common.interface.ts │ └── app.component.ts ├── favicon.ico ├── typings.d.ts ├── styles.less ├── styles │ ├── variable.less │ ├── index.less │ └── theme.less ├── environments │ ├── environment.prod.ts │ ├── environment.hmr.ts │ └── environment.ts ├── robots.txt ├── test.ts ├── style-icons.ts ├── hmr.ts ├── favicon.svg └── main.ts ├── proxy.conf.json ├── _mock ├── README.md ├── index.ts ├── _geo.ts └── _pois.ts ├── scripts └── _ci │ ├── README.md │ ├── fix-mock.sh │ ├── delon.sh │ ├── deploy-pipelines.sh │ ├── deploy.sh │ └── github-comment.js ├── _cli-tpl └── test │ └── __path__ │ └── __name@dasherize@if-flat__ │ ├── __name@dasherize__.component.html │ ├── __name@dasherize__.component.spec.ts │ └── __name@dasherize__.component.ts ├── ng-alain.json ├── e2e ├── tsconfig.json ├── src │ ├── app.po.ts │ └── app.e2e-spec.ts └── protractor.conf.js ├── tsconfig.spec.json ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.base.json ├── LICENSE └── karma.conf.js /src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /src/assets/05/彩色-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/个人计划-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/人事管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/团队协作-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/客户管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/活动管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/组织管理-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/计划管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/设计管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/门店管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/项目管理-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页云-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/首页火箭-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-1024x740.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-1200x867.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-150x108.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-1536x1110.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-1980x1431.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-2048x1480.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-300x217.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes-768x555.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/05/彩色-2048x1480.png.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/routes/bot/bot/bot.component.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_mock/README.md: -------------------------------------------------------------------------------- 1 | [Document](https://ng-alain.com/mock) 2 | -------------------------------------------------------------------------------- /scripts/_ci/README.md: -------------------------------------------------------------------------------- 1 | # Only for CI, you can delete it 2 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/cache/cache.component.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/notification/notification.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/layout/fullscreen/fullscreen.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/favicon.ico -------------------------------------------------------------------------------- /src/assets/05/个人计划.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/个人计划.png -------------------------------------------------------------------------------- /src/assets/05/人事管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理.png -------------------------------------------------------------------------------- /src/assets/05/内容管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理.png -------------------------------------------------------------------------------- /src/assets/05/团队协作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/团队协作.png -------------------------------------------------------------------------------- /src/assets/05/客户管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理.png -------------------------------------------------------------------------------- /src/assets/05/彩色.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/彩色.png -------------------------------------------------------------------------------- /src/assets/05/活动管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理.png -------------------------------------------------------------------------------- /src/assets/05/涂改液.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/涂改液.png -------------------------------------------------------------------------------- /src/assets/05/简洁UI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/简洁UI.png -------------------------------------------------------------------------------- /src/assets/05/组织管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/组织管理.png -------------------------------------------------------------------------------- /src/assets/05/计划管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理.png -------------------------------------------------------------------------------- /src/assets/05/设计管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理.png -------------------------------------------------------------------------------- /src/assets/05/门店管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理.png -------------------------------------------------------------------------------- /src/assets/05/项目管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理.png -------------------------------------------------------------------------------- /src/assets/05/首页云.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/首页云.png -------------------------------------------------------------------------------- /src/assets/05/首页火箭.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/首页火箭.png -------------------------------------------------------------------------------- /src/assets/emoji/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/emoji/64.png -------------------------------------------------------------------------------- /src/assets/img/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/img/arrow.png -------------------------------------------------------------------------------- /src/assets/tmp/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/1.png -------------------------------------------------------------------------------- /src/assets/tmp/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/2.png -------------------------------------------------------------------------------- /src/assets/tmp/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/3.png -------------------------------------------------------------------------------- /src/assets/tmp/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/4.png -------------------------------------------------------------------------------- /src/assets/tmp/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/5.png -------------------------------------------------------------------------------- /src/assets/tmp/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/6.png -------------------------------------------------------------------------------- /src/assets/fonts/slick.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/fonts/slick.eot -------------------------------------------------------------------------------- /src/assets/fonts/slick.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/fonts/slick.ttf -------------------------------------------------------------------------------- /src/assets/fonts/slick.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/fonts/slick.woff -------------------------------------------------------------------------------- /src/assets/img/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/img/sort_asc.png -------------------------------------------------------------------------------- /src/assets/music/bong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/music/bong.mp3 -------------------------------------------------------------------------------- /src/assets/music/dong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/music/dong.mp3 -------------------------------------------------------------------------------- /src/assets/tmp/img/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg1.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg10.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg2.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg3.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg4.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg5.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg6.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg7.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg8.jpg -------------------------------------------------------------------------------- /src/assets/tmp/img/bg9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/bg9.jpg -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/picker.module.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | export declare class PickerModule { 2 | } 3 | -------------------------------------------------------------------------------- /src/assets/05/dot-shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/dot-shapes.png -------------------------------------------------------------------------------- /src/assets/img/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/img/sort_desc.png -------------------------------------------------------------------------------- /src/assets/tmp/img/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/avatar.jpg -------------------------------------------------------------------------------- /_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/05/人事管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/人事管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/人事管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/内容管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/内容管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/客户管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/客户管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/活动管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/活动管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/计划管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/计划管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/设计管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/设计管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/门店管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/门店管理-768x555.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-1024x740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-1024x740.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-1200x867.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-1200x867.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-150x108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-150x108.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-1536x1110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-1536x1110.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-1980x1431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-1980x1431.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-300x217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-300x217.png -------------------------------------------------------------------------------- /src/assets/05/项目管理-768x555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/05/项目管理-768x555.png -------------------------------------------------------------------------------- /src/assets/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/img/ajax-loader.gif -------------------------------------------------------------------------------- /src/app/core/README.md: -------------------------------------------------------------------------------- 1 | ### CoreModule 2 | 3 | **应** 仅只留 `providers` 属性。 4 | 5 | **作用:** 一些通用服务,例如:用户消息、HTTP数据访问。 6 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.module.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | export declare class EmojiModule { 2 | } 3 | -------------------------------------------------------------------------------- /src/assets/fonts/elementskit.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/fonts/elementskit.woff -------------------------------------------------------------------------------- /src/assets/music/notification.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/music/notification.mp3 -------------------------------------------------------------------------------- /src/assets/music/post-message.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/music/post-message.mp3 -------------------------------------------------------------------------------- /src/assets/img/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/img/sort_asc_disabled.png -------------------------------------------------------------------------------- /src/assets/music/receive-message.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/music/receive-message.mp3 -------------------------------------------------------------------------------- /src/assets/tmp/img/half-float-bg-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefu-chat/frontend/HEAD/src/assets/tmp/img/half-float-bg-1.jpg -------------------------------------------------------------------------------- /src/app/model/common/common.interface.ts: -------------------------------------------------------------------------------- 1 | export interface Res { 2 | success: boolean; 3 | data: T; 4 | message?: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/data/skins.d.ts: -------------------------------------------------------------------------------- 1 | import { SkinData } from './data.interfaces'; 2 | export declare const skins: SkinData[]; 3 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ctrl-ngx-emoji-mart.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './public_api'; 5 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/utils/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare function intersect(a: any, b: any): any; 2 | export declare function measureScrollbar(): number; 3 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/data/categories.d.ts: -------------------------------------------------------------------------------- 1 | import { EmojiCategory } from './data.interfaces'; 2 | export declare const categories: EmojiCategory[]; 3 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | // # 3rd Party Library 2 | // If the library doesn't have typings available at `@types/`, 3 | // you can still use it by manually adding typings for it 4 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/data/emojis.d.ts: -------------------------------------------------------------------------------- 1 | import { CompressedEmojiData } from './data.interfaces'; 2 | export declare const emojis: CompressedEmojiData[]; 3 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './index'; 5 | -------------------------------------------------------------------------------- /src/app/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './i18n/i18n.service'; 2 | export * from './module-import-guard'; 3 | export * from './net/default.interceptor'; 4 | export * from './startup/startup.service'; 5 | -------------------------------------------------------------------------------- /src/app/shared/index.ts: -------------------------------------------------------------------------------- 1 | // Components 2 | 3 | // Utils 4 | export * from './utils/yuan'; 5 | 6 | // Module 7 | export * from './shared.module'; 8 | export * from './json-schema/json-schema.module'; 9 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/svgs/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare const categories: { 2 | [key: string]: string; 3 | }; 4 | export declare const search: { 5 | [key: string]: string; 6 | }; 7 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ctrl-ngx-emoji-mart.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './public_api'; 5 | 6 | //# sourceMappingURL=ctrl-ngx-emoji-mart.d.ts.map -------------------------------------------------------------------------------- /_mock/index.ts: -------------------------------------------------------------------------------- 1 | export * from './_profile'; 2 | export * from './_rule'; 3 | export * from './_api'; 4 | export * from './_chart'; 5 | export * from './_pois'; 6 | export * from './_user'; 7 | export * from './_geo'; 8 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './index'; 5 | 6 | //# sourceMappingURL=ctrl-ngx-emoji-mart-ngx-emoji.d.ts.map -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.module.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"emoji.module.d.ts","sources":["emoji.module.d.ts"],"names":[],"mappings":";;;AAAA;;;AACA","sourcesContent":["export declare class EmojiModule {\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/picker.module.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"picker.module.d.ts","sources":["picker.module.d.ts"],"names":[],"mappings":";;;;;;;;;;AAAA;;;AACA","sourcesContent":["export declare class PickerModule {\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/service/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./conversation.service"; 2 | export * from "./echo.service"; 3 | export * from "./notify.service"; 4 | export * from "./subscribe.service"; 5 | export * from "./conversation-list-source.service"; 6 | -------------------------------------------------------------------------------- /ng-alain.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/ng-alain/schema.json", 3 | "theme": { 4 | "list": [ 5 | { 6 | "theme": "dark" 7 | }, 8 | { 9 | "theme": "compact" 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/shared/json-schema/index.md: -------------------------------------------------------------------------------- 1 | # 建议统一在 `widgets` 目录下自定义小部件 2 | 3 | > 注:@delon/form 本身提供 nz-zorro-antd 数据录入组件的全部实现,以及若干第三方组件的代码,可从[widgets-third](https://github.com/ng-alain/delon/tree/master/packages/form/widgets-third)中获取并放置 `widgets` 目录下注册即可。 4 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "types": ["jasmine", "jasminewd2", "node"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/routes/exception/403.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'exception-403', 5 | template: ` `, 6 | }) 7 | export class Exception403Component {} 8 | -------------------------------------------------------------------------------- /src/app/routes/exception/404.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'exception-404', 5 | template: ` `, 6 | }) 7 | export class Exception404Component {} 8 | -------------------------------------------------------------------------------- /src/app/routes/exception/500.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'exception-500', 5 | template: ` `, 6 | }) 7 | export class Exception500Component {} 8 | -------------------------------------------------------------------------------- /src/assets/img/cross-out.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/routes/passport/lock/lock.component.less: -------------------------------------------------------------------------------- 1 | :host ::ng-deep { 2 | .ant-card-body { 3 | position: relative; 4 | margin-top: 80px; 5 | } 6 | .avatar { 7 | position: absolute; 8 | top: -20px; 9 | left: 50%; 10 | margin-left: -20px; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/styles.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/system/index"; 2 | @import "~@delon/abc/index"; 3 | @import "~@delon/chart/index"; 4 | @import "~@delon/theme/layout/default/index"; 5 | @import "~@delon/theme/layout/fullscreen/index"; 6 | 7 | @import "./styles/index"; 8 | @import "./styles/theme"; 9 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ctrl-ngx-emoji-mart.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ctrl-ngx-emoji-mart.d.ts","sources":["ctrl-ngx-emoji-mart.d.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\nexport * from './public_api';\n"]} -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts", "src/polyfills.ts"], 8 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/app/routes/passport/verify/email-verify.component.less: -------------------------------------------------------------------------------- 1 | :host ::ng-deep { 2 | .ant-card-body { 3 | position: relative; 4 | margin-top: 80px; 5 | } 6 | .avatar { 7 | position: absolute; 8 | top: -20px; 9 | left: 50%; 10 | margin-left: -20px; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './data/categories'; 2 | export * from './data/data.interfaces'; 3 | export * from './data/emojis'; 4 | export * from './data/skins'; 5 | export * from './emoji.component'; 6 | export * from './emoji.module'; 7 | export * from './emoji.service'; 8 | -------------------------------------------------------------------------------- /src/app/shared/utils/yuan.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 转化成RMB元字符串 3 | * @param digits 当数字类型时,允许指定小数点后数字的个数,默认2位小数 4 | */ 5 | export function yuan(value: number | string, digits: number = 2): string { 6 | if (typeof value === 'number') { 7 | value = value.toFixed(digits); 8 | } 9 | return `¥ ${value}`; 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": ["node"] 6 | }, 7 | "files": ["src/main.ts", "src/polyfills.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["src/test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /src/app/core/module-import-guard.ts: -------------------------------------------------------------------------------- 1 | // https://angular.io/guide/styleguide#style-04-12 2 | export function throwIfAlreadyLoaded(parentModule: any, moduleName: string): void { 3 | if (parentModule) { 4 | throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ctrl-ngx-emoji-mart-ngx-emoji.d.ts","sources":["ctrl-ngx-emoji-mart-ngx-emoji.d.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n"]} -------------------------------------------------------------------------------- /src/app/layout/default/default.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
7 | -------------------------------------------------------------------------------- /src/styles/variable.less: -------------------------------------------------------------------------------- 1 | @alain-default-content-heading-border: 0; 2 | @alain-default-aside-nav-text-color: #b9babb; 3 | @tabs-highlight-color: #24292e; 4 | @tabs-ink-bar-color: #000; 5 | @alain-default-content-bg: transparent; 6 | @border-width-base: 1px; 7 | @comment-padding-base: 0; 8 | @outline-width: 0; 9 | @divider-color: #eee; 10 | -------------------------------------------------------------------------------- /e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText(): Promise { 9 | return element(by.css('app-root h1')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /scripts/_ci/fix-mock.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | cd $(dirname $0)/../.. 6 | 7 | ROOT_DIR="$(pwd)" 8 | 9 | sed -i '' 's/if (true)/if (!environment.production)/g' ${ROOT_DIR}/src/app/global-config.module.ts 10 | sed -i '' 's/if (true)/if (!environment.production)/g' ${ROOT_DIR}/src/app/layout/default/default.component.ts 11 | -------------------------------------------------------------------------------- /src/app/core/core.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, Optional, SkipSelf } from '@angular/core'; 2 | import { throwIfAlreadyLoaded } from './module-import-guard'; 3 | 4 | @NgModule({ 5 | providers: [], 6 | }) 7 | export class CoreModule { 8 | constructor(@Optional() @SkipSelf() parentModule: CoreModule) { 9 | throwIfAlreadyLoaded(parentModule, 'CoreModule'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/layout/fullscreen/fullscreen.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'layout-fullscreen', 5 | templateUrl: './fullscreen.component.html', 6 | // tslint:disable-next-line: no-host-metadata-property 7 | host: { 8 | '[class.alain-fullscreen]': 'true', 9 | }, 10 | }) 11 | export class LayoutFullScreenComponent {} 12 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/public_api.d.ts: -------------------------------------------------------------------------------- 1 | export * from './anchors.component'; 2 | export * from './category.component'; 3 | export * from './emoji-frequently.service'; 4 | export * from './emoji-search.service'; 5 | export * from './picker.component'; 6 | export * from './picker.module'; 7 | export * from './preview.component'; 8 | export * from './search.component'; 9 | export * from './skins.component'; 10 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/structure/structure.component.less: -------------------------------------------------------------------------------- 1 | .btn-theme { 2 | border-width: 2px; 3 | border-color: #ffffff; 4 | } 5 | 6 | .ant-radio-button-wrapper-checked.btn-theme::before { 7 | display: none; 8 | } 9 | 10 | .ant-radio-button-wrapper-checked.btn-theme { 11 | border-color: #1890ff !important; 12 | border-left-color: #1890ff !important; 13 | border-right-color: #1890ff !important; 14 | } -------------------------------------------------------------------------------- /src/app/layout/default/header/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | component: app-header 3 | title: 顶部菜单 4 | --- 5 | 6 | 顶部菜单组件允许通过 `components` 目录下的组件进行按需组装。 7 | 8 | ## 组件列表 9 | 10 | 组件名 | 说明 11 | ----|------ 12 | `header-fullscreen` | 全屏切换 13 | `header-icon` | 应用图标 14 | `header-langs` | 语言切换 15 | `header-notify` | 菜单通知 16 | `header-search` | 搜索框 17 | `header-storage` | 清除 LocalStorage 缓存 18 | `header-task` | 任务通知 19 | `header-theme` | 主题切换 20 | `header-user` | 用户菜单 21 | -------------------------------------------------------------------------------- /src/app/routes/bot/bot-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { RouterModule, Routes } from "@angular/router"; 3 | import { BotComponent } from "./bot/bot.component"; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: "bot", 8 | component: BotComponent, 9 | }, 10 | ]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule], 15 | }) 16 | export class BotRoutingModule {} 17 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | SERVER_URL: `./`, 3 | apiUrl: `https://api.kefu.chat/`, 4 | socketHost: `https://api.kefu.chat/`, 5 | widgetHost: `https://assets.kefu.chat/`, 6 | production: true, 7 | useHash: false, 8 | hmr: false, 9 | version: require('../../package.json').version, 10 | notificationKey: 'BABHGEaUywW5fuU4TyEE_0Qx9s4uHcpuwgbvJaXCe5EO6sP0jh_qT24cuRAr7Rmndz2mULSYuRb_lWMlElr1d_Y', 11 | }; 12 | -------------------------------------------------------------------------------- /src/app/routes/pro/profile/advanced/advanced.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | :host { 3 | ::ng-deep { 4 | @media screen and (max-width: @screen-sm) { 5 | .desc { 6 | left: 8px; 7 | } 8 | } 9 | .desc { 10 | position: relative; 11 | left: 38px; 12 | font-size: @font-size-base; 13 | & > div { 14 | margin-top: 8px; 15 | margin-bottom: 4px; 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/binding/binding.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | import { _HttpClient } from "@delon/theme"; 3 | import { NzMessageService } from "ng-zorro-antd/message"; 4 | 5 | @Component({ 6 | selector: "app-enterprise-settings-binding", 7 | templateUrl: "./binding.component.html", 8 | }) 9 | export class ProEnterpriseSettingsBindingComponent { 10 | constructor(public msg: NzMessageService) {} 11 | } 12 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.module.d.ts: -------------------------------------------------------------------------------- 1 | import * as ɵngcc0 from '@angular/core'; 2 | import * as ɵngcc1 from './emoji.component'; 3 | import * as ɵngcc2 from '@angular/common'; 4 | export declare class EmojiModule { 5 | static ɵmod: ɵngcc0.ɵɵNgModuleDefWithMeta; 6 | static ɵinj: ɵngcc0.ɵɵInjectorDef; 7 | } 8 | 9 | //# sourceMappingURL=emoji.module.d.ts.map -------------------------------------------------------------------------------- /src/styles/index.less: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | .alain-default__header { 3 | height: 0; 4 | } 5 | .alain-default__content { 6 | margin: 0; 7 | } 8 | @media (min-width: 767px) { 9 | .setheight { 10 | margin-left: 64px !important; 11 | } 12 | } 13 | .setheight { 14 | height: calc(100% - 0px); 15 | margin-top: 0 !important; 16 | } 17 | .alain-default__aside { 18 | margin-top: 0; 19 | } 20 | .alain-default { 21 | height: 100%; 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. 3 | It is not intended to be used to perform a compilation. 4 | 5 | To learn more about this file see: https://angular.io/config/solution-tsconfig. 6 | */ 7 | { 8 | "files": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /src/app/routes/pricing/pricing.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@angular/core"; 2 | import { Router } from "@angular/router"; 3 | import { _HttpClient } from "@delon/theme"; 4 | 5 | @Component({ 6 | selector: "app-pricing", 7 | templateUrl: "./pricing.component.html", 8 | styleUrls: [ 9 | "../../layout/front/front.component.css", 10 | "./pricing.component.css", 11 | ], 12 | }) 13 | export class PricingComponent { 14 | constructor(private http: _HttpClient, public router: Router) {} 15 | } 16 | -------------------------------------------------------------------------------- /src/styles/theme.less: -------------------------------------------------------------------------------- 1 | // You can directly set the default theme 2 | // - `default` Default theme 3 | // - `dark` Import the official dark less style file 4 | // - `compact` Import the official compact less style file 5 | @import "~@delon/theme/theme-default.less"; 6 | 7 | // ==========The following is the custom theme variable area========== 8 | // The theme paraments can be generated at https://ng-alain.github.io/ng-alain/ 9 | // @primary-color: #f50; 10 | @import "variable.less"; 11 | @import "global.less"; 12 | -------------------------------------------------------------------------------- /src/app/routes/bot/bot.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { SharedModule } from "@shared"; 3 | import { BotComponent } from "./bot/bot.component"; 4 | import { BotRoutingModule } from "./bot-routing.module" 5 | 6 | const COMPONENTS = []; 7 | const COMPONENTS_NOROUNT = []; 8 | 9 | @NgModule({ 10 | imports: [SharedModule, BotRoutingModule], 11 | declarations: [ 12 | ...COMPONENTS, 13 | ...COMPONENTS_NOROUNT, 14 | BotComponent 15 | ], 16 | }) 17 | export class BotModule {} 18 | -------------------------------------------------------------------------------- /src/app/routes/bot/bot/bot.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 自动 4 |
5 |
6 | 7 |

15 | 自动化功能正在研发中,敬请期待! 16 |

17 |
18 |
19 | 20 | -------------------------------------------------------------------------------- /scripts/_ci/delon.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # bash ./scripts/_ci/delon.sh 4 | 5 | set -e 6 | 7 | cd $(dirname $0)/../.. 8 | 9 | echo "Download latest @delon version" 10 | rm -rf delon-builds 11 | git clone --depth 1 https://github.com/ng-alain/delon-builds.git 12 | rm -rf node_modules/@delon 13 | rm -rf node_modules/ng-alain 14 | rsync -am delon-builds/ node_modules/ 15 | NG_ALAIN_VERSION=$(node -p "require('./node_modules/ng-alain/package.json').version") 16 | echo "Using ng-alain version: ${NG_ALAIN_VERSION}" 17 | -------------------------------------------------------------------------------- /src/app/routes/passport/verify/email-verify.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/notification/notification.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | 3 | @Component({ 4 | selector: "app-enterprise-settings-notification", 5 | templateUrl: "./notification.component.html", 6 | }) 7 | export class ProEnterpriseSettingsNotificationComponent { 8 | i: { 9 | password: boolean; 10 | messages: boolean; 11 | todo: boolean; 12 | } = { 13 | password: true, 14 | messages: true, 15 | todo: true, 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-frequently.service.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { EmojiData } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 2 | export declare class EmojiFrequentlyService { 3 | NAMESPACE: string; 4 | frequently: { 5 | [key: string]: number; 6 | } | null; 7 | defaults: { 8 | [key: string]: number; 9 | }; 10 | initialized: boolean; 11 | DEFAULTS: string[]; 12 | init(): void; 13 | add(emoji: EmojiData): void; 14 | get(perLine: number, totalLines: number): any[]; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/shared/service/subscribe.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | import { Observable } from "rxjs"; 3 | import { Subject } from "rxjs"; 4 | interface Message { 5 | type: string; 6 | data: any; 7 | } 8 | 9 | @Injectable({ 10 | providedIn: "root", 11 | }) 12 | export class SubscribeService { 13 | private subject = new Subject(); 14 | 15 | send(v: Message): void { 16 | this.subject.next(v); 17 | } 18 | 19 | on(): Observable { 20 | return this.subject.asObservable(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "客服洽", 3 | "short_name": "Kefu.Chat", 4 | "scope": ".", 5 | "start_url": "/", 6 | "icons": [ 7 | { 8 | "src": "/android-chrome-192x192.png?v=NmbWaqEWWA", 9 | "sizes": "192x192", 10 | "type": "image/png" 11 | }, 12 | { 13 | "src": "/android-chrome-512x512.png?v=NmbWaqEWWA", 14 | "sizes": "512x512", 15 | "type": "image/png" 16 | } 17 | ], 18 | "theme_color": "#ffffff", 19 | "background_color": "#ffffff", 20 | "display": "standalone" 21 | } 22 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/projects/projects.component.less: -------------------------------------------------------------------------------- 1 | :host ::ng-deep { 2 | .ant-card-meta-title { 3 | margin-bottom: 4px; 4 | } 5 | .ant-card-meta-description { 6 | height: 44px; 7 | overflow: hidden; 8 | line-height: 22px; 9 | } 10 | nz-list nz-card { 11 | margin-bottom: 0 !important; 12 | } 13 | .card-item-content { 14 | display: flex; 15 | justify-content: space-between; 16 | height: 20px; 17 | margin-top: 16px; 18 | margin-bottom: -4px; 19 | line-height: 20px; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/projects/projects.component.less: -------------------------------------------------------------------------------- 1 | :host ::ng-deep { 2 | .ant-card-meta-title { 3 | margin-bottom: 4px; 4 | } 5 | .ant-card-meta-description { 6 | height: 44px; 7 | overflow: hidden; 8 | line-height: 22px; 9 | } 10 | nz-list nz-card { 11 | margin-bottom: 0 !important; 12 | } 13 | .card-item-content { 14 | display: flex; 15 | justify-content: space-between; 16 | height: 20px; 17 | margin-top: 16px; 18 | margin-bottom: -4px; 19 | line-height: 20px; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/shared/st-widget/st-widget.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | // import { STWidgetRegistry } from '@delon/abc/st'; 3 | import { SharedModule } from '../shared.module'; 4 | 5 | export const STWIDGET_COMPONENTS = []; 6 | 7 | @NgModule({ 8 | declarations: STWIDGET_COMPONENTS, 9 | imports: [SharedModule], 10 | exports: [...STWIDGET_COMPONENTS], 11 | }) 12 | export class STWidgetModule { 13 | // constructor(widgetRegistry: STWidgetRegistry) { 14 | // widgetRegistry.register(STImgWidget.KEY, STImgWidget); 15 | // } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/shared/README.md: -------------------------------------------------------------------------------- 1 | # ShareModule 2 | 3 | **应** 包含定义: 4 | 5 | + 应用通用自定义业务组件 6 | 7 | **应** 导出所有包含的模块。 8 | 9 | **不应** 有 `providers` 属性。 10 | 11 | ## 自定义全局组件或指令 12 | 13 | 每一个组件或指令应该有一个完整的说明文件,**建议**一个合理的目录结构应该是: 14 | 15 | ``` 16 | ├── components 17 | │   ├── comp1 18 | │   │   ├── index.ts 19 | │   │   ├── README.md 20 | │   ├── comp2 21 | │   │   ├── index.ts 22 | │   │   ├── README.md 23 | ├── directives 24 | │   ├── dire1 25 | │   │   ├── index.ts 26 | │   │   ├── README.md 27 | │   ├── dire2 28 | │   │   ├── index.ts 29 | │   │   ├── README.md 30 | ``` 31 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/ctrl-ngx-emoji-mart.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from "./public_api"; 5 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RybC1uZ3gtZW1vamktbWFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGlja2VyL2N0cmwtbmd4LWVtb2ppLW1hcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ== 6 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/notification/notification.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | 3 | @Component({ 4 | selector: "app-account-settings-notification", 5 | templateUrl: "./notification.component.html", 6 | changeDetection: ChangeDetectionStrategy.OnPush, 7 | }) 8 | export class ProAccountSettingsNotificationComponent { 9 | i: { 10 | password: boolean; 11 | messages: boolean; 12 | todo: boolean; 13 | } = { 14 | password: true, 15 | messages: true, 16 | todo: true, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/app/layout/default/header/header.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 6 | 7 |
-------------------------------------------------------------------------------- /src/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | 4 | User-agent: SemrushBot 5 | Disallow: / 6 | 7 | User-agent: SemrushBot-SA 8 | Disallow: / 9 | 10 | User-agent: SemrushBot-BA 11 | Disallow: / 12 | 13 | User-agent: SemrushBot-SI 14 | Disallow: / 15 | 16 | User-agent: SemrushBot-SWA 17 | Disallow: / 18 | 19 | User-agent: SemrushBot-CT 20 | Disallow: / 21 | 22 | User-agent: SemrushBot-BM 23 | Disallow: / 24 | 25 | User-agent: AhrefsBot 26 | Disallow: / 27 | 28 | User-agent: CCBot 29 | Disallow: / 30 | 31 | User-agent: YisouSpider 32 | Disallow: / 33 | 34 | User-agent: DotBot 35 | Disallow: / -------------------------------------------------------------------------------- /src/app/layout/default/sidebar/sidebar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { SettingsService, User as SystemUser } from '@delon/theme'; 3 | import { User } from "@model/application/conversation.interface"; 4 | 5 | @Component({ 6 | selector: 'layout-sidebar', 7 | templateUrl: './sidebar.component.html', 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class SidebarComponent { 11 | get user(): SystemUser | User { 12 | return this.settings.user; 13 | } 14 | 15 | constructor(private settings: SettingsService) {} 16 | } 17 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './index'; 5 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RybC1uZ3gtZW1vamktbWFydC1uZ3gtZW1vamkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BpY2tlci9uZ3gtZW1vamkvY3RybC1uZ3gtZW1vamktbWFydC1uZ3gtZW1vamkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0= -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/cache/cache.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | import { NzMessageService } from "ng-zorro-antd/message"; 3 | import { environment } from "@env/environment"; 4 | 5 | @Component({ 6 | selector: "app-account-settings-cache", 7 | templateUrl: "./cache.component.html", 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class ProAccountSettingsCacheComponent { 11 | public caches = caches; 12 | public environment = environment; 13 | 14 | constructor( 15 | public msg: NzMessageService 16 | ) { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/anchors.component.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import { EmojiCategory } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 3 | export declare class AnchorsComponent { 4 | categories: EmojiCategory[]; 5 | color?: string; 6 | selected?: string; 7 | i18n: any; 8 | icons: { 9 | [key: string]: string; 10 | }; 11 | anchorClick: EventEmitter<{ 12 | category: EmojiCategory; 13 | index: number; 14 | }>; 15 | trackByFn(idx: number, cat: EmojiCategory): string; 16 | handleClick($event: Event, index: number): void; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/layout/default/theme-btn/theme-btn.component.less: -------------------------------------------------------------------------------- 1 | @import '~@delon/theme/index'; 2 | 3 | :host ::ng-deep { 4 | position: fixed; 5 | right: 32px; 6 | bottom: 102px; 7 | z-index: 2147483640; 8 | display: flex; 9 | flex-direction: column; 10 | cursor: pointer; 11 | &-active { 12 | width: 44px; 13 | height: 44px; 14 | color: @primary-color; 15 | font-size: 22px; 16 | line-height: 44px; 17 | } 18 | .ant-avatar { 19 | color: #000; 20 | background-color: #fff; 21 | box-shadow: @shadow-2; 22 | transition: color 0.3s; 23 | &:hover { 24 | color: @primary-color; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/routes/passport/register-result/register-result.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | import { NzMessageService } from 'ng-zorro-antd/message'; 4 | 5 | @Component({ 6 | selector: 'passport-register-result', 7 | templateUrl: './register-result.component.html', 8 | }) 9 | export class UserRegisterResultComponent { 10 | params = { email: '' }; 11 | email = ''; 12 | constructor(route: ActivatedRoute, public msg: NzMessageService) { 13 | route.queryParams.subscribe(({email}) => { 14 | this.params.email = this.email = email; 15 | }) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/routes/bot/bot/bot.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { SettingsService, _HttpClient, User as SystemUser } from "@delon/theme"; 3 | import { 4 | User, 5 | } from "@model/application/conversation.interface"; 6 | 7 | @Component({ 8 | selector: "app-bot", 9 | templateUrl: "./bot.component.html", 10 | styleUrls: ["./bot.component.less"], 11 | }) 12 | export class BotComponent implements OnInit { 13 | get user(): SystemUser | User { 14 | return this.settings.user; 15 | } 16 | 17 | constructor( 18 | private settings: SettingsService 19 | ) { 20 | } 21 | 22 | ngOnInit(): void { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/routes/passport/register-result/register-result.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | {{ 'app.register-result.msg' | translate: params }} 5 |
6 |
7 | 10 | 13 |
14 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-frequently.service.d.ts: -------------------------------------------------------------------------------- 1 | import { EmojiData } from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 2 | import * as ɵngcc0 from "@angular/core"; 3 | export declare class EmojiFrequentlyService { 4 | NAMESPACE: string; 5 | frequently: { 6 | [key: string]: number; 7 | } | null; 8 | defaults: { 9 | [key: string]: number; 10 | }; 11 | initialized: boolean; 12 | DEFAULTS: string[]; 13 | init(): void; 14 | add(emoji: EmojiData): void; 15 | get(perLine: number, totalLines: number): any[]; 16 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 17 | } 18 | 19 | //# sourceMappingURL=emoji-frequently.service.d.ts.map 20 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-frequently.service.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"emoji-frequently.service.d.ts","sources":["emoji-frequently.service.d.ts"],"names":[],"mappings":"AAAA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA","sourcesContent":["import { EmojiData } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nexport declare class EmojiFrequentlyService {\n NAMESPACE: string;\n frequently: {\n [key: string]: number;\n } | null;\n defaults: {\n [key: string]: number;\n };\n initialized: boolean;\n DEFAULTS: string[];\n init(): void;\n add(emoji: EmojiData): void;\n get(perLine: number, totalLines: number): any[];\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/skins.component.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from '@angular/core'; 2 | import { Emoji } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 3 | export declare class SkinComponent { 4 | /** currently selected skin */ 5 | skin?: Emoji['skin']; 6 | i18n: any; 7 | changeSkin: EventEmitter; 8 | opened: boolean; 9 | skinTones: number[]; 10 | toggleOpen(): void; 11 | isSelected(skinTone: Emoji['skin']): boolean; 12 | isVisible(skinTone: Emoji['skin']): boolean; 13 | pressed(skinTone: Emoji['skin']): boolean | ""; 14 | tabIndex(skinTone: Emoji['skin']): "" | "0"; 15 | expanded(skinTone: Emoji['skin']): boolean | ""; 16 | handleClick(skin: number): void; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/articles/articles.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | 8 | @Component({ 9 | selector: "app-account-center-articles", 10 | templateUrl: "./articles.component.html", 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ProAccountCenterArticlesComponent { 14 | list: any[]; 15 | 16 | constructor(private http: _HttpClient, private cdr: ChangeDetectorRef) { 17 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 18 | this.list = res; 19 | this.cdr.markForCheck(); 20 | this.cdr.detectChanges(); 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/articles/articles.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | 8 | @Component({ 9 | selector: "app-enterprise-center-articles", 10 | templateUrl: "./articles.component.html", 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ProEnterpriseCenterArticlesComponent { 14 | list: any[]; 15 | 16 | constructor(private http: _HttpClient, private cdr: ChangeDetectorRef) { 17 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 18 | this.list = res; 19 | this.cdr.markForCheck(); 20 | this.cdr.detectChanges(); 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/anchors.component.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"anchors.component.d.ts","sources":["anchors.component.d.ts"],"names":[],"mappings":"AAAA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA","sourcesContent":["import { EventEmitter } from '@angular/core';\nimport { EmojiCategory } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nexport declare class AnchorsComponent {\n categories: EmojiCategory[];\n color?: string;\n selected?: string;\n i18n: any;\n icons: {\n [key: string]: string;\n };\n anchorClick: EventEmitter<{\n category: EmojiCategory;\n index: number;\n }>;\n trackByFn(idx: number, cat: EmojiCategory): string;\n handleClick($event: Event, index: number): void;\n}\n"]} -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // tslint:disable: ordered-imports 2 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 3 | 4 | import 'zone.js/dist/zone-testing'; 5 | import { getTestBed } from '@angular/core/testing'; 6 | import { 7 | BrowserDynamicTestingModule, 8 | platformBrowserDynamicTesting 9 | } from '@angular/platform-browser-dynamic/testing'; 10 | 11 | declare const require: any; 12 | 13 | // First, initialize the Angular testing environment. 14 | getTestBed().initTestEnvironment( 15 | BrowserDynamicTestingModule, 16 | platformBrowserDynamicTesting() 17 | ); 18 | 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /src/environments/environment.hmr.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | SERVER_URL: `./`, 7 | production: false, 8 | useHash: true, 9 | hmr: true, 10 | }; 11 | 12 | /* 13 | * In development mode, to ignore zone related error stack frames such as 14 | * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can 15 | * import the following file, but please comment it out in production mode 16 | * because it will have performance impact when throw error 17 | */ 18 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 19 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/security/security.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | import { SettingsService, User as SystemUser, _HttpClient } from "@delon/theme"; 3 | import { User } from '@model/application/conversation.interface'; 4 | import { NzMessageService } from "ng-zorro-antd/message"; 5 | 6 | @Component({ 7 | selector: "app-account-settings-security", 8 | templateUrl: "./security.component.html", 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ProAccountSettingsSecurityComponent { 12 | constructor( 13 | public msg: NzMessageService, 14 | private settings: SettingsService 15 | ) {} 16 | 17 | get user(): SystemUser | User { 18 | return this.settings.user; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/assets/tmp/on-boarding.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/@delon/abc/onboarding/schema.json", 3 | "maskClosable": false, 4 | "items": [ 5 | { 6 | "selectors": ".alain-default__nav li .alain-default__nav-item", 7 | "title": "Click here to switch to shrink main menu", 8 | "lightStyle": "background-color: rgba(255, 255, 255, 0.2)" 9 | }, 10 | { 11 | "selectors": ".alain-default__search", 12 | "title": "You can search for people, file, photos...", 13 | "lightStyle": "background-color: rgba(255, 255, 255, 0.2)" 14 | }, 15 | { 16 | "selectors": ".setting-drawer__handle", 17 | "title": "You can customize your theme", 18 | "lightStyle": "background-color: rgba(255, 255, 255, 0.2)" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/style-icons.ts: -------------------------------------------------------------------------------- 1 | // Custom icon static resources 2 | 3 | import { 4 | BulbOutline, 5 | CommentOutline, 6 | ExceptionOutline, 7 | InfoOutline, 8 | InfoCircleTwoTone, 9 | LinkOutline, 10 | PhoneOutline, 11 | ProfileOutline, 12 | SendOutline, 13 | SmileOutline, 14 | ThunderboltOutline, 15 | CheckCircleTwoTone, 16 | CloseCircleTwoTone, 17 | QuestionCircleTwoTone, 18 | } from "@ant-design/icons-angular/icons"; 19 | 20 | export const ICONS = [ 21 | InfoOutline, 22 | InfoCircleTwoTone, 23 | BulbOutline, 24 | ProfileOutline, 25 | ExceptionOutline, 26 | LinkOutline, 27 | ThunderboltOutline, 28 | SmileOutline, 29 | SendOutline, 30 | CommentOutline, 31 | PhoneOutline, 32 | CheckCircleTwoTone, 33 | CloseCircleTwoTone, 34 | QuestionCircleTwoTone, 35 | ]; 36 | -------------------------------------------------------------------------------- /src/app/shared/service/echo.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | import { environment } from "@env/environment"; 3 | import Echo from "laravel-echo"; 4 | import io from "socket.io-client"; 5 | 6 | @Injectable({ 7 | providedIn: "root", 8 | }) 9 | export class EchoService { 10 | Echo: any; 11 | constructor() {} 12 | 13 | init(): void { 14 | const store = JSON.parse(localStorage.getItem("_token")); 15 | if (store) { 16 | const token = store.token; 17 | 18 | this.Echo = new Echo({ 19 | client: io, 20 | broadcaster: "socket.io", 21 | host: environment.socketHost, 22 | auth: { 23 | headers: { 24 | Authorization: `Bearer ${token}`, 25 | }, 26 | }, 27 | }); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { browser, logging } from 'protractor'; 2 | import { AppPage } from './app.po'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', () => { 12 | page.navigateTo(); 13 | expect(page.getTitleText()).toEqual('Welcome to ng8!'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser 19 | .manage() 20 | .logs() 21 | .get(logging.Type.BROWSER); 22 | expect(logs).not.toContain( 23 | jasmine.objectContaining({ 24 | level: logging.Level.SEVERE, 25 | } as logging.Entry), 26 | ); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /src/app/layout/front/front.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@angular/core"; 2 | import { DeviceDetectorService } from 'ngx-device-detector'; 3 | import { Router } from '@angular/router'; 4 | import { _HttpClient } from "@delon/theme"; 5 | 6 | @Component({ 7 | selector: "app-front", 8 | templateUrl: "./front.component.html", 9 | styleUrls: ["./front.component.css", ], 10 | }) 11 | export class LayoutFrontComponent { 12 | constructor( 13 | public router: Router, 14 | private deviceService: DeviceDetectorService 15 | ) { 16 | } 17 | 18 | toLogin() { 19 | const isMobile = this.deviceService.isMobile(); 20 | if (isMobile) { 21 | location.href = '//h5.kefu.chat'; 22 | } else { 23 | this.router.navigateByUrl('/login'); 24 | } 25 | return; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/routes/exception/exception-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | import { Exception403Component } from './403.component'; 5 | import { Exception404Component } from './404.component'; 6 | import { Exception500Component } from './500.component'; 7 | import { ExceptionTriggerComponent } from './trigger.component'; 8 | 9 | const routes: Routes = [ 10 | { path: '403', component: Exception403Component }, 11 | { path: '404', component: Exception404Component }, 12 | { path: '500', component: Exception500Component }, 13 | { path: 'trigger', component: ExceptionTriggerComponent }, 14 | ]; 15 | 16 | @NgModule({ 17 | imports: [RouterModule.forChild(routes)], 18 | exports: [RouterModule], 19 | }) 20 | export class ExceptionRoutingModule {} 21 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/cache/cache.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 当前缓存版本:{{environment.version}} 6 | 7 | 8 | 9 | 10 | 11 | 清除 12 | 13 | 14 | 15 | 16 | 若发生功能异常,请尝试清理缓存 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/app/routes/exception/exception.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { SharedModule } from '@shared'; 3 | 4 | import { ExceptionRoutingModule } from './exception-routing.module'; 5 | 6 | import { Exception403Component } from './403.component'; 7 | import { Exception404Component } from './404.component'; 8 | import { Exception500Component } from './500.component'; 9 | import { ExceptionTriggerComponent } from './trigger.component'; 10 | 11 | const COMPONENTS = [Exception403Component, Exception404Component, Exception500Component, ExceptionTriggerComponent]; 12 | const COMPONENTS_NOROUNT = []; 13 | 14 | @NgModule({ 15 | imports: [SharedModule, ExceptionRoutingModule], 16 | declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT], 17 | entryComponents: COMPONENTS_NOROUNT, 18 | }) 19 | export class ExceptionModule {} 20 | -------------------------------------------------------------------------------- /_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { <%= componentName %> } from './<%= dasherize(name) %>.component'; 3 | 4 | describe('<%= componentName %>', () => { 5 | let component: <%= componentName %>; 6 | let fixture: ComponentFixture<<%= componentName %>>; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [ <%= componentName %> ] 11 | }) 12 | .compileComponents(); 13 | })); 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(<%= componentName %>); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | }); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/app/layout/default/setting-drawer/setting-drawer-item.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | // tslint:disable-next-line:component-selector 5 | selector: 'setting-drawer-item', 6 | templateUrl: './setting-drawer-item.component.html', 7 | // tslint:disable-next-line: no-host-metadata-property 8 | host: { 9 | '[class.setting-drawer__body-item]': 'true', 10 | }, 11 | }) 12 | export class SettingDrawerItemComponent { 13 | i: any = {}; 14 | 15 | @Input() 16 | set data(val: any) { 17 | this.i = val; 18 | if (val.type === 'px') { 19 | this.pxVal = +val.value.replace('px', ''); 20 | } 21 | } 22 | 23 | pxVal: number; 24 | 25 | pxChange(val: number): void { 26 | this.i.value = `${val}px`; 27 | } 28 | 29 | format = (value: string) => `${value} px`; 30 | } 31 | -------------------------------------------------------------------------------- /src/app/routes/index/index.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@angular/core"; 2 | import { DeviceDetectorService } from 'ngx-device-detector'; 3 | import { Router } from '@angular/router'; 4 | import { _HttpClient } from "@delon/theme"; 5 | 6 | @Component({ 7 | selector: "app-index", 8 | templateUrl: "./index.component.html", 9 | styleUrls: ["../../layout/front/front.component.css"], 10 | }) 11 | export class IndexComponent { 12 | constructor( 13 | private http: _HttpClient, 14 | public router: Router, 15 | private deviceService: DeviceDetectorService 16 | ) { 17 | } 18 | 19 | toLogin() { 20 | const isMobile = this.deviceService.isMobile(); 21 | if (isMobile) { 22 | location.href = '//h5.kefu.chat'; 23 | } else { 24 | this.router.navigateByUrl('/login'); 25 | } 26 | return; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/shared/service/notify.service.ts: -------------------------------------------------------------------------------- 1 | export function askNotificationPermission(): Promise { 2 | return new Promise( 3 | (resolve: (result: string) => void, reject: () => void): void => { 4 | const permissionResult = Notification.requestPermission( 5 | (result: string) => { 6 | resolve(result); 7 | } 8 | ); 9 | 10 | if (permissionResult) { 11 | permissionResult.then(resolve, reject); 12 | } 13 | } 14 | ); 15 | } 16 | 17 | export function playIncomingAudio(): void { 18 | const audio = new Audio(); 19 | audio.src = "/assets/music/receive-message.mp3"; 20 | audio.load(); 21 | audio.play(); 22 | } 23 | 24 | export function playOutcomingAudio(): void { 25 | const audio = new Audio(); 26 | audio.src = "/assets/music/post-message.mp3"; 27 | audio.load(); 28 | audio.play(); 29 | } 30 | -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "downlevelIteration": true, 9 | "experimentalDecorators": true, 10 | "module": "es2020", 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "lib": ["es2018", "dom"], 15 | "paths": { 16 | "@shared": ["src/app/shared/index"], 17 | "@shared/*": ["src/app/shared/*"], 18 | "@core": ["src/app/core/index"], 19 | "@env/*": ["src/environments/*"], 20 | "@model/*": ["src/app/model/*"], 21 | "@service": ["src/app/shared/service"] 22 | } 23 | }, 24 | "angularCompilerOptions": { 25 | "fullTemplateTypeCheck": true, 26 | "strictInjectionParameters": true 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/hmr.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationRef, NgModuleRef } from '@angular/core'; 2 | import { createNewHosts } from '@angularclass/hmr'; 3 | import { NzModalService } from 'ng-zorro-antd/modal'; 4 | 5 | export const hmrBootstrap = (module: any, bootstrap: () => Promise>) => { 6 | let ngModule: NgModuleRef; 7 | module.hot.accept(); 8 | bootstrap().then((mod) => (ngModule = mod)); 9 | module.hot.dispose(() => { 10 | const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef); 11 | const modalService = ngModule.injector.get(NzModalService, null) as NzModalService; 12 | if (modalService) { 13 | modalService.closeAll(); 14 | } 15 | const elements = appRef.components.map((c) => c.location.nativeElement); 16 | const makeVisible = createNewHosts(elements); 17 | ngModule.destroy(); 18 | makeVisible(); 19 | }); 20 | }; 21 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/skins.component.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"skins.component.d.ts","sources":["skins.component.d.ts"],"names":[],"mappings":"AAAA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA","sourcesContent":["import { EventEmitter } from '@angular/core';\nimport { Emoji } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nexport declare class SkinComponent {\n /** currently selected skin */\n skin?: Emoji['skin'];\n i18n: any;\n changeSkin: EventEmitter;\n opened: boolean;\n skinTones: number[];\n toggleOpen(): void;\n isSelected(skinTone: Emoji['skin']): boolean;\n isVisible(skinTone: Emoji['skin']): boolean;\n pressed(skinTone: Emoji['skin']): boolean | \"\";\n tabIndex(skinTone: Emoji['skin']): \"\" | \"0\";\n expanded(skinTone: Emoji['skin']): boolean | \"\";\n handleClick(skin: number): void;\n}\n"]} -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/plan/plan.component.less: -------------------------------------------------------------------------------- 1 | .grid-header { 2 | font-size: 20px; 3 | font-weight: 600; 4 | text-align: center; 5 | background: rgb(35, 96, 246); 6 | color: #fff; 7 | height: 120px; 8 | line-height: 120px; 9 | 10 | sup { 11 | font-size: 12px; 12 | font-weight: 300; 13 | top: -1.1em; 14 | } 15 | } 16 | .grid-content-first { 17 | background: rgb(91, 206, 112); 18 | height: 70px; 19 | font-size: 16px; 20 | font-weight: 700; 21 | line-height: 70px; 22 | color: #fff; 23 | text-align: center; 24 | } 25 | .cross { 26 | background: rgb(81, 186, 103) !important; 27 | } 28 | .grid-content { 29 | text-align: center; 30 | height: 70px; 31 | font-size: 14px; 32 | line-height: 70px; 33 | } 34 | .content-cross { 35 | background: rgb(240, 240, 240); 36 | } 37 | .grid-buttom { 38 | height: 100px; 39 | line-height: 100px; 40 | } 41 | -------------------------------------------------------------------------------- /src/app/routes/passport/register/register.component.less: -------------------------------------------------------------------------------- 1 | @import '~@delon/theme/index'; 2 | :host { 3 | display: block; 4 | width: 368px; 5 | margin: 0 auto; 6 | ::ng-deep { 7 | h3 { 8 | margin-bottom: 20px; 9 | font-size: 16px; 10 | } 11 | .submit { 12 | width: 50%; 13 | } 14 | .login { 15 | float: right; 16 | line-height: @btn-height-lg; 17 | } 18 | } 19 | } 20 | ::ng-deep { 21 | .register-password-cdk { 22 | .success, 23 | .warning, 24 | .error { 25 | transition: color 0.3s; 26 | } 27 | .success { 28 | color: @success-color; 29 | } 30 | .warning { 31 | color: @warning-color; 32 | } 33 | .error { 34 | color: @error-color; 35 | } 36 | .progress-pass > .progress { 37 | .ant-progress-bg { 38 | background-color: @warning-color; 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/preview.component.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { ChangeDetectorRef, EventEmitter, OnChanges } from '@angular/core'; 2 | import { Emoji, EmojiData, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 3 | export declare class PreviewComponent implements OnChanges { 4 | ref: ChangeDetectorRef; 5 | private emojiService; 6 | title?: string; 7 | emoji: any; 8 | idleEmoji: any; 9 | i18n: any; 10 | emojiIsNative?: Emoji['isNative']; 11 | emojiSkin?: Emoji['skin']; 12 | emojiSize?: Emoji['size']; 13 | emojiSet?: Emoji['set']; 14 | emojiSheetSize?: Emoji['sheetSize']; 15 | emojiBackgroundImageFn?: Emoji['backgroundImageFn']; 16 | skinChange: EventEmitter; 17 | emojiData: Partial; 18 | listedEmoticons?: string[]; 19 | constructor(ref: ChangeDetectorRef, emojiService: EmojiService); 20 | ngOnChanges(): void; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/shared/json-schema/json-schema.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { DelonFormModule, WidgetRegistry } from '@delon/form'; 3 | import { SharedModule } from '../shared.module'; 4 | 5 | // import { TinymceWidget } from './widgets/tinymce/tinymce.widget'; 6 | // import { UeditorWidget } from './widgets/ueditor/ueditor.widget'; 7 | 8 | export const SCHEMA_THIRDS_COMPONENTS = [ 9 | // TinymceWidget, 10 | // UeditorWidget 11 | ]; 12 | 13 | @NgModule({ 14 | declarations: SCHEMA_THIRDS_COMPONENTS, 15 | entryComponents: SCHEMA_THIRDS_COMPONENTS, 16 | imports: [SharedModule, DelonFormModule.forRoot()], 17 | exports: [...SCHEMA_THIRDS_COMPONENTS], 18 | }) 19 | export class JsonSchemaModule { 20 | constructor(widgetRegistry: WidgetRegistry) { 21 | // widgetRegistry.register(TinymceWidget.KEY, TinymceWidget); 22 | // widgetRegistry.register(UeditorWidget.KEY, UeditorWidget); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | 'browserName': 'chrome' 17 | }, 18 | directConnect: true, 19 | baseUrl: 'http://localhost:4200/', 20 | framework: 'jasmine', 21 | jasmineNodeOpts: { 22 | showColors: true, 23 | defaultTimeoutInterval: 30000, 24 | print: function() {} 25 | }, 26 | onPrepare() { 27 | require('ts-node').register({ 28 | project: require('path').join(__dirname, './tsconfig.json') 29 | }); 30 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 31 | } 32 | }; -------------------------------------------------------------------------------- /src/app/routes/conversation/conversation.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { SharedModule } from "@shared"; 3 | import { ChatDetailComponent } from "./chat-detail/chat-detail.component"; 4 | import { ChatComponent } from "./chat/chat.component"; 5 | import { ConversationRoutingModule } from "./conversation-routing.module"; 6 | import { UngreetedVisitorDetailComponent } from "./ungreeted-visitor-detail/ungreeted-visitor-detail.component"; 7 | import { UngreetedVisitorComponent } from "./ungreeted-visitor/ungreeted-visitor.component"; 8 | 9 | const COMPONENTS = []; 10 | const COMPONENTS_NOROUNT = []; 11 | 12 | @NgModule({ 13 | imports: [SharedModule, ConversationRoutingModule], 14 | declarations: [ 15 | ...COMPONENTS, 16 | ...COMPONENTS_NOROUNT, 17 | ChatComponent, 18 | ChatDetailComponent, 19 | UngreetedVisitorComponent, 20 | UngreetedVisitorDetailComponent, 21 | ], 22 | }) 23 | export class ConversationModule {} 24 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-search.service.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { EmojiData, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 2 | export declare class EmojiSearch { 3 | private emojiService; 4 | originalPool: any; 5 | index: { 6 | results?: EmojiData[]; 7 | pool?: { 8 | [key: string]: EmojiData; 9 | }; 10 | [key: string]: any; 11 | }; 12 | emojisList: any; 13 | emoticonsList: { 14 | [key: string]: string; 15 | }; 16 | emojiSearch: { 17 | [key: string]: string; 18 | }; 19 | constructor(emojiService: EmojiService); 20 | addCustomToPool(custom: any, pool: any): void; 21 | search(value: string, emojisToShowFilter?: (x: any) => boolean, maxResults?: number, include?: any[], exclude?: any[], custom?: any[]): EmojiData[] | null; 22 | buildSearch(shortNames: string[], name: string, id: string, keywords: string[], emoticons: string[]): string; 23 | } 24 | -------------------------------------------------------------------------------- /src/app/layout/default/sidebar/sidebar.component.html: -------------------------------------------------------------------------------- 1 |
2 | 29 | 30 |
31 | -------------------------------------------------------------------------------- /src/app/routes/passport/lock/lock.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /_cli-tpl/test/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%><% if(changeDetection !== 'Default') { %>, ChangeDetectionStrategy<% }%> } from '@angular/core'; 2 | import { _HttpClient } from '@delon/theme'; 3 | import { NzMessageService } from 'ng-zorro-antd/message'; 4 | 5 | @Component({ 6 | selector: '<%= selector %>', 7 | templateUrl: './<%= dasherize(name) %>.component.html',<% if(!inlineStyle) { %><% } else { %> 8 | styleUrls: ['./<%= dasherize(name) %>.component.<%= styleext %>']<% } %><% if(!!viewEncapsulation) { %>, 9 | encapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } if (changeDetection !== 'Default') { %>, 10 | changeDetection: ChangeDetectionStrategy.<%= changeDetection %><% } %> 11 | }) 12 | export class <%= componentName %> implements OnInit { 13 | 14 | constructor(private http: _HttpClient, private msg: NzMessageService) { } 15 | 16 | ngOnInit() { } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/app/routes/conversation/conversation-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { RouterModule, Routes } from "@angular/router"; 3 | import { ChatDetailComponent } from "./chat-detail/chat-detail.component"; 4 | import { ChatComponent } from "./chat/chat.component"; 5 | import { UngreetedVisitorDetailComponent } from "./ungreeted-visitor-detail/ungreeted-visitor-detail.component"; 6 | import { UngreetedVisitorComponent } from "./ungreeted-visitor/ungreeted-visitor.component"; 7 | 8 | const routes: Routes = [ 9 | { 10 | path: "chat", 11 | component: ChatComponent, 12 | children: [{ path: ":id", component: ChatDetailComponent }], 13 | }, 14 | { 15 | path: "visitor", 16 | component: UngreetedVisitorComponent, 17 | children: [{ path: ":id", component: UngreetedVisitorDetailComponent }], 18 | }, 19 | ]; 20 | 21 | @NgModule({ 22 | imports: [RouterModule.forChild(routes)], 23 | exports: [RouterModule], 24 | }) 25 | export class ConversationRoutingModule {} 26 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/search.component.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { AfterViewInit, EventEmitter, OnInit } from '@angular/core'; 2 | import { EmojiSearch } from './emoji-search.service'; 3 | export declare class SearchComponent implements AfterViewInit, OnInit { 4 | private emojiSearch; 5 | maxResults: number; 6 | autoFocus: boolean; 7 | i18n: any; 8 | include: string[]; 9 | exclude: string[]; 10 | custom: any[]; 11 | icons: { 12 | [key: string]: string; 13 | }; 14 | emojisToShowFilter?: (x: any) => boolean; 15 | searchResults: EventEmitter; 16 | enterKey: EventEmitter; 17 | private inputRef; 18 | isSearching: boolean; 19 | icon?: string; 20 | query: string; 21 | inputId: string; 22 | constructor(emojiSearch: EmojiSearch); 23 | ngOnInit(): void; 24 | ngAfterViewInit(): void; 25 | clear(): void; 26 | handleEnterKey($event: Event): void; 27 | handleSearch(value: string): void; 28 | handleChange(): void; 29 | } 30 | -------------------------------------------------------------------------------- /src/app/layout/default/header/components/fullscreen.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core'; 2 | import * as screenfull from 'screenfull'; 3 | 4 | @Component({ 5 | selector: 'header-fullscreen', 6 | template: ` 7 | 8 | {{ (status ? 'menu.fullscreen.exit' : 'menu.fullscreen') | translate }} 9 | `, 10 | // tslint:disable-next-line: no-host-metadata-property 11 | host: { 12 | '[class.d-block]': 'true', 13 | }, 14 | changeDetection: ChangeDetectionStrategy.OnPush, 15 | }) 16 | export class HeaderFullScreenComponent { 17 | status = false; 18 | private get sf(): screenfull.Screenfull { 19 | return screenfull as screenfull.Screenfull; 20 | } 21 | 22 | @HostListener('window:resize') 23 | _resize(): void { 24 | this.status = this.sf.isFullscreen; 25 | } 26 | 27 | @HostListener('click') 28 | _click(): void { 29 | if (this.sf.isEnabled) { 30 | this.sf.toggle(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/layout/default/header/components/storage.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core'; 2 | import { NzMessageService } from 'ng-zorro-antd/message'; 3 | import { NzModalService } from 'ng-zorro-antd/modal'; 4 | 5 | @Component({ 6 | selector: 'header-storage', 7 | template: ` 8 | 9 | {{ 'menu.clear.local.storage' | translate }} 10 | `, 11 | // tslint:disable-next-line: no-host-metadata-property 12 | host: { 13 | '[class.d-block]': 'true', 14 | }, 15 | changeDetection: ChangeDetectionStrategy.OnPush, 16 | }) 17 | export class HeaderStorageComponent { 18 | constructor(private modalSrv: NzModalService, private messageSrv: NzMessageService) {} 19 | 20 | @HostListener('click') 21 | _click(): void { 22 | this.modalSrv.confirm({ 23 | nzTitle: 'Make sure clear all local storage?', 24 | nzOnOk: () => { 25 | localStorage.clear(); 26 | this.messageSrv.success('Clear Finished!'); 27 | }, 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/preview.component.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"preview.component.d.ts","sources":["preview.component.d.ts"],"names":[],"mappings":"AAAA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA","sourcesContent":["import { ChangeDetectorRef, EventEmitter, OnChanges } from '@angular/core';\nimport { Emoji, EmojiData, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nexport declare class PreviewComponent implements OnChanges {\n ref: ChangeDetectorRef;\n private emojiService;\n title?: string;\n emoji: any;\n idleEmoji: any;\n i18n: any;\n emojiIsNative?: Emoji['isNative'];\n emojiSkin?: Emoji['skin'];\n emojiSize?: Emoji['size'];\n emojiSet?: Emoji['set'];\n emojiSheetSize?: Emoji['sheetSize'];\n emojiBackgroundImageFn?: Emoji['backgroundImageFn'];\n skinChange: EventEmitter;\n emojiData: Partial;\n listedEmoticons?: string[];\n constructor(ref: ChangeDetectorRef, emojiService: EmojiService);\n ngOnChanges(): void;\n}\n"]} -------------------------------------------------------------------------------- /src/app/layout/passport/passport.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; 4 | 5 | @Component({ 6 | selector: 'layout-passport', 7 | templateUrl: './passport.component.html', 8 | styleUrls: ['./passport.component.less'], 9 | }) 10 | export class LayoutPassportComponent implements OnInit { 11 | links = [ 12 | { 13 | title: '帮助', 14 | href: '', 15 | }, 16 | { 17 | title: '隐私', 18 | href: '', 19 | }, 20 | { 21 | title: '条款', 22 | href: '', 23 | }, 24 | ]; 25 | 26 | constructor(@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, public router: Router) {} 27 | 28 | ngOnInit(): void { 29 | this.tokenService.clear(); 30 | } 31 | 32 | openComodoSeal(): void { 33 | window.open(`https://comodo-status.digital-sign.com.cn/ttb_searcher/trustlogo?v_querytype=W&v_shortname=ENTEV&v_search=http://www.kefu.chat&x=6&y=5`, `_comodo_seal`); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/projects/projects.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | import { NzMessageService } from "ng-zorro-antd/message"; 8 | 9 | @Component({ 10 | selector: "app-account-center-projects", 11 | templateUrl: "./projects.component.html", 12 | styleUrls: ["./projects.component.less"], 13 | changeDetection: ChangeDetectionStrategy.OnPush, 14 | }) 15 | export class ProAccountCenterProjectsComponent { 16 | listLoading = true; 17 | list: any[] = []; 18 | 19 | constructor( 20 | private http: _HttpClient, 21 | private msg: NzMessageService, 22 | private cdr: ChangeDetectorRef 23 | ) { 24 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 25 | this.list = res; 26 | this.listLoading = false; 27 | this.cdr.markForCheck(); 28 | this.cdr.detectChanges(); 29 | }); 30 | } 31 | 32 | suc(id: number): void { 33 | this.msg.success(`标题:${id}`); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/ngx-emoji/index.js: -------------------------------------------------------------------------------- 1 | export * from './data/categories'; 2 | export * from './data/data.interfaces'; 3 | export * from './data/emojis'; 4 | export * from './data/skins'; 5 | export * from './emoji.component'; 6 | export * from './emoji.module'; 7 | export * from './emoji.service'; 8 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BpY2tlci9uZ3gtZW1vamkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsY0FBYyxDQUFDO0FBRTdCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYXRhL2NhdGVnb3JpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhL2RhdGEuaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGEvZW1vamlzJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS9za2lucyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZW1vamkuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZW1vamkubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vZW1vamkuc2VydmljZSc7XG4iXX0= -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/projects/projects.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | import { NzMessageService } from "ng-zorro-antd/message"; 8 | 9 | @Component({ 10 | selector: "app-enterprise-center-projects", 11 | templateUrl: "./projects.component.html", 12 | styleUrls: ["./projects.component.less"], 13 | changeDetection: ChangeDetectionStrategy.OnPush, 14 | }) 15 | export class ProEnterpriseCenterProjectsComponent { 16 | listLoading = true; 17 | list: any[] = []; 18 | 19 | constructor( 20 | private http: _HttpClient, 21 | private msg: NzMessageService, 22 | private cdr: ChangeDetectorRef 23 | ) { 24 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 25 | this.list = res; 26 | this.listLoading = false; 27 | this.cdr.markForCheck(); 28 | this.cdr.detectChanges(); 29 | }); 30 | } 31 | 32 | suc(id: number): void { 33 | this.msg.success(`标题:${id}`); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | SERVER_URL: `./`, 7 | apiUrl: `http://kefu.ssl.digital/`, 8 | socketHost: `http://kefu.ssl.digital:6001/`, 9 | widgetHost: `http://kefu.ssl.digital:5000/`, 10 | production: false, 11 | useHash: false, 12 | hmr: false, 13 | version: require('../../package.json').version, 14 | notificationKey: 'BABHGEaUywW5fuU4TyEE_0Qx9s4uHcpuwgbvJaXCe5EO6sP0jh_qT24cuRAr7Rmndz2mULSYuRb_lWMlElr1d_Y', 15 | }; 16 | 17 | /* 18 | * In development mode, to ignore zone related error stack frames such as 19 | * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can 20 | * import the following file, but please comment it out in production mode 21 | * because it will have performance impact when throw error 22 | */ 23 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 24 | -------------------------------------------------------------------------------- /src/app/routes/routes.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | 3 | import { SharedModule } from "@shared"; 4 | import { UserLockComponent } from "./passport/lock/lock.component"; 5 | import { UserLoginComponent } from "./passport/login/login.component"; 6 | import { UserRegisterResultComponent } from "./passport/register-result/register-result.component"; 7 | import { UserRegisterComponent } from "./passport/register/register.component"; 8 | // passport pages 9 | import { EmailVerifyComponent } from "./passport/verify/email-verify.component"; 10 | import { RouteRoutingModule } from "./routes-routing.module"; 11 | const COMPONENTS = [ 12 | // passport pages 13 | EmailVerifyComponent, 14 | UserLoginComponent, 15 | UserRegisterComponent, 16 | UserRegisterResultComponent, 17 | // single pages 18 | UserLockComponent, 19 | ]; 20 | const COMPONENTS_NOROUNT = []; 21 | 22 | @NgModule({ 23 | imports: [SharedModule, RouteRoutingModule], 24 | declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT], 25 | entryComponents: COMPONENTS_NOROUNT, 26 | }) 27 | export class RoutesModule {} 28 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/skins.component.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "@angular/core"; 2 | import { Emoji } from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 3 | import * as ɵngcc0 from "@angular/core"; 4 | export declare class SkinComponent { 5 | /** currently selected skin */ 6 | skin?: Emoji["skin"]; 7 | i18n: any; 8 | changeSkin: EventEmitter; 9 | opened: boolean; 10 | skinTones: number[]; 11 | toggleOpen(): void; 12 | isSelected(skinTone: Emoji["skin"]): boolean; 13 | isVisible(skinTone: Emoji["skin"]): boolean; 14 | pressed(skinTone: Emoji["skin"]): boolean | ""; 15 | tabIndex(skinTone: Emoji["skin"]): "" | "0"; 16 | expanded(skinTone: Emoji["skin"]): boolean | ""; 17 | handleClick(skin: number): void; 18 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 19 | static ɵcmp: ɵngcc0.ɵɵComponentDefWithMeta< 20 | SkinComponent, 21 | "emoji-skins", 22 | never, 23 | { skin: "skin"; i18n: "i18n" }, 24 | { changeSkin: "changeSkin" }, 25 | never, 26 | never 27 | >; 28 | } 29 | 30 | //# sourceMappingURL=skins.component.d.ts.map 31 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-search.service.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"emoji-search.service.d.ts","sources":["emoji-search.service.d.ts"],"names":[],"mappings":"AAAA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA","sourcesContent":["import { EmojiData, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nexport declare class EmojiSearch {\n private emojiService;\n originalPool: any;\n index: {\n results?: EmojiData[];\n pool?: {\n [key: string]: EmojiData;\n };\n [key: string]: any;\n };\n emojisList: any;\n emoticonsList: {\n [key: string]: string;\n };\n emojiSearch: {\n [key: string]: string;\n };\n constructor(emojiService: EmojiService);\n addCustomToPool(custom: any, pool: any): void;\n search(value: string, emojisToShowFilter?: (x: any) => boolean, maxResults?: number, include?: any[], exclude?: any[], custom?: any[]): EmojiData[] | null;\n buildSearch(shortNames: string[], name: string, id: string, keywords: string[], emoticons: string[]): string;\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/anchors.component.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "@angular/core"; 2 | import { EmojiCategory } from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 3 | import * as ɵngcc0 from "@angular/core"; 4 | export declare class AnchorsComponent { 5 | categories: EmojiCategory[]; 6 | color?: string; 7 | selected?: string; 8 | i18n: any; 9 | icons: { 10 | [key: string]: string; 11 | }; 12 | anchorClick: EventEmitter<{ 13 | category: EmojiCategory; 14 | index: number; 15 | }>; 16 | trackByFn(idx: number, cat: EmojiCategory): string; 17 | handleClick($event: Event, index: number): void; 18 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 19 | static ɵcmp: ɵngcc0.ɵɵComponentDefWithMeta< 20 | AnchorsComponent, 21 | "emoji-mart-anchors", 22 | never, 23 | { 24 | categories: "categories"; 25 | icons: "icons"; 26 | color: "color"; 27 | selected: "selected"; 28 | i18n: "i18n"; 29 | }, 30 | { anchorClick: "anchorClick" }, 31 | never, 32 | never 33 | >; 34 | } 35 | 36 | //# sourceMappingURL=anchors.component.d.ts.map 37 | -------------------------------------------------------------------------------- /src/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Xiaohui.Lam & Xiaoreign 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/search.component.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"search.component.d.ts","sources":["search.component.d.ts"],"names":[],"mappings":"AAAA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA","sourcesContent":["import { AfterViewInit, EventEmitter, OnInit } from '@angular/core';\nimport { EmojiSearch } from './emoji-search.service';\nexport declare class SearchComponent implements AfterViewInit, OnInit {\n private emojiSearch;\n maxResults: number;\n autoFocus: boolean;\n i18n: any;\n include: string[];\n exclude: string[];\n custom: any[];\n icons: {\n [key: string]: string;\n };\n emojisToShowFilter?: (x: any) => boolean;\n searchResults: EventEmitter;\n enterKey: EventEmitter;\n private inputRef;\n isSearching: boolean;\n icon?: string;\n query: string;\n inputId: string;\n constructor(emojiSearch: EmojiSearch);\n ngOnInit(): void;\n ngAfterViewInit(): void;\n clear(): void;\n handleEnterKey($event: Event): void;\n handleSearch(value: string): void;\n handleChange(): void;\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Scott Cooper 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/emoji-search.service.d.ts: -------------------------------------------------------------------------------- 1 | import { EmojiData, EmojiService } from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 2 | import * as ɵngcc0 from "@angular/core"; 3 | export declare class EmojiSearch { 4 | private emojiService; 5 | originalPool: any; 6 | index: { 7 | results?: EmojiData[]; 8 | pool?: { 9 | [key: string]: EmojiData; 10 | }; 11 | [key: string]: any; 12 | }; 13 | emojisList: any; 14 | emoticonsList: { 15 | [key: string]: string; 16 | }; 17 | emojiSearch: { 18 | [key: string]: string; 19 | }; 20 | constructor(emojiService: EmojiService); 21 | addCustomToPool(custom: any, pool: any): void; 22 | search( 23 | value: string, 24 | emojisToShowFilter?: (x: any) => boolean, 25 | maxResults?: number, 26 | include?: any[], 27 | exclude?: any[], 28 | custom?: any[] 29 | ): EmojiData[] | null; 30 | buildSearch( 31 | shortNames: string[], 32 | name: string, 33 | id: string, 34 | keywords: string[], 35 | emoticons: string[] 36 | ): string; 37 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 38 | } 39 | 40 | //# sourceMappingURL=emoji-search.service.d.ts.map 41 | -------------------------------------------------------------------------------- /src/app/routes/exception/trigger.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject } from '@angular/core'; 2 | import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; 3 | import { _HttpClient } from '@delon/theme'; 4 | 5 | @Component({ 6 | selector: 'exception-trigger', 7 | template: ` 8 |
9 | 10 | 11 | 12 | 13 |
14 | `, 15 | }) 16 | export class ExceptionTriggerComponent { 17 | types = [401, 403, 404, 500]; 18 | 19 | constructor(private http: _HttpClient, @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {} 20 | 21 | go(type: number): void { 22 | this.http.get(`/api/${type}`).subscribe(); 23 | } 24 | 25 | refresh(): void { 26 | this.tokenService.set({ token: 'invalid-token' }); 27 | // 必须提供一个后端地址,无法通过 Mock 来模拟 28 | this.http.post(`https://localhost:5001/auth`).subscribe( 29 | (res) => console.warn('成功', res), 30 | (err) => { 31 | console.log('最后结果失败', err); 32 | }, 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/projects/projects.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | {{ item.title }} 12 | 13 | 14 | 15 | {{ item.title }} 16 | 17 | 18 |
19 | {{ item.updatedAt | _date: "fn" }} 20 | 21 | 26 | 27 |
28 |
29 |
30 |
31 |
32 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/projects/projects.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | {{ item.title }} 12 | 13 | 14 | 15 | {{ item.title }} 16 | 17 | 18 |
19 | {{ item.updatedAt | _date: "fn" }} 20 | 21 | 26 | 27 |
28 |
29 |
30 |
31 |
32 | -------------------------------------------------------------------------------- /src/app/layout/default/setting-drawer/setting-drawer-item.component.html: -------------------------------------------------------------------------------- 1 | {{ i.label }}{{ i.tip }} 4 |
5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/settings.component.html: -------------------------------------------------------------------------------- 1 |
2 | 36 |
37 |
{{ title }}
38 | 39 |
40 |
41 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/settings.component.html: -------------------------------------------------------------------------------- 1 |
2 | 36 |
37 |
{{ title }}
38 | 39 |
40 |
41 | -------------------------------------------------------------------------------- /src/assets/tmp/app-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": { 3 | "name": "客服系统", 4 | "description": "Customer Service Support" 5 | }, 6 | "menu": [ 7 | { 8 | "i18n": "menu.feature", 9 | "group": true, 10 | "hideInBreadcrumb": true, 11 | "children": [ 12 | { 13 | "i18n": "menu.conversation", 14 | "icon": "anticon-comment", 15 | "link": "/conversation/chat" 16 | }, 17 | { 18 | "i18n": "menu.conversation.ungreeted-visitor", 19 | "icon": "anticon-alert", 20 | "link": "/conversation/visitor" 21 | }, 22 | { 23 | "i18n": "menu.conversation.robot", 24 | "icon": "anticon-robot", 25 | "link": "/bot" 26 | } 27 | ] 28 | }, 29 | { 30 | "text": "Account", 31 | "group": true, 32 | "i18n": "menu.account", 33 | "children": [ 34 | { 35 | "i18n": "menu.enterprise.settings", 36 | "icon": "anticon-bank", 37 | "link": "/pro/enterprise/settings" 38 | }, 39 | { 40 | "i18n": "menu.account.settings", 41 | "icon": "anticon-user", 42 | "link": "/pro/account/settings" 43 | } 44 | ] 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ElementRef, OnInit, Renderer2 } from "@angular/core"; 2 | import { NavigationEnd, Router } from "@angular/router"; 3 | import { TitleService, VERSION as VERSION_ALAIN } from "@delon/theme"; 4 | import { NzModalService } from "ng-zorro-antd/modal"; 5 | import { VERSION as VERSION_ZORRO } from "ng-zorro-antd/version"; 6 | import { filter } from "rxjs/operators"; 7 | 8 | @Component({ 9 | selector: "app-root", 10 | template: ` `, 11 | }) 12 | export class AppComponent implements OnInit { 13 | constructor( 14 | el: ElementRef, 15 | renderer: Renderer2, 16 | private router: Router, 17 | private titleSrv: TitleService, 18 | private modalSrv: NzModalService 19 | ) { 20 | renderer.setAttribute( 21 | el.nativeElement, 22 | "ng-alain-version", 23 | VERSION_ALAIN.full 24 | ); 25 | renderer.setAttribute( 26 | el.nativeElement, 27 | "ng-zorro-version", 28 | VERSION_ZORRO.full 29 | ); 30 | } 31 | 32 | ngOnInit(): void { 33 | this.router.events 34 | .pipe(filter((evt) => evt instanceof NavigationEnd)) 35 | .subscribe(() => { 36 | this.titleSrv.setTitle(); 37 | this.modalSrv.closeAll(); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode, ViewEncapsulation } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | import { preloaderFinished } from '@delon/theme'; 4 | import { NzSafeAny } from 'ng-zorro-antd/core/types'; 5 | 6 | import { AppModule } from './app/app.module'; 7 | import { environment } from "@env/environment"; 8 | import { hmrBootstrap } from './hmr'; 9 | 10 | preloaderFinished(); 11 | 12 | if (environment.production) { 13 | enableProdMode(); 14 | } 15 | 16 | const bootstrap = () => { 17 | return platformBrowserDynamic() 18 | .bootstrapModule(AppModule, { 19 | defaultEncapsulation: ViewEncapsulation.Emulated, 20 | preserveWhitespaces: false, 21 | }) 22 | .then((res) => { 23 | const win = window as NzSafeAny; 24 | if (win && win.appBootstrap) { 25 | win.appBootstrap(); 26 | } 27 | return res; 28 | }); 29 | }; 30 | 31 | if (environment.hmr) { 32 | // tslint:disable-next-line: no-string-literal 33 | if (module['hot']) { 34 | hmrBootstrap(module, bootstrap); 35 | } else { 36 | console.error('HMR is not enabled for webpack-dev-server!'); 37 | console.log('Are you using the --hmr flag for ng serve?'); 38 | } 39 | } else { 40 | bootstrap(); 41 | } 42 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, './coverage'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | customLaunchers: { 30 | ChromeHeadlessCI: { 31 | base: 'ChromeHeadless', 32 | flags: ['--no-sandbox'] 33 | } 34 | }, 35 | singleRun: false, 36 | restartOnFileChange: true 37 | }); 38 | }; 39 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/base/base.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | 3 | :host ::ng-deep { 4 | .main { 5 | display: flex; 6 | padding-top: 12px; 7 | } 8 | .left { 9 | min-width: 310px; 10 | max-width: 448px; 11 | } 12 | .right { 13 | flex: 1; 14 | padding-left: 104px; 15 | .avatar_title { 16 | height: 22px; 17 | margin-bottom: 8px; 18 | color: @heading-color; 19 | font-size: @font-size-base; 20 | line-height: 22px; 21 | } 22 | .avatar { 23 | width: 144px; 24 | height: 144px; 25 | margin-bottom: 12px; 26 | overflow: hidden; 27 | img { 28 | width: 100%; 29 | } 30 | } 31 | .button_view { 32 | width: 144px; 33 | text-align: center; 34 | } 35 | } 36 | 37 | @media screen and (max-width: @mobile-max) { 38 | flex-direction: column-reverse; 39 | .right { 40 | display: flex; 41 | flex-direction: column; 42 | align-items: center; 43 | max-width: 448px; 44 | padding: 20px; 45 | .avatar_title { 46 | display: none; 47 | } 48 | } 49 | } 50 | } 51 | 52 | [data-theme="dark"] { 53 | :host ::ng-deep { 54 | .right .avatar_title { 55 | color: rgba(255, 255, 255, 0.65); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/base/base.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | 3 | :host ::ng-deep { 4 | .main { 5 | display: flex; 6 | padding-top: 12px; 7 | } 8 | .left { 9 | min-width: 310px; 10 | max-width: 448px; 11 | } 12 | .right { 13 | flex: 1; 14 | padding-left: 104px; 15 | .avatar_title { 16 | height: 22px; 17 | margin-bottom: 8px; 18 | color: @heading-color; 19 | font-size: @font-size-base; 20 | line-height: 22px; 21 | } 22 | .avatar { 23 | width: 144px; 24 | height: 144px; 25 | margin-bottom: 12px; 26 | overflow: hidden; 27 | img { 28 | width: 100%; 29 | } 30 | } 31 | .button_view { 32 | width: 144px; 33 | text-align: center; 34 | } 35 | } 36 | 37 | @media screen and (max-width: @mobile-max) { 38 | flex-direction: column-reverse; 39 | .right { 40 | display: flex; 41 | flex-direction: column; 42 | align-items: center; 43 | max-width: 448px; 44 | padding: 20px; 45 | .avatar_title { 46 | display: none; 47 | } 48 | } 49 | } 50 | } 51 | 52 | [data-theme="dark"] { 53 | :host ::ng-deep { 54 | .right .avatar_title { 55 | color: rgba(255, 255, 255, 0.65); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/applications/applications.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | :host { 3 | margin-bottom: -24px; 4 | ::ng-deep { 5 | .ant-card { 6 | width: 100%; 7 | } 8 | .ant-card-meta-content { 9 | margin-top: 0; 10 | } // disabled white space 11 | .ant-card-meta-avatar { 12 | font-size: 0; 13 | } 14 | .ant-card-actions { 15 | background: #f7f9fa; 16 | } 17 | .ant-list .ant-list-item-content-single { 18 | max-width: 100%; 19 | } 20 | .card-info { 21 | .clearfix(); 22 | 23 | margin-top: 16px; 24 | margin-left: 40px; 25 | & > div { 26 | position: relative; 27 | float: left; 28 | width: 50%; 29 | text-align: left; 30 | p { 31 | margin: 0; 32 | font-size: 24px; 33 | line-height: 32px; 34 | } 35 | p:first-child { 36 | margin-bottom: 4px; 37 | color: @text-color-secondary; 38 | font-size: 12px; 39 | line-height: 20px; 40 | } 41 | } 42 | } 43 | .wan { 44 | position: relative; 45 | top: -2px; 46 | margin-left: 2px; 47 | font-size: @font-size-base; 48 | font-style: normal; 49 | line-height: 20px; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/applications/applications.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | :host { 3 | margin-bottom: -24px; 4 | ::ng-deep { 5 | .ant-card { 6 | width: 100%; 7 | } 8 | .ant-card-meta-content { 9 | margin-top: 0; 10 | } // disabled white space 11 | .ant-card-meta-avatar { 12 | font-size: 0; 13 | } 14 | .ant-card-actions { 15 | background: #f7f9fa; 16 | } 17 | .ant-list .ant-list-item-content-single { 18 | max-width: 100%; 19 | } 20 | .card-info { 21 | .clearfix(); 22 | 23 | margin-top: 16px; 24 | margin-left: 40px; 25 | & > div { 26 | position: relative; 27 | float: left; 28 | width: 50%; 29 | text-align: left; 30 | p { 31 | margin: 0; 32 | font-size: 24px; 33 | line-height: 32px; 34 | } 35 | p:first-child { 36 | margin-bottom: 4px; 37 | color: @text-color-secondary; 38 | font-size: 12px; 39 | line-height: 20px; 40 | } 41 | } 42 | } 43 | .wan { 44 | position: relative; 45 | top: -2px; 46 | margin-left: 2px; 47 | font-size: @font-size-base; 48 | font-style: normal; 49 | line-height: 20px; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/applications/applications.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | 8 | @Component({ 9 | selector: "app-account-center-applications", 10 | templateUrl: "./applications.component.html", 11 | styleUrls: ["./applications.component.less"], 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class ProAccountCenterApplicationsComponent { 15 | listLoading = true; 16 | list: any[] = []; 17 | constructor(private http: _HttpClient, private cdr: ChangeDetectorRef) { 18 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 19 | this.list = res.map((item) => { 20 | item.activeUser = this.formatWan(item.activeUser); 21 | return item; 22 | }); 23 | this.listLoading = false; 24 | this.cdr.markForCheck(); 25 | this.cdr.detectChanges(); 26 | }); 27 | } 28 | 29 | private formatWan(val: number): string { 30 | const v = val * 1; 31 | if (!v || isNaN(v)) { 32 | return ""; 33 | } 34 | 35 | let result: string | number = val; 36 | if (val > 10000) { 37 | result = Math.floor(val / 10000); 38 | result = `${result}`; 39 | } 40 | return result.toString(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/applications/applications.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | } from "@angular/core"; 6 | import { _HttpClient } from "@delon/theme"; 7 | 8 | @Component({ 9 | selector: "app-enterprise-center-applications", 10 | templateUrl: "./applications.component.html", 11 | styleUrls: ["./applications.component.less"], 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class ProEnterpriseCenterApplicationsComponent { 15 | listLoading = true; 16 | list: any[] = []; 17 | constructor(private http: _HttpClient, private cdr: ChangeDetectorRef) { 18 | this.http.get("/api/list", { count: 8 }).subscribe((res) => { 19 | this.list = res.map((item) => { 20 | item.activeUser = this.formatWan(item.activeUser); 21 | return item; 22 | }); 23 | this.listLoading = false; 24 | this.cdr.markForCheck(); 25 | this.cdr.detectChanges(); 26 | }); 27 | } 28 | 29 | private formatWan(val: number): string { 30 | const v = val * 1; 31 | if (!v || isNaN(v)) { 32 | return ""; 33 | } 34 | 35 | let result: string | number = val; 36 | if (val > 10000) { 37 | result = Math.floor(val / 10000); 38 | result = `${result}`; 39 | } 40 | return result.toString(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/public_api.js: -------------------------------------------------------------------------------- 1 | export * from './anchors.component'; 2 | export * from './category.component'; 3 | export * from './emoji-frequently.service'; 4 | export * from './emoji-search.service'; 5 | export * from './picker.component'; 6 | export * from './picker.module'; 7 | export * from './preview.component'; 8 | export * from './search.component'; 9 | export * from './skins.component'; 10 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGlja2VyL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FuY2hvcnMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY2F0ZWdvcnkuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZW1vamktZnJlcXVlbnRseS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZW1vamktc2VhcmNoLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9waWNrZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcGlja2VyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL3ByZXZpZXcuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NraW5zLmNvbXBvbmVudCc7XG4iXX0= -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.service.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { CompressedEmojiData, EmojiData } from './data/data.interfaces'; 2 | import { Emoji } from './emoji.component'; 3 | export declare const DEFAULT_BACKGROUNDFN: (set: string, sheetSize: number) => string; 4 | export declare class EmojiService { 5 | uncompressed: boolean; 6 | names: { 7 | [key: string]: EmojiData; 8 | }; 9 | emojis: EmojiData[]; 10 | constructor(); 11 | uncompress(list: CompressedEmojiData[]): void; 12 | getData(emoji: EmojiData | string, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData | null; 13 | unifiedToNative(unified: string): string; 14 | emojiSpriteStyles(sheet: EmojiData['sheet'], set?: Emoji['set'], size?: Emoji['size'], sheetSize?: Emoji['sheetSize'], sheetRows?: Emoji['sheetRows'], backgroundImageFn?: Emoji['backgroundImageFn'], sheetColumns?: number): { 15 | width: string; 16 | height: string; 17 | display: string; 18 | 'background-image': string; 19 | 'background-size': string; 20 | 'background-position': string; 21 | }; 22 | getSpritePosition(sheet: EmojiData['sheet'], sheetColumns: number): string; 23 | sanitize(emoji: EmojiData | null): EmojiData | null; 24 | getSanitizedData(emoji: string | EmojiData, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData; 25 | } 26 | -------------------------------------------------------------------------------- /_mock/_geo.ts: -------------------------------------------------------------------------------- 1 | import { MockRequest } from '@delon/mock'; 2 | 3 | const DATA = [ 4 | { 5 | name: '上海', 6 | id: '310000', 7 | }, 8 | { 9 | name: '市辖区', 10 | id: '310100', 11 | }, 12 | { 13 | name: '北京', 14 | id: '110000', 15 | }, 16 | { 17 | name: '市辖区', 18 | id: '110100', 19 | }, 20 | { 21 | name: '浙江省', 22 | id: '330000', 23 | }, 24 | { 25 | name: '杭州市', 26 | id: '330100', 27 | }, 28 | { 29 | name: '宁波市', 30 | id: '330200', 31 | }, 32 | { 33 | name: '温州市', 34 | id: '330300', 35 | }, 36 | { 37 | name: '嘉兴市', 38 | id: '330400', 39 | }, 40 | { 41 | name: '湖州市', 42 | id: '330500', 43 | }, 44 | { 45 | name: '绍兴市', 46 | id: '330600', 47 | }, 48 | { 49 | name: '金华市', 50 | id: '330700', 51 | }, 52 | { 53 | name: '衢州市', 54 | id: '330800', 55 | }, 56 | { 57 | name: '舟山市', 58 | id: '330900', 59 | }, 60 | { 61 | name: '台州市', 62 | id: '331000', 63 | }, 64 | { 65 | name: '丽水市', 66 | id: '331100', 67 | }, 68 | ]; 69 | 70 | export const GEOS = { 71 | '/geo/province': () => DATA.filter(w => w.id.endsWith('0000')), 72 | '/geo/:id': (req: MockRequest) => { 73 | const pid = (req.params.id || '310000').slice(0, 2); 74 | return DATA.filter(w => w.id.slice(0, 2) === pid && !w.id.endsWith('0000')); 75 | }, 76 | }; 77 | -------------------------------------------------------------------------------- /scripts/_ci/deploy-pipelines.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | GH=false 6 | DAY=false 7 | for ARG in "$@"; do 8 | case "$ARG" in 9 | -gh) 10 | GH=true 11 | ;; 12 | -day) 13 | DAY=true 14 | ;; 15 | esac 16 | done 17 | 18 | echo "List:" 19 | ls -al 20 | 21 | ROOT_DIR="$(pwd)" 22 | DIST_DIR="$(pwd)/dist" 23 | 24 | VERSION=$(node -p "require('./package.json').version") 25 | 26 | echo "Start build version: ${VERSION}" 27 | 28 | if [[ ${DAY} == true ]]; then 29 | echo "" 30 | echo "Download day @delon/* libs" 31 | echo "" 32 | bash ./scripts/_ci/delon.sh 33 | fi 34 | 35 | echo "" 36 | echo "Generate color less" 37 | echo "" 38 | npm run color-less 39 | 40 | echo "" 41 | echo "Generate theme files" 42 | echo "" 43 | npm run theme 44 | 45 | echo '===== need mock' 46 | sed -i 's/if (!environment.production)/if (true)/g' ${ROOT_DIR}/src/app/global-config.module.ts 47 | sed -i 's/if (!environment.production)/if (true)/g' ${ROOT_DIR}/src/app/layout/default/default.component.ts 48 | 49 | if [[ ${GH} == true ]]; then 50 | echo "Build angular [github gh-pages]" 51 | node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /ng-alain/ 52 | else 53 | echo "Build angular" 54 | node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod 55 | fi 56 | 57 | cp -f ${DIST_DIR}/index.html ${DIST_DIR}/404.html 58 | 59 | echo "Finished" 60 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/notification/notification.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 | 5 | 10 | 11 |
12 | 16 |
17 | 18 |
    19 | 20 | 25 | 26 |
27 | 31 |
32 | 33 |
    34 | 35 | 40 | 41 |
42 | 46 |
47 |
48 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/picker.module.d.ts: -------------------------------------------------------------------------------- 1 | import * as ɵngcc0 from "@angular/core"; 2 | import * as ɵngcc1 from "./picker.component"; 3 | import * as ɵngcc2 from "./anchors.component"; 4 | import * as ɵngcc3 from "./category.component"; 5 | import * as ɵngcc4 from "./search.component"; 6 | import * as ɵngcc5 from "./preview.component"; 7 | import * as ɵngcc6 from "./skins.component"; 8 | import * as ɵngcc7 from "@angular/common"; 9 | import * as ɵngcc8 from "@angular/forms"; 10 | import * as ɵngcc9 from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 11 | export declare class PickerModule { 12 | static ɵmod: ɵngcc0.ɵɵNgModuleDefWithMeta< 13 | PickerModule, 14 | [ 15 | typeof ɵngcc1.PickerComponent, 16 | typeof ɵngcc2.AnchorsComponent, 17 | typeof ɵngcc3.CategoryComponent, 18 | typeof ɵngcc4.SearchComponent, 19 | typeof ɵngcc5.PreviewComponent, 20 | typeof ɵngcc6.SkinComponent 21 | ], 22 | [ 23 | typeof ɵngcc7.CommonModule, 24 | typeof ɵngcc8.FormsModule, 25 | typeof ɵngcc9.EmojiModule 26 | ], 27 | [ 28 | typeof ɵngcc1.PickerComponent, 29 | typeof ɵngcc2.AnchorsComponent, 30 | typeof ɵngcc3.CategoryComponent, 31 | typeof ɵngcc4.SearchComponent, 32 | typeof ɵngcc5.PreviewComponent, 33 | typeof ɵngcc6.SkinComponent 34 | ] 35 | >; 36 | static ɵinj: ɵngcc0.ɵɵInjectorDef; 37 | } 38 | 39 | //# sourceMappingURL=picker.module.d.ts.map 40 | -------------------------------------------------------------------------------- /src/app/routes/passport/login/login.component.less: -------------------------------------------------------------------------------- 1 | @import '~@delon/theme/index'; 2 | :host { 3 | display: block; 4 | width: 368px; 5 | margin: 0 auto; 6 | ::ng-deep { 7 | .ant-tabs .ant-tabs-bar { 8 | margin-bottom: 24px; 9 | text-align: center; 10 | border-bottom: 0; 11 | } 12 | .ant-tabs-tab { 13 | font-size: 16px; 14 | line-height: 24px; 15 | } 16 | .ant-input-affix-wrapper .ant-input:not(:first-child) { 17 | padding-left: 4px; 18 | } 19 | .icon { 20 | margin-left: 16px; 21 | color: rgba(0, 0, 0, 0.2); 22 | font-size: 24px; 23 | vertical-align: middle; 24 | cursor: pointer; 25 | transition: color 0.3s; 26 | &:hover { 27 | color: @primary-color; 28 | } 29 | } 30 | .other { 31 | margin-top: 24px; 32 | line-height: 22px; 33 | text-align: left; 34 | 35 | .icon { 36 | width: 24px; 37 | height: 24px; 38 | filter: grayscale(1); 39 | 40 | &:hover { 41 | filter: grayscale(0); 42 | } 43 | } 44 | 45 | nz-tooltip { 46 | vertical-align: middle; 47 | } 48 | .register { 49 | float: right; 50 | } 51 | } 52 | } 53 | } 54 | 55 | [data-theme='dark'] { 56 | :host ::ng-deep { 57 | .icon { 58 | color: rgba(255, 255, 255, 0.2); 59 | &:hover { 60 | color: #fff; 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/ngx-emoji/emoji.module.js: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { EmojiComponent } from './emoji.component'; 4 | export class EmojiModule { 5 | } 6 | EmojiModule.decorators = [ 7 | { type: NgModule, args: [{ 8 | imports: [CommonModule], 9 | exports: [EmojiComponent], 10 | declarations: [EmojiComponent], 11 | },] } 12 | ]; 13 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9waWNrZXIvbmd4LWVtb2ppL2Vtb2ppLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFPbkQsTUFBTSxPQUFPLFdBQVc7OztZQUx2QixRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUN2QixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQ3pCLFlBQVksRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFbW9qaUNvbXBvbmVudCB9IGZyb20gJy4vZW1vamkuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtFbW9qaUNvbXBvbmVudF0sXG4gIGRlY2xhcmF0aW9uczogW0Vtb2ppQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRW1vamlNb2R1bGUge31cbiJdfQ== -------------------------------------------------------------------------------- /src/app/routes/passport/lock/lock.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject } from '@angular/core'; 2 | import { FormBuilder, FormGroup, Validators } from '@angular/forms'; 3 | import { Router } from '@angular/router'; 4 | import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; 5 | import { SettingsService, User as SystemUser } from '@delon/theme'; 6 | import { User } from "@model/application/conversation.interface"; 7 | 8 | @Component({ 9 | selector: 'passport-lock', 10 | templateUrl: './lock.component.html', 11 | styleUrls: ['./lock.component.less'], 12 | }) 13 | export class UserLockComponent { 14 | f: FormGroup; 15 | 16 | get user(): SystemUser | User { 17 | return this.settings.user; 18 | } 19 | 20 | constructor( 21 | fb: FormBuilder, 22 | @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, 23 | private settings: SettingsService, 24 | private router: Router, 25 | ) { 26 | this.f = fb.group({ 27 | password: [null, Validators.required], 28 | }); 29 | } 30 | 31 | submit(): void { 32 | // tslint:disable-next-line:forin 33 | for (const i in this.f.controls) { 34 | this.f.controls[i].markAsDirty(); 35 | this.f.controls[i].updateValueAndValidity(); 36 | } 37 | if (this.f.valid) { 38 | console.log('Valid!'); 39 | console.log(this.f.value); 40 | this.tokenService.set({ 41 | token: '123', 42 | }); 43 | this.router.navigate(['dashboard']); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/app/routes/pro/profile/basic/basic.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1000000000 5 | 已取货 6 | 1234123421 7 | 3214321432 8 | 9 | 10 | 11 | 付小小 12 | 18100000000 13 | 菜鸟仓储 14 | 浙江省杭州市西湖区万塘路18号 15 | 16 | 17 | 18 |
退货商品
19 | 26 | 27 | 28 | 合计 29 | 30 | 31 | 32 | 33 | {{ basicNum }} 34 | 35 | 36 | {{ amountNum | _currency }} 37 | 38 | 39 | 40 | 41 |
退货进度
42 | 47 |
48 | -------------------------------------------------------------------------------- /scripts/_ci/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | GH=false 6 | DAY_RELEASE=false 7 | NETLIFY=false 8 | for ARG in "$@"; do 9 | case "$ARG" in 10 | -gh) 11 | GH=true 12 | ;; 13 | -dr) 14 | DAY_RELEASE=true 15 | ;; 16 | -netlify) 17 | NETLIFY=true 18 | ;; 19 | esac 20 | done 21 | 22 | cd $(dirname $0)/../.. 23 | 24 | ls -al 25 | 26 | ROOT_DIR="$(pwd)" 27 | DIST_DIR="$(pwd)/dist" 28 | 29 | VERSION=$(node -p "require('./package.json').version") 30 | 31 | echo "Start build version: ${VERSION}" 32 | 33 | if [[ ${DAY_RELEASE} == true ]]; then 34 | bash ./scripts/_ci/delon.sh 35 | fi 36 | 37 | echo "" 38 | echo "Generate color less" 39 | echo "" 40 | npm run color-less 41 | 42 | echo '===== need mock' 43 | sed -i 's/if (!environment.production)/if (true)/g' ${ROOT_DIR}/src/app/global-config.module.ts 44 | sed -i 's/if (!environment.production)/if (true)/g' ${ROOT_DIR}/src/app/layout/default/default.component.ts 45 | 46 | echo "" 47 | echo "Build angular" 48 | echo "" 49 | 50 | if [[ ${GH} == true ]]; then 51 | node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /ng-alain/ 52 | else 53 | node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod 54 | fi 55 | cp -f ${DIST_DIR}/index.html ${DIST_DIR}/404.html 56 | 57 | if [[ ${GH} == true ]]; then 58 | echo "" 59 | echo "Deploy by gh-pages" 60 | echo "" 61 | $(npm bin)/gh-pages -d dist 62 | fi 63 | 64 | echo "Finished" 65 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.service.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"emoji.service.d.ts","sources":["emoji.service.d.ts"],"names":[],"mappings":"AAAA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA","sourcesContent":["import { CompressedEmojiData, EmojiData } from './data/data.interfaces';\nimport { Emoji } from './emoji.component';\nexport declare const DEFAULT_BACKGROUNDFN: (set: string, sheetSize: number) => string;\nexport declare class EmojiService {\n uncompressed: boolean;\n names: {\n [key: string]: EmojiData;\n };\n emojis: EmojiData[];\n constructor();\n uncompress(list: CompressedEmojiData[]): void;\n getData(emoji: EmojiData | string, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData | null;\n unifiedToNative(unified: string): string;\n emojiSpriteStyles(sheet: EmojiData['sheet'], set?: Emoji['set'], size?: Emoji['size'], sheetSize?: Emoji['sheetSize'], sheetRows?: Emoji['sheetRows'], backgroundImageFn?: Emoji['backgroundImageFn'], sheetColumns?: number): {\n width: string;\n height: string;\n display: string;\n 'background-image': string;\n 'background-size': string;\n 'background-position': string;\n };\n getSpritePosition(sheet: EmojiData['sheet'], sheetColumns: number): string;\n sanitize(emoji: EmojiData | null): EmojiData | null;\n getSanitizedData(emoji: string | EmojiData, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData;\n}\n"]} -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/security/security.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 修改 5 | 6 | 7 | 8 | 当前密码强度: 9 | 10 | 11 | 12 | 13 | 14 | 修改 15 | 16 | 17 | 18 | 19 | 已绑定手机:{{user.phone}} 20 | 21 | 22 | 未绑定手机 23 | 24 | 25 | 26 | 27 | 28 | 29 | 修改 30 | 31 | 32 | 33 | 34 | 已绑定邮箱:{{user.email}} 35 | 36 | 37 | 未绑定手机 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/emoji.service.d.ts: -------------------------------------------------------------------------------- 1 | import { CompressedEmojiData, EmojiData } from './data/data.interfaces'; 2 | import { Emoji } from './emoji.component'; 3 | import * as ɵngcc0 from '@angular/core'; 4 | export declare const DEFAULT_BACKGROUNDFN: (set: string, sheetSize: number) => string; 5 | export declare class EmojiService { 6 | uncompressed: boolean; 7 | names: { 8 | [key: string]: EmojiData; 9 | }; 10 | emojis: EmojiData[]; 11 | constructor(); 12 | uncompress(list: CompressedEmojiData[]): void; 13 | getData(emoji: EmojiData | string, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData | null; 14 | unifiedToNative(unified: string): string; 15 | emojiSpriteStyles(sheet: EmojiData['sheet'], set?: Emoji['set'], size?: Emoji['size'], sheetSize?: Emoji['sheetSize'], sheetRows?: Emoji['sheetRows'], backgroundImageFn?: Emoji['backgroundImageFn'], sheetColumns?: number): { 16 | width: string; 17 | height: string; 18 | display: string; 19 | 'background-image': string; 20 | 'background-size': string; 21 | 'background-position': string; 22 | }; 23 | getSpritePosition(sheet: EmojiData['sheet'], sheetColumns: number): string; 24 | sanitize(emoji: EmojiData | null): EmojiData | null; 25 | getSanitizedData(emoji: string | EmojiData, skin?: Emoji['skin'], set?: Emoji['set']): EmojiData; 26 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 27 | } 28 | 29 | //# sourceMappingURL=emoji.service.d.ts.map -------------------------------------------------------------------------------- /src/app/layout/default/theme-btn/theme-btn.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 |
    13 |
  • Default Theme
  • 14 |
  • Dark Theme
  • 15 |
  • Compact Theme
  • 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/data/data.interfaces.d.ts: -------------------------------------------------------------------------------- 1 | import { Emoji } from "../emoji.component"; 2 | export interface EmojiCategory { 3 | id: string; 4 | name: string; 5 | emojis: any[] | null; 6 | anchor?: boolean; 7 | first?: boolean; 8 | } 9 | export interface CompressedEmojiData { 10 | name: string; 11 | unified: string; 12 | shortName: string; 13 | shortNames?: string[]; 14 | sheet: [number, number]; 15 | keywords?: string[]; 16 | hidden?: string[]; 17 | emoticons?: string[]; 18 | text?: string; 19 | skinVariations?: EmojiVariation[]; 20 | obsoletedBy?: string; 21 | obsoletes?: string; 22 | } 23 | export interface EmojiData { 24 | id: string; 25 | name: string; 26 | unified?: string; 27 | shortName: string; 28 | shortNames: string[]; 29 | sheet: [number, number]; 30 | keywords: string[]; 31 | hidden: string[]; 32 | emoticons: string[]; 33 | text: string; 34 | set?: Emoji["set"]; 35 | skinVariations: EmojiVariation[]; 36 | obsoletedBy?: string; 37 | obsoletes?: string; 38 | skinTone?: Emoji["skin"]; 39 | custom?: boolean; 40 | native?: string; 41 | imageUrl?: string; 42 | colons?: string; 43 | skin?: Emoji["skin"]; 44 | spriteUrl?: string; 45 | sheetRows?: string; 46 | } 47 | export interface EmojiVariation { 48 | unified: string; 49 | sheet: [number, number]; 50 | hidden?: string[]; 51 | } 52 | export interface SkinData { 53 | name: string; 54 | unified: string; 55 | shortName: string; 56 | sheet: [number, number]; 57 | } 58 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/settings/binding/binding.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 修改 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 修改 19 | 20 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 修改 33 | 34 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/ngx-emoji/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@shared/lib/ngx-emoji-mart/ngx-emoji", 3 | "author": "scttcper", 4 | "repository": "scttcper/ngx-emoji-mart", 5 | "license": "MIT", 6 | "sideEffects": [ 7 | "*.css" 8 | ], 9 | "main": "../bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js", 10 | "module_ivy_ngcc": "../__ivy_ngcc__/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 11 | "module": "../fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 12 | "es2015_ivy_ngcc": "../__ivy_ngcc__/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 13 | "es2015": "../fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 14 | "esm2015": "../esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js", 15 | "fesm2015_ivy_ngcc": "../__ivy_ngcc__/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 16 | "fesm2015": "../fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js", 17 | "typings": "ctrl-ngx-emoji-mart-ngx-emoji.d.ts", 18 | "metadata": "ctrl-ngx-emoji-mart-ngx-emoji.metadata.json", 19 | "__processed_by_ivy_ngcc__": { 20 | "es2015": "10.1.5", 21 | "fesm2015": "10.1.5", 22 | "module": "10.1.5", 23 | "typings": "10.1.5" 24 | }, 25 | "scripts": { 26 | "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled by NGCC. This is not allowed.\\nPlease delete and rebuild the package, without compiling with NGCC, before attempting to publish.\\nNote that NGCC may have been run by importing this package into another project that is being built with Ivy enabled.\\n')\" && exit 1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/search.component.d.ts: -------------------------------------------------------------------------------- 1 | import { AfterViewInit, EventEmitter, OnInit } from '@angular/core'; 2 | import { EmojiSearch } from './emoji-search.service'; 3 | import * as ɵngcc0 from '@angular/core'; 4 | export declare class SearchComponent implements AfterViewInit, OnInit { 5 | private emojiSearch; 6 | maxResults: number; 7 | autoFocus: boolean; 8 | i18n: any; 9 | include: string[]; 10 | exclude: string[]; 11 | custom: any[]; 12 | icons: { 13 | [key: string]: string; 14 | }; 15 | emojisToShowFilter?: (x: any) => boolean; 16 | searchResults: EventEmitter; 17 | enterKey: EventEmitter; 18 | private inputRef; 19 | isSearching: boolean; 20 | icon?: string; 21 | query: string; 22 | inputId: string; 23 | constructor(emojiSearch: EmojiSearch); 24 | ngOnInit(): void; 25 | ngAfterViewInit(): void; 26 | clear(): void; 27 | handleEnterKey($event: Event): void; 28 | handleSearch(value: string): void; 29 | handleChange(): void; 30 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 31 | static ɵcmp: ɵngcc0.ɵɵComponentDefWithMeta; 32 | } 33 | 34 | //# sourceMappingURL=search.component.d.ts.map -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/articles/articles.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ item.title }} 6 | 7 | 8 | Alain 9 | ng-zorro-antd 10 | Ant Design 11 | 12 | 13 |

{{ item.content }}

14 |
15 | 20 | {{ item.owner }} 21 | 发布在 22 | {{ item.href }} 23 | 26 |
27 |
    28 | 29 | {{ item.star }} 30 | 31 | {{ item.like }} 35 | {{ item.message }} 39 |
40 |
41 |
42 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/articles/articles.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ item.title }} 6 | 7 | 8 | Alain 9 | ng-zorro-antd 10 | Ant Design 11 | 12 | 13 |

{{ item.content }}

14 |
15 | 20 | {{ item.owner }} 21 | 发布在 22 | {{ item.href }} 23 | 26 |
27 |
    28 | 29 | {{ item.star }} 30 | 31 | {{ item.like }} 35 | {{ item.message }} 39 |
40 |
41 |
42 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/preview.component.d.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectorRef, EventEmitter, OnChanges } from "@angular/core"; 2 | import { 3 | Emoji, 4 | EmojiData, 5 | EmojiService, 6 | } from "@shared/lib/ngx-emoji-mart/ngx-emoji"; 7 | import * as ɵngcc0 from "@angular/core"; 8 | export declare class PreviewComponent implements OnChanges { 9 | ref: ChangeDetectorRef; 10 | private emojiService; 11 | title?: string; 12 | emoji: any; 13 | idleEmoji: any; 14 | i18n: any; 15 | emojiIsNative?: Emoji["isNative"]; 16 | emojiSkin?: Emoji["skin"]; 17 | emojiSize?: Emoji["size"]; 18 | emojiSet?: Emoji["set"]; 19 | emojiSheetSize?: Emoji["sheetSize"]; 20 | emojiBackgroundImageFn?: Emoji["backgroundImageFn"]; 21 | skinChange: EventEmitter; 22 | emojiData: Partial; 23 | listedEmoticons?: string[]; 24 | constructor(ref: ChangeDetectorRef, emojiService: EmojiService); 25 | ngOnChanges(): void; 26 | static ɵfac: ɵngcc0.ɵɵFactoryDef; 27 | static ɵcmp: ɵngcc0.ɵɵComponentDefWithMeta< 28 | PreviewComponent, 29 | "emoji-preview", 30 | never, 31 | { 32 | title: "title"; 33 | emoji: "emoji"; 34 | idleEmoji: "idleEmoji"; 35 | i18n: "i18n"; 36 | emojiIsNative: "emojiIsNative"; 37 | emojiSkin: "emojiSkin"; 38 | emojiSize: "emojiSize"; 39 | emojiSet: "emojiSet"; 40 | emojiSheetSize: "emojiSheetSize"; 41 | emojiBackgroundImageFn: "emojiBackgroundImageFn"; 42 | }, 43 | { skinChange: "skinChange" }, 44 | never, 45 | never 46 | >; 47 | } 48 | 49 | //# sourceMappingURL=preview.component.d.ts.map 50 | -------------------------------------------------------------------------------- /src/app/shared/service/conversation.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | import { _HttpClient } from "@delon/theme"; 3 | import { SendMessageModel } from "@model/application/conversation.interface"; 4 | import { 5 | ConversationModel, 6 | MessageData, 7 | } from "@model/application/conversation.interface"; 8 | import { Res } from "@model/common/common.interface"; 9 | import { Observable } from "rxjs"; 10 | 11 | @Injectable({ 12 | providedIn: "root", 13 | }) 14 | export class ConversationService { 15 | constructor(private http: _HttpClient) {} 16 | 17 | // 获取会话列表 18 | getConversationList( 19 | type: "assigned" | "unassigned" | "history", 20 | keyword?: string, 21 | offset?: string 22 | ): Observable> { 23 | return this.http.get("api/conversation/list", { 24 | type, 25 | offset: offset || "", 26 | keyword: keyword || "", 27 | }); 28 | } 29 | 30 | // 获取聊天记录 31 | getMessages(id: string, offset?: string): Observable> { 32 | const api = offset 33 | ? `api/conversation/${id}/messages?offset=${offset}` 34 | : `api/conversation/${id}/messages`; 35 | 36 | return this.http.get(api); 37 | } 38 | 39 | // 获取访客列表 40 | getVisitorList(params: { 41 | type: `online` | `offline` | `all`; 42 | offset?: string; 43 | }): Observable> { 44 | return this.http.get("api/conversation/list-ungreeted", params); 45 | } 46 | 47 | // 发送消息 48 | sendMessage(id: string, data: SendMessageModel): Observable> { 49 | return this.http.post(`api/conversation/${id}/send-message`, data); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /_mock/_pois.ts: -------------------------------------------------------------------------------- 1 | export const POIS = { 2 | '/pois': { 3 | total: 2, 4 | list: [ 5 | { 6 | id: 10000, 7 | user_id: 1, 8 | name: '测试品牌', 9 | branch_name: '测试分店', 10 | geo: 310105, 11 | country: '中国', 12 | province: '上海', 13 | city: '上海市', 14 | district: '长宁区', 15 | address: '中山公园', 16 | tel: '15900000000', 17 | categories: '美食,粤菜,湛江菜', 18 | lng: 121.41707989151003, 19 | lat: 31.218656214644792, 20 | recommend: '推荐品', 21 | special: '特色服务', 22 | introduction: '商户简介', 23 | open_time: '营业时间', 24 | avg_price: 260, 25 | reason: null, 26 | status: 1, 27 | status_str: '待审核', 28 | status_wx: 1, 29 | modified: 1505826527288, 30 | created: 1505826527288, 31 | }, 32 | { 33 | id: 10001, 34 | user_id: 2, 35 | name: '测试品牌2', 36 | branch_name: '测试分店2', 37 | geo: 310105, 38 | country: '中国', 39 | province: '上海', 40 | city: '上海市', 41 | district: '长宁区', 42 | address: '中山公园', 43 | tel: '15900000000', 44 | categories: '美食,粤菜,湛江菜', 45 | lng: 121.41707989151003, 46 | lat: 31.218656214644792, 47 | recommend: '推荐品', 48 | special: '特色服务', 49 | introduction: '商户简介', 50 | open_time: '营业时间', 51 | avg_price: 260, 52 | reason: null, 53 | status: 1, 54 | status_str: '待审核', 55 | status_wx: 1, 56 | modified: 1505826527288, 57 | created: 1505826527288, 58 | }, 59 | ], 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /src/app/routes/pro/profile/advanced/advanced.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | ChangeDetectorRef, 4 | Component, 5 | OnInit, 6 | } from "@angular/core"; 7 | import { STColumn } from "@delon/abc/st"; 8 | import { _HttpClient } from "@delon/theme"; 9 | import { NzSafeAny } from "ng-zorro-antd/core/types"; 10 | import { NzMessageService } from "ng-zorro-antd/message"; 11 | import { NzTabChangeEvent } from "ng-zorro-antd/tabs"; 12 | 13 | @Component({ 14 | selector: "app-profile-advanced", 15 | templateUrl: "./advanced.component.html", 16 | styleUrls: ["./advanced.component.less"], 17 | changeDetection: ChangeDetectionStrategy.OnPush, 18 | }) 19 | export class ProProfileAdvancedComponent implements OnInit { 20 | list: Array<{ [key: string]: NzSafeAny }> = []; 21 | data = { 22 | advancedOperation1: [], 23 | advancedOperation2: [], 24 | advancedOperation3: [], 25 | }; 26 | opColumns: STColumn[] = [ 27 | { title: "操作类型", index: "type" }, 28 | { title: "操作人", index: "name" }, 29 | { title: "执行结果", index: "status", render: "status" }, 30 | { title: "操作时间", index: "updatedAt", type: "date" }, 31 | { title: "备注", index: "memo", default: "-" }, 32 | ]; 33 | 34 | constructor( 35 | public msg: NzMessageService, 36 | private http: _HttpClient, 37 | private cdr: ChangeDetectorRef 38 | ) { } 39 | 40 | ngOnInit(): void { 41 | this.http.get("/profile/advanced").subscribe((res) => { 42 | this.data = res; 43 | this.change({ index: 0, tab: null }); 44 | this.cdr.markForCheck(); 45 | this.cdr.detectChanges(); 46 | }); 47 | } 48 | 49 | change(args: NzTabChangeEvent): void { 50 | this.list = this.data[`advancedOperation${args.index + 1}`]; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/center.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | 3 | .avatarHolder { 4 | margin-bottom: 24px; 5 | text-align: center; 6 | 7 | & > img { 8 | width: 104px; 9 | height: 104px; 10 | margin-bottom: 20px; 11 | } 12 | 13 | .name { 14 | margin-bottom: 4px; 15 | color: @heading-color; 16 | font-weight: 500; 17 | font-size: 20px; 18 | line-height: 28px; 19 | } 20 | } 21 | 22 | .detail { 23 | p { 24 | position: relative; 25 | margin-bottom: 8px; 26 | padding-left: 26px; 27 | 28 | &:last-child { 29 | margin-bottom: 0; 30 | } 31 | } 32 | 33 | i { 34 | position: absolute; 35 | top: 4px; 36 | left: 0; 37 | width: 14px; 38 | height: 14px; 39 | background: url(https://gw.alipayobjects.com/zos/rmsportal/pBjWzVAHnOOtAUvZmZfy.svg); 40 | 41 | &.title { 42 | background-position: 0 0; 43 | } 44 | 45 | &.group { 46 | background-position: 0 -22px; 47 | } 48 | 49 | &.address { 50 | background-position: 0 -44px; 51 | } 52 | } 53 | } 54 | 55 | .tagsTitle, 56 | .teamTitle { 57 | margin-bottom: 12px; 58 | color: @heading-color; 59 | font-weight: 500; 60 | } 61 | 62 | .tags { 63 | ::ng-deep { 64 | .ant-tag { 65 | margin-bottom: 8px; 66 | } 67 | } 68 | } 69 | 70 | .team { 71 | ::ng-deep { 72 | .ant-avatar { 73 | margin-right: 12px; 74 | } 75 | } 76 | 77 | a { 78 | display: block; 79 | margin-bottom: 24px; 80 | color: @text-color; 81 | transition: color 0.3s; 82 | 83 | &:hover { 84 | color: @primary-color; 85 | } 86 | } 87 | } 88 | 89 | .tabsCard { 90 | ::ng-deep { 91 | .ant-card-head-title { 92 | padding: 0 16px; 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/center.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | 3 | .avatarHolder { 4 | margin-bottom: 24px; 5 | text-align: center; 6 | 7 | & > img { 8 | width: 104px; 9 | height: 104px; 10 | margin-bottom: 20px; 11 | } 12 | 13 | .name { 14 | margin-bottom: 4px; 15 | color: @heading-color; 16 | font-weight: 500; 17 | font-size: 20px; 18 | line-height: 28px; 19 | } 20 | } 21 | 22 | .detail { 23 | p { 24 | position: relative; 25 | margin-bottom: 8px; 26 | padding-left: 26px; 27 | 28 | &:last-child { 29 | margin-bottom: 0; 30 | } 31 | } 32 | 33 | i { 34 | position: absolute; 35 | top: 4px; 36 | left: 0; 37 | width: 14px; 38 | height: 14px; 39 | background: url(https://gw.alipayobjects.com/zos/rmsportal/pBjWzVAHnOOtAUvZmZfy.svg); 40 | 41 | &.title { 42 | background-position: 0 0; 43 | } 44 | 45 | &.group { 46 | background-position: 0 -22px; 47 | } 48 | 49 | &.address { 50 | background-position: 0 -44px; 51 | } 52 | } 53 | } 54 | 55 | .tagsTitle, 56 | .teamTitle { 57 | margin-bottom: 12px; 58 | color: @heading-color; 59 | font-weight: 500; 60 | } 61 | 62 | .tags { 63 | ::ng-deep { 64 | .ant-tag { 65 | margin-bottom: 8px; 66 | } 67 | } 68 | } 69 | 70 | .team { 71 | ::ng-deep { 72 | .ant-avatar { 73 | margin-right: 12px; 74 | } 75 | } 76 | 77 | a { 78 | display: block; 79 | margin-bottom: 24px; 80 | color: @text-color; 81 | transition: color 0.3s; 82 | 83 | &:hover { 84 | color: @primary-color; 85 | } 86 | } 87 | } 88 | 89 | .tabsCard { 90 | ::ng-deep { 91 | .ant-card-head-title { 92 | padding: 0 16px; 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /scripts/_ci/github-comment.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch'); 2 | 3 | const REPO = process.env.ACCESS_REPO; 4 | const TOKEN = process.env.ACCESS_TOKEN; 5 | const PR = process.env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER; 6 | const argv = process.argv; 7 | const tag = argv[argv.length - 2]; 8 | const comment = argv[argv.length - 1]; 9 | const REPLACE_MARK = ``; 10 | 11 | const wrappedComment = ` 12 | ${REPLACE_MARK} 13 | ${comment} 14 | `.trim(); 15 | 16 | async function withGithub(url, json, method) { 17 | const res = await fetch(url, { 18 | method: method || (json ? 'POST' : 'GET'), 19 | headers: { 20 | Accept: 'application/json', 21 | 'Content-Type': 'application/json', 22 | Authorization: `Basic ${Buffer.from(TOKEN).toString('base64')}`, 23 | }, 24 | body: json ? JSON.stringify(json) : undefined, 25 | }); 26 | 27 | return res.json(); 28 | } 29 | 30 | (async function run() { 31 | const comments = await withGithub(`https://api.github.com/repos/${REPO}/issues/${PR}/comments`); 32 | 33 | // Find my comment 34 | const updateComment = comments.find(({ body }) => body.includes(REPLACE_MARK)); 35 | // eslint-disable-next-line no-console 36 | console.log('Origin comment:', updateComment); 37 | 38 | // Update 39 | let res; 40 | if (!updateComment) { 41 | res = await withGithub(`https://api.github.com/repos/${REPO}/issues/${PR}/comments`, { 42 | body: wrappedComment, 43 | }); 44 | } else { 45 | res = await withGithub( 46 | `https://api.github.com/repos/${REPO}/issues/comments/${updateComment.id}`, 47 | { 48 | body: wrappedComment, 49 | }, 50 | 'PATCH', 51 | ); 52 | } 53 | 54 | // eslint-disable-next-line no-console 55 | console.log(res); 56 | })(); 57 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/category.component.d.ts.__ivy_ngcc_bak: -------------------------------------------------------------------------------- 1 | import { ChangeDetectorRef, ElementRef, OnInit } from '@angular/core'; 2 | import { Emoji, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji'; 3 | import { EmojiFrequentlyService } from './emoji-frequently.service'; 4 | export declare class CategoryComponent implements OnInit { 5 | ref: ChangeDetectorRef; 6 | private emojiService; 7 | private frequently; 8 | emojis?: any[] | null; 9 | hasStickyPosition: boolean; 10 | name: string; 11 | perLine: number; 12 | totalFrequentLines: number; 13 | recent: string[]; 14 | custom: any[]; 15 | i18n: any; 16 | id: any; 17 | hideObsolete: boolean; 18 | notFoundEmoji?: string; 19 | emojiIsNative?: Emoji['isNative']; 20 | emojiSkin: Emoji['skin']; 21 | emojiSize: Emoji['size']; 22 | emojiSet: Emoji['set']; 23 | emojiSheetSize: Emoji['sheetSize']; 24 | emojiForceSize: Emoji['forceSize']; 25 | emojiTooltip: Emoji['tooltip']; 26 | emojiBackgroundImageFn?: Emoji['backgroundImageFn']; 27 | emojiUseButton?: boolean; 28 | emojiOver: Emoji['emojiOver']; 29 | emojiLeave: Emoji['emojiLeave']; 30 | emojiClick: Emoji['emojiClick']; 31 | container: ElementRef; 32 | label: ElementRef; 33 | containerStyles: any; 34 | labelStyles: any; 35 | labelSpanStyles: any; 36 | margin: number; 37 | minMargin: number; 38 | maxMargin: number; 39 | top: number; 40 | constructor(ref: ChangeDetectorRef, emojiService: EmojiService, frequently: EmojiFrequentlyService); 41 | ngOnInit(): void; 42 | memoizeSize(): void; 43 | handleScroll(scrollTop: number): boolean; 44 | getEmojis(): any[]; 45 | updateDisplay(display: 'none' | 'block'): void; 46 | trackById(index: number, item: any): any; 47 | } 48 | -------------------------------------------------------------------------------- /src/app/routes/passport/verify/email-verify.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { FormBuilder, FormGroup, Validators } from "@angular/forms"; 3 | import { Router } from "@angular/router"; 4 | import { _HttpClient } from "@delon/theme"; 5 | import { NzMessageService } from "ng-zorro-antd/message"; 6 | 7 | @Component({ 8 | selector: "passport-lock", 9 | templateUrl: "./email-verify.component.html", 10 | styleUrls: ["./email-verify.component.less"], 11 | }) 12 | export class EmailVerifyComponent implements OnInit { 13 | f: FormGroup; 14 | success = false; 15 | 16 | constructor( 17 | fb: FormBuilder, 18 | private router: Router, 19 | public http: _HttpClient, 20 | private msg: NzMessageService 21 | ) { 22 | this.f = fb.group({ 23 | email: [null, Validators.required], 24 | }); 25 | } 26 | 27 | ngOnInit(): void { 28 | this.submit(); 29 | } 30 | 31 | submit(): void { 32 | this.http 33 | .post( 34 | "api/" + 35 | location.href.split(location.origin + "/")[1] + 36 | "&_allow_anonymous=true" 37 | ) 38 | .subscribe( 39 | (res: { status?: string; message?: string; success?: boolean }) => { 40 | if (res.status && res.status == "verification.verified") { 41 | this.msg.success("验证成功!请登录"); 42 | this.success = true; 43 | 44 | setTimeout(() => { 45 | this.router.navigateByUrl("conversation/chat"); 46 | }, 1000); 47 | return; 48 | } 49 | this.msg.error(res.message); 50 | }, 51 | (err: { error: { status?: string }; statusText: string }) => { 52 | if (err.error && err.error.status) { 53 | this.msg.error(err.error.status); 54 | return; 55 | } 56 | this.msg.error(err.statusText); 57 | } 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/app/routes/pro/profile/basic/basic.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | import { STColumn } from "@delon/abc/st"; 3 | import { _HttpClient } from "@delon/theme"; 4 | import { NzMessageService } from "ng-zorro-antd/message"; 5 | import { tap } from "rxjs/operators"; 6 | 7 | @Component({ 8 | selector: "app-profile-basic", 9 | templateUrl: "./basic.component.html", 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class ProProfileBaseComponent { 13 | basicNum = 0; 14 | amountNum = 0; 15 | goods = this.http.get("/profile/goods").pipe( 16 | tap((list: Array<{ num: number; amount: number }>) => { 17 | list.forEach((item) => { 18 | this.basicNum += Number(item.num); 19 | this.amountNum += Number(item.amount); 20 | }); 21 | }) 22 | ); 23 | goodsColumns: STColumn[] = [ 24 | { 25 | title: "商品编号", 26 | index: "id", 27 | type: "link", 28 | click: (item) => this.msg.success(`show ${item.id}`), 29 | }, 30 | { title: "商品名称", index: "name" }, 31 | { title: "商品条码", index: "barcode" }, 32 | { title: "单价", index: "price", type: "currency" }, 33 | { title: "数量(件)", index: "num", className: "text-right" }, 34 | { title: "金额", index: "amount", type: "currency" }, 35 | ]; 36 | progress = this.http.get("/profile/progress"); 37 | progressColumns: STColumn[] = [ 38 | { title: "时间", index: "time" }, 39 | { title: "当前进度", index: "rate" }, 40 | { 41 | title: "状态", 42 | index: "status", 43 | type: "badge", 44 | badge: { 45 | success: { text: "成功", color: "success" }, 46 | processing: { text: "进行中", color: "processing" }, 47 | }, 48 | }, 49 | { title: "操作员ID", index: "operator" }, 50 | { title: "耗时", index: "cost" }, 51 | ]; 52 | 53 | constructor(private http: _HttpClient, private msg: NzMessageService) {} 54 | } 55 | -------------------------------------------------------------------------------- /src/app/layout/passport/passport.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 | 7 | Kefu.chat 8 |
9 |
多功能、跨平台、高性价比的客服软件
10 |
11 | 12 | 13 |
14 | 2020 15 | 客服洽 版权所有. 16 | 沪ICP备20022337号-5. 公安网安备 31011502016290. 17 |
18 |
19 | 20 | 21 | 22 | 28 |
29 |
30 |
31 |
32 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/settings/settings.component.less: -------------------------------------------------------------------------------- 1 | @import "~@delon/theme/index"; 2 | 3 | :host { 4 | display: block; 5 | ::ng-deep { 6 | .main { 7 | display: flex; 8 | width: 100%; 9 | padding-bottom: 16px; 10 | overflow: auto; 11 | background-color: #fff; 12 | } 13 | 14 | .menu { 15 | width: 224px; 16 | border-right: @border-width-base @border-style-base @border-color-split; 17 | .ant-menu-inline { 18 | border: none; 19 | } 20 | .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { 21 | font-weight: bold; 22 | } 23 | } 24 | 25 | .content { 26 | flex: 1; 27 | padding-top: 24px; 28 | padding-right: 40px; 29 | padding-bottom: 8px; 30 | padding-left: 40px; 31 | .title { 32 | margin-bottom: 12px; 33 | color: @heading-color; 34 | font-weight: 500; 35 | font-size: 20px; 36 | line-height: 28px; 37 | } 38 | .ant-list-split .ant-list-item:last-child { 39 | border-bottom: 1px solid #e8e8e8; 40 | } 41 | .ant-list-item { 42 | padding-top: 14px; 43 | padding-bottom: 14px; 44 | } 45 | } 46 | 47 | @media screen and (max-width: @mobile-max) { 48 | .main { 49 | flex-direction: column; 50 | .menu { 51 | width: 100%; 52 | border: none; 53 | } 54 | .content { 55 | padding: 40px; 56 | } 57 | } 58 | } 59 | } 60 | } 61 | 62 | [data-theme="dark"] { 63 | :host ::ng-deep { 64 | .main { 65 | background-color: #141414; 66 | } 67 | .content { 68 | .title { 69 | color: rgba(255, 255, 255, 0.65); 70 | } 71 | } 72 | .menu { 73 | border-right-color: #303030; 74 | } 75 | .content .ant-list-split .ant-list-item:last-child { 76 | border-bottom-color: #303030; 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/category.component.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"category.component.d.ts","sources":["category.component.d.ts"],"names":[],"mappings":"AAAA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA","sourcesContent":["import { ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';\nimport { Emoji, EmojiService } from '@shared/lib/ngx-emoji-mart/ngx-emoji';\nimport { EmojiFrequentlyService } from './emoji-frequently.service';\nexport declare class CategoryComponent implements OnInit {\n ref: ChangeDetectorRef;\n private emojiService;\n private frequently;\n emojis?: any[] | null;\n hasStickyPosition: boolean;\n name: string;\n perLine: number;\n totalFrequentLines: number;\n recent: string[];\n custom: any[];\n i18n: any;\n id: any;\n hideObsolete: boolean;\n notFoundEmoji?: string;\n emojiIsNative?: Emoji['isNative'];\n emojiSkin: Emoji['skin'];\n emojiSize: Emoji['size'];\n emojiSet: Emoji['set'];\n emojiSheetSize: Emoji['sheetSize'];\n emojiForceSize: Emoji['forceSize'];\n emojiTooltip: Emoji['tooltip'];\n emojiBackgroundImageFn?: Emoji['backgroundImageFn'];\n emojiUseButton?: boolean;\n emojiOver: Emoji['emojiOver'];\n emojiLeave: Emoji['emojiLeave'];\n emojiClick: Emoji['emojiClick'];\n container: ElementRef;\n label: ElementRef;\n containerStyles: any;\n labelStyles: any;\n labelSpanStyles: any;\n margin: number;\n minMargin: number;\n maxMargin: number;\n top: number;\n constructor(ref: ChangeDetectorRef, emojiService: EmojiService, frequently: EmojiFrequentlyService);\n ngOnInit(): void;\n memoizeSize(): void;\n handleScroll(scrollTop: number): boolean;\n getEmojis(): any[];\n updateDisplay(display: 'none' | 'block'): void;\n trackById(index: number, item: any): any;\n}\n"]} -------------------------------------------------------------------------------- /src/app/shared/lib/ngx-emoji-mart/esm2015/ngx-emoji/data/data.interfaces.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9waWNrZXIvbmd4LWVtb2ppL2RhdGEvZGF0YS5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbW9qaSB9IGZyb20gJy4uL2Vtb2ppLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1vamlDYXRlZ29yeSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW1vamlzOiBhbnlbXSB8IG51bGw7XG4gIGFuY2hvcj86IGJvb2xlYW47XG4gIGZpcnN0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wcmVzc2VkRW1vamlEYXRhIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1bmlmaWVkOiBzdHJpbmc7XG4gIHNob3J0TmFtZTogc3RyaW5nO1xuICBzaG9ydE5hbWVzPzogc3RyaW5nW107XG4gIHNoZWV0OiBbbnVtYmVyLCBudW1iZXJdO1xuICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICBoaWRkZW4/OiBzdHJpbmdbXTtcbiAgZW1vdGljb25zPzogc3RyaW5nW107XG4gIHRleHQ/OiBzdHJpbmc7XG4gIHNraW5WYXJpYXRpb25zPzogRW1vamlWYXJpYXRpb25bXTtcbiAgb2Jzb2xldGVkQnk/OiBzdHJpbmc7XG4gIG9ic29sZXRlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW9qaURhdGEge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaWZpZWQ/OiBzdHJpbmc7XG4gIHNob3J0TmFtZTogc3RyaW5nO1xuICBzaG9ydE5hbWVzOiBzdHJpbmdbXTtcbiAgc2hlZXQ6IFtudW1iZXIsIG51bWJlcl07XG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcbiAgaGlkZGVuOiBzdHJpbmdbXTtcbiAgZW1vdGljb25zOiBzdHJpbmdbXTtcbiAgdGV4dDogc3RyaW5nO1xuICBzZXQ/OiBFbW9qaVsnc2V0J107XG4gIHNraW5WYXJpYXRpb25zOiBFbW9qaVZhcmlhdGlvbltdO1xuICBvYnNvbGV0ZWRCeT86IHN0cmluZztcbiAgb2Jzb2xldGVzPzogc3RyaW5nO1xuICBza2luVG9uZT86IEVtb2ppWydza2luJ107XG4gIGN1c3RvbT86IGJvb2xlYW47XG4gIG5hdGl2ZT86IHN0cmluZztcbiAgaW1hZ2VVcmw/OiBzdHJpbmc7XG4gIGNvbG9ucz86IHN0cmluZztcbiAgc2tpbj86IEVtb2ppWydza2luJ107XG4gIHNwcml0ZVVybD86IHN0cmluZztcbiAgc2hlZXRSb3dzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtb2ppVmFyaWF0aW9uIHtcbiAgdW5pZmllZDogc3RyaW5nO1xuICBzaGVldDogW251bWJlciwgbnVtYmVyXTtcbiAgaGlkZGVuPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbkRhdGEge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaWZpZWQ6IHN0cmluZztcbiAgc2hvcnROYW1lOiBzdHJpbmc7XG4gIHNoZWV0OiBbbnVtYmVyLCBudW1iZXJdO1xufVxuIl19 -------------------------------------------------------------------------------- /src/app/layout/default/header/components/user.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Inject } from "@angular/core"; 2 | import { Router } from "@angular/router"; 3 | import { DA_SERVICE_TOKEN, ITokenService } from "@delon/auth"; 4 | import { SettingsService, User as SystemUser } from "@delon/theme"; 5 | import { User } from "@model/application/conversation.interface"; 6 | 7 | @Component({ 8 | selector: "header-user", 9 | template: ` 10 |
16 | 17 | {{ user.name }} 18 |
19 | 20 |
21 |
22 | 23 | {{ "menu.enterprise.setting" | translate }} 24 |
25 |
26 | 27 | {{ "menu.account.settings" | translate }} 28 |
29 |
  • 30 |
    31 | 32 | {{ "menu.account.logout" | translate }} 33 |
    34 |
    35 |
    36 | `, 37 | changeDetection: ChangeDetectionStrategy.OnPush, 38 | }) 39 | export class HeaderUserComponent { 40 | get user(): SystemUser | User { 41 | return this.settings.user; 42 | } 43 | 44 | constructor( 45 | private settings: SettingsService, 46 | private router: Router, 47 | @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService 48 | ) {} 49 | 50 | logout(): void { 51 | this.tokenService.clear(); 52 | this.router.navigateByUrl(this.tokenService.login_url); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | ]> 6 | 10 | 11 | 12 | 15 | 21 | 25 | 26 | -------------------------------------------------------------------------------- /src/app/routes/pro/account/center/applications/applications.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | 29 |
      30 |
    • 1st menu item
    • 31 |
    • 2st menu item
    • 32 |
    • 3st menu item
    • 33 |
    34 |
    35 |
    36 | 37 | 38 | 39 | 40 | 41 |
    42 |
    43 |

    活跃用户

    44 |

    45 | {{ item.activeUser }} 46 | 47 |

    48 |
    49 |
    50 |

    新增用户

    51 |

    {{ item.newUser | number: "3." }}

    52 |
    53 |
    54 |
    55 |
    56 |
    57 |
    58 | -------------------------------------------------------------------------------- /src/app/routes/pro/enterprise/center/applications/applications.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | 29 |
      30 |
    • 1st menu item
    • 31 |
    • 2st menu item
    • 32 |
    • 3st menu item
    • 33 |
    34 |
    35 |
    36 | 37 | 38 | 39 | 40 | 41 |
    42 |
    43 |

    活跃用户

    44 |

    45 | {{ item.activeUser }} 46 | 47 |

    48 |
    49 |
    50 |

    新增用户

    51 |

    {{ item.newUser | number: "3." }}

    52 |
    53 |
    54 |
    55 |
    56 |
    57 |
    58 | --------------------------------------------------------------------------------