backend-foundation-domain-wallet
==
[TOC]
1.依賴套件項目
===
<details>
```js
"dependencies": {
"apexcharts": "^3.35.5",
"axios": "^0.27.2",
"chart.js": "^3.9.1",
"core-js": "^3.8.3",
"git-describe": "^4.0.4",
"group-by-with-sum": "^2.0.0",
"js-file-download": "^0.4.12",
"json-bigint": "^1.0.0",
"json2csv": "^5.0.7",
"lodash": "^4.17.21",
"mathjs": "^11.3.3",
"moment": "^2.29.4",
"moment-timezone": "^0.5.39",
"register-service-worker": "^1.7.2",
"sortablejs": "^1.15.0",
"vue": "^2.6.14",
"vue-apexcharts": "^1.5.3",
"vue-chartjs": "^4.1.1",
"vue-cli-plugin-git-describe": "~1.0.0",
"vue-i18n": "^8.26.3",
"vue-router": "^3.5.1",
"vuedraggable": "^2.24.3",
"vuetify": "^2.6.0",
"vuetify-datetime-picker": "^2.1.1",
"vuex": "^3.6.2"
},
```
> 修改日期 2022/12/30
</details>
2.環境設定
===
<details>
```js
"devDependencies": {
"@babel/core": "^7.12.16",
"@babel/eslint-parser": "^7.12.16",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-pwa": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"csv-parse": "^4.14.2",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.0.3",
"flag-icon-css": "^3.4.6",
"prettier": "^2.4.1",
"sass": "~1.32.0",
"sass-loader": "^10.0.0",
"vue-cli-plugin-i18n": "~2.3.1",
"vue-cli-plugin-pug": "~2.0.0",
"vue-cli-plugin-vuetify": "~2.5.1",
"vue-template-compiler": "^2.6.14",
"vuetify-loader": "^1.7.0"
},
"prettier": {
"endOfLine": "auto"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended",
"plugin:prettier/recommended"
],
"parserOptions": {
"parser": "@babel/eslint-parser",
"requireConfigFile": false
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
],
"_id": "@",
"readme": "ERROR: No README data found!"
```
> 修改日期 2022/12/30
</details>
3.專案建置
===
1. 安裝專案所有依賴套件
```shell
yarn | yarn install
```
2. 連接git lab
```shell
git submodule init
git submodule update
```
需要確認終端機有無取得 key 值
```shell
git submodule
```
> ea19470dce4e94b61aaef8bd10da5b525d4b5830 backend-foundation (heads/develop)
如果沒有登入,則會跳出視窗提供登入
3. 開啟專案
```shell
yarn serve
```
4.專案路徑介紹/各檔案位置
===
以 w0-cms 專案為例
* <i class="fa fa-folder-open"></i> 為資料夾
* <i class="fa fa-file-code-o"></i> 為程式碼
* <i class="fa fa-html5"></i> 為 html
* <i class="fa fa-cog"></i> 為 env 設定檔
* <i class="fa fa-git-square"></i> 為 git 相關文件
* <i class="fa fa-gitlab"></i> 為 gitlab-ci.yml
* <i class="fa fa-info-circle"></i> 為 README
* <i class="fa fa-file-text-o"></i> 為 json
* <i class="fa fa-wrench"></i> 部分設定檔
* <i class="fa fa-file-excel-o"></i> 為 csv
* <i class="fa fa-picture-o"></i> 為 圖像檔案
> <details><summary><i class="fa fa-folder-open"></i> backend-foundation</summary>
>
> > <details><summary><i class="fa fa-folder-open"></i> public</summary>
> >
> > > <details><summary><i class="fa fa-folder-open"></i> img</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> icons</summary>
> > > >
> > > > > <i class="fa fa-picture-o"></i> android-chrome-192x192.png\
> > > > > <i class="fa fa-picture-o"></i> android-chrome-512x512.png\
> > > > > <i class="fa fa-picture-o"></i> android-chrome-maskable-192x192.png\
> > > > > <i class="fa fa-picture-o"></i> android-chrome-maskable-512x512.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon-60x60.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon-76x76.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon-120x120.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon-152x152.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon-180x180.png\
> > > > > <i class="fa fa-picture-o"></i> apple-touch-icon.png\
> > > > > <i class="fa fa-picture-o"></i> favicon-16x16.png\
> > > > > <i class="fa fa-picture-o"></i> favicon-32x32.png\
> > > > > <i class="fa fa-picture-o"></i> msapplication-icon-144x144.png\
> > > > > <i class="fa fa-picture-o"></i> mstile-150x150.png\
> > > > > <i class="fa fa-picture-o"></i> safari-pinned-tab.png
> > > > </details>
> > > </details>
> > >
> > > <i class="fa fa-star"></i> favicon.ico\
> > > <i class="fa fa-html5"></i> index.html\
> > > <i class="fa fa-align-left"></i> robots.txt
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> src</summary>
> >
> > > <details><summary><i class="fa fa-folder-open"></i> app</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> todo</summary>
> > > >
> > > > ><details><summary><i class="fa fa-folder-open"></i> components</summary>
> > > > >
> > > > > > <i class="fa fa-file-code-o"></i> TodoCompose.vue\
> > > > > > <i class="fa fa-file-code-o"></i> TodoList.vue\
> > > > > > <i class="fa fa-file-code-o"></i> TodoMenu.vue
> > > > ></details>
> > > > ><details><summary><i class="fa fa-folder-open"></i> pages</summary>
> > > > >
> > > > > > <i class="fa fa-file-code-o"></i> CompletedPage.vue\
> > > > > > <i class="fa fa-file-code-o"></i> LabelPage.vue\
> > > > > > <i class="fa fa-file-code-o"></i> TasksPage.vue
> > > > ></details>
> > > > ><details><summary><i class="fa fa-folder-open"></i> routes</summary>
> > > > >
> > > > > > <i class="fa fa-file-code-o"></i> index.js
> > > > ></details>
> > > > ><details><summary><i class="fa fa-folder-open"></i> store</summary>
> > > > >
> > > > > > <details><summary><i class="fa fa-folder-open"></i> content</summary>
> > > > > >
> > > > > > > <i class="fa fa-file-code-o"></i> tasks.js
> > > > > > </details>
> > > > > >
> > > > > > <i class="fa fa-file-code-o"></i> getters.js\
> > > > > > <i class="fa fa-file-code-o"></i> index.js\
> > > > > > <i class="fa fa-file-code-o"></i> mutations.js\
> > > > > > <i class="fa fa-file-code-o"></i> state.js
> > > > ></details>
> > > > > <i class="fa fa-file-code-o"></i> TodoApp
> > > > </details>
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> assets</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> scss</summary>
> > > >
> > > > > <details><summary><i class="fa fa-folder-open"></i> vuetify</summary>
> > > > >
> > > > > > <details><summary><i class="fa fa-folder-open"></i> variables</summary>
> > > > > >
> > > > > > > <i class="fa fa-file-code-o"></i> _colors.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _dark.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _elevations.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _font.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _global.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _index.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _light.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _mixins.sass\
> > > > > > > <i class="fa fa-file-code-o"></i> _utilities.sass
> > > > > > </details>
> > > > > > <i class="fa fa-file-code-o"></i> overrides.sass
> > > > > </details>
> > > > > <i class="fa fa-file-code-o"></i> theme.sass
> > > > </details>
> > > >
> > > > <i class="fa fa-picture-o"></i> logo.png\
> > > > <i class="fa fa-picture-o"></i> logo.svg
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> components</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> common</summary>
> > > >
> > > > > <i class="fa fa-picture-o"></i> FlagIcon.vue\
> > > > > <i class="fa fa-picture-o"></i> TrendPercent.vue
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> dashboard</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> ActivityCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> InboxCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> SalesCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> SourcesCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> TableCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> TicketsCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> TodoCard.vue\
> > > > > <i class="fa fa-file-code-o"></i> TrackCard.vue
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> navigation</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> MainMenu.vue\
> > > > > <i class="fa fa-file-code-o"></i> MainMenuFake.vue\
> > > > > <i class="fa fa-file-code-o"></i> NavMenu.vue\
> > > > > <i class="fa fa-file-code-o"></i> NavMenuFake.vue\
> > > > > <i class="fa fa-file-code-o"></i> NavMenuItem.vue\
> > > > > <i class="fa fa-file-code-o"></i> NavMenuItemFake.vue
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> toolbar</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> ToolbarApps.vue\
> > > > > <i class="fa fa-file-code-o"></i> ToolbarCurrency.vue\
> > > > > <i class="fa fa-file-code-o"></i> ToolbarLanguage.vue\
> > > > > <i class="fa fa-file-code-o"></i> ToolbarNotifications.vue\
> > > > > <i class="fa fa-file-code-o"></i> ToolbarTimezone.vue\
> > > > > <i class="fa fa-file-code-o"></i> ToolbarUser.vue
> > > > </details>
> > > >
> > > > <i class="fa fa-file-code-o"></i> c-btn-toggle.vue\
> > > > <i class="fa fa-file-code-o"></i> c-checkboxforGameServerId.vue\
> > > > <i class="fa fa-file-code-o"></i> c-checkbox-group.vue\
> > > > <i class="fa fa-file-code-o"></i> c-checkbox-subform.vue\
> > > > <i class="fa fa-file-code-o"></i> c-condition.vue\
> > > > <i class="fa fa-file-code-o"></i> c-date-picker.vue\
> > > > <i class="fa fa-file-code-o"></i> c-date-pickerstartdate.vue\
> > > > <i class="fa fa-file-code-o"></i> c-datetimeforonedate.vue\
> > > > <i class="fa fa-file-code-o"></i> c-form.vue\
> > > > <i class="fa fa-file-code-o"></i> c-login.vue\
> > > > <i class="fa fa-file-code-o"></i> c-minorsetting.vue\
> > > > <i class="fa fa-file-code-o"></i> c-panel.vue\
> > > > <i class="fa fa-file-code-o"></i> c-qrcode.vue\
> > > > <i class="fa fa-file-code-o"></i> c-radio.vue\
> > > > <i class="fa fa-file-code-o"></i> c-select.vue\
> > > > <i class="fa fa-file-code-o"></i> c-settings.vue\
> > > > <i class="fa fa-file-code-o"></i> c-signin.vue\
> > > > <i class="fa fa-file-code-o"></i> c-span.vue\
> > > > <i class="fa fa-file-code-o"></i> c-spantwofield.vue\
> > > > <i class="fa fa-file-code-o"></i> c-switch.vue\
> > > > <i class="fa fa-file-code-o"></i> c-table.vue\
> > > > <i class="fa fa-file-code-o"></i> c-text-area.vue\
> > > > <i class="fa fa-file-code-o"></i> c-text-field.vue\
> > > > <i class="fa fa-file-code-o"></i> c-time-picker.vue
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> config</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> menus</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> apps.menu.js\
> > > > > <i class="fa fa-file-code-o"></i> pages.menu.js\
> > > > > <i class="fa fa-file-code-o"></i> ui.menu.js
> > > > </details>
> > > >
> > > > <i class="fa fa-file-code-o"></i> index.js\
> > > > <i class="fa fa-file-code-o"></i> locales.js\
> > > > <i class="fa fa-file-code-o"></i> navigation.js\
> > > > <i class="fa fa-file-code-o"></i> theme.js\
> > > > <i class="fa fa-file-code-o"></i> toolbar.js
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> layouts</summary>
> > >
> > > > <i class="fa fa-file-code-o"></i> AuthLayout.vue\
> > > > <i class="fa fa-file-code-o"></i> DefaultLayout.vue
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> plugins</summary>
> > >
> > > > <i class="fa fa-file-code-o"></i> apexcharts.js\
> > > > <i class="fa fa-file-code-o"></i> timezone.js\
> > > > <i class="fa fa-file-code-o"></i> vuetify.js
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> router</summary>
> > >
> > > > <i class="fa fa-file-code-o"></i> submodule.js
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> store</summary>
> > >
> > > > <i class="fa fa-file-code-o"></i> index.js
> > > </details>
> > > <details><summary><i class="fa fa-folder-open"></i> views</summary>
> > >
> > > > <i class="fa fa-file-code-o"></i> v-betrecord.vue\
> > > > <i class="fa fa-file-code-o"></i> v-cms.vue\
> > > > <i class="fa fa-file-code-o"></i> v-dashboard-wallet.vue\
> > > > <i class="fa fa-file-code-o"></i> v-dashboard.vue\
> > > > <i class="fa fa-file-code-o"></i> v-record-hierarchy.vue\
> > > > <i class="fa fa-file-code-o"></i> v-reportgeneral-v2.vue\
> > > > <i class="fa fa-file-code-o"></i> v-signin.vue
> > > </details>
> > > <i class="fa fa-file-code-o"></i> App.vue
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> template-project</summary>
> >
> > > <details><summary><i class="fa fa-folder-open"></i> src</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> assets</summary>
> > > >
> > > > > <i class="fa fa-file-text-o"></i> app-drawer.json\
> > > > > <i class="fa fa-picture-o"></i> background.jpg\
> > > > > <i class="fa fa-picture-o"></i> logo.png
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> locales</summary>
> > > >
> > > > > <i class="fa fa-file-text-o"></i> zh-TW.json
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> routes</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> index.js
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> store</summary>
> > > >
> > > > > <details><summary><i class="fa fa-folder-open"></i> module</summary>
> > > > >
> > > > > > <details><summary><i class="fa fa-folder-open"></i> api</summary>
> > > > > >
> > > > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > > > <i class="fa fa-file-code-o"></i> user-wallet.js
> > > > > > </details>
> > > > > > <details><summary><i class="fa fa-folder-open"></i> condition</summary>
> > > > > >
> > > > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > > > <i class="fa fa-file-code-o"></i> user-wallet.js
> > > > > > </details>
> > > > > > <details><summary><i class="fa fa-folder-open"></i> header</summary>
> > > > > >
> > > > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > > > <i class="fa fa-file-code-o"></i> user-wallet.js
> > > > > > </details>
> > > > > >
> > > > > > <i class="fa fa-file-code-o"></i> admin.js\
> > > > > > <i class="fa fa-file-code-o"></i> index.js
> > > > > </details>
> > > > > <i class="fa fa-file-code-o"></i> index.js
> > > > </details>
> > > > <i class="fa fa-file-code-o"></i> i18n.js
> > >
> > > <i class="fa fa-cog"></i> .env \
> > > <i class="fa fa-cog"></i> .env.production.dev\
> > > <i class="fa fa-cog"></i> .env.production.uat\
> > > <i class="fa fa-git-square"></i> .gitignore\
> > > <i class="fa fa-gitlab"></i> .gitlab-ci.yml\
> > > <i class="fa fa-git-square"></i> .gitmodules\
> > > <i class="fa fa-wrench"></i> .docker-compose.yml\
> > > <i class="fa fa-wrench"></i> Dockerfile\
> > > <i class="fa fa-wrench"></i> Dockerfile.node_module\
> > > <i class="fa fa-file-text-o"></i> jsconfig.json\
> > > <i class="fa fa-file-text-o"></i> package.json\
> > > <i class="fa fa-info-circle"></i> README.md\
> > > <i class="fa fa-file-code-o"></i> vue.config.js
> > </details>
> >
> > <i class="fa fa-wrench"></i> .docker-compose.yml\
> > <i class="fa fa-wrench"></i> Dockerfile\
> > <i class="fa fa-wrench"></i> Dockerfile.node_module\
> > <i class="fa fa-file-text-o"></i> jsconfig.json\
> > <i class="fa fa-file-text-o"></i> package.json\
> > <i class="fa fa-info-circle"></i> README.md\
> > <i class="fa fa-file-code-o"></i> vue.config.js
> </details>
> <details><summary><i class="fa fa-folder-open"></i> public</summary>
>
> > <details><summary><i class="fa fa-folder-open"></i> mock</summary>
> >
> > ><i class="fa fa-file-text-o"></i> 注單明細資料.json\
> > ><i class="fa fa-file-text-o"></i> agent.json\
> > ><i class="fa fa-file-text-o"></i> all-game-list.json\
> > ><i class="fa fa-file-text-o"></i> all-game-provider.json\
> > ><i class="fa fa-file-text-o"></i> apisetting.json\
> > ><i class="fa fa-file-text-o"></i> balance-history.json\
> > ><i class="fa fa-file-text-o"></i> bet-record-detail.json\
> > ><i class="fa fa-file-text-o"></i> by-member.json\
> > ><i class="fa fa-file-text-o"></i> by-txn.json\
> > ><i class="fa fa-file-text-o"></i> company-report.json\
> > ><i class="fa fa-file-text-o"></i> company.json\
> > ><i class="fa fa-file-text-o"></i> franchiser.json\
> > ><i class="fa fa-file-text-o"></i> game-statistics.json\
> > ><i class="fa fa-file-text-o"></i> member.json\
> > ><i class="fa fa-file-text-o"></i> platform-report.json\
> > ><i class="fa fa-file-text-o"></i> platform.json\
> > ><i class="fa fa-file-text-o"></i> record.json\
> > ><i class="fa fa-file-text-o"></i> white-list.json
> > </details>
> </details>
>
> <details><summary><i class="fa fa-folder-open"></i> src</summary>
>
> > <details><summary><i class="fa fa-folder-open"></i> assets</summary>
> >
> > > <i class="fa fa-file-text-o"></i> app-drawer.json \
> > > <i class="fa fa-picture-o"></i> background.jpg\
> > > <i class="fa fa-picture-o"></i> logo.png \
> > > <i class="fa fa-picture-o"></i> logoLoading.png\
> > > <i class="fa fa-file-text-o"></i> sidebar-extensions.json
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> components</summary>
> >
> > > <i class="fa fa-file-code-o"></i> c-dateTime-picker.vue\
> > > <i class="fa fa-file-code-o"></i> c-detail-iframe.vue\
> > > <i class="fa fa-file-code-o"></i> c-detail.vue\
> > > <i class="fa fa-file-code-o"></i> c-profile.vue\
> > > <i class="fa fa-file-code-o"></i> c-start-end-date.vue\
> > > <i class="fa fa-file-code-o"></i> c-text-field-v2.vue\
> > > <i class="fa fa-file-code-o"></i> w0-BetRecord_Search.vue\
> > > <i class="fa fa-file-code-o"></i> w0-signin.vue
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> locales</summary>
> >
> > > <i class="fa fa-file-text-o"></i> en-US.json\
> > > <i class="fa fa-file-text-o"></i> id-ID.json\
> > > <i class="fa fa-file-text-o"></i> ja-JP.json\
> > > <i class="fa fa-file-text-o"></i> ko-KR.json\
> > > <i class="fa fa-file-text-o"></i> my-MM.json\
> > > <i class="fa fa-file-text-o"></i> th-TH.json\
> > > <i class="fa fa-file-text-o"></i> vi-VN.json\
> > > <i class="fa fa-file-text-o"></i> zh-CN.json\
> > > <i class="fa fa-file-text-o"></i> zh-TW.json
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> routes</summary>
> >
> > > <i class="fa fa-file-code-o"></i> index.js\
> > > <i class="fa fa-file-code-o"></i> submodule.js
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> store</summary>
> >
> > > <details><summary><i class="fa fa-folder-open"></i> module</summary>
> > >
> > > > <details><summary><i class="fa fa-folder-open"></i> api</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> agent.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-list.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-provider.js\
> > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > <i class="fa fa-file-code-o"></i> apisetting.js\
> > > > > <i class="fa fa-file-code-o"></i> balance-history.js\
> > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > <i class="fa fa-file-code-o"></i> BetRecord_Index_L1.js \
> > > > > <i class="fa fa-file-code-o"></i> BetRecordDetail.js\
> > > > > <i class="fa fa-file-code-o"></i> by-member.js\
> > > > > <i class="fa fa-file-code-o"></i> by-txn.js\
> > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > <i class="fa fa-file-code-o"></i> conversionrecord.js\
> > > > > <i class="fa fa-file-code-o"></i> franchiser.js\
> > > > > <i class="fa fa-file-code-o"></i> game-statistics.js\
> > > > > <i class="fa fa-file-code-o"></i> gamelist.js\
> > > > > <i class="fa fa-file-code-o"></i> gamereport.js\
> > > > > <i class="fa fa-file-code-o"></i> groupmanage.js\
> > > > > <i class="fa fa-file-code-o"></i> memberlist.js\
> > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > <i class="fa fa-file-code-o"></i> user-wallet.js\
> > > > > <i class="fa fa-file-code-o"></i> usermanage.js\
> > > > > <i class="fa fa-file-code-o"></i> white-list.js
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> btn</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> gamelist.js
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> condition</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> agent.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-list.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-provider.js\
> > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > <i class="fa fa-file-code-o"></i> apisetting.js\
> > > > > <i class="fa fa-file-code-o"></i> balance-history.js\
> > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > <i class="fa fa-file-code-o"></i> BetRecord_Index_L1.js \
> > > > > <i class="fa fa-file-code-o"></i> BetRecordDetail.js\
> > > > > <i class="fa fa-file-code-o"></i> by-member.js\
> > > > > <i class="fa fa-file-code-o"></i> by-txn.js\
> > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > <i class="fa fa-file-code-o"></i> conversionrecord.js\
> > > > > <i class="fa fa-file-code-o"></i> franchiser.js\
> > > > > <i class="fa fa-file-code-o"></i> game-statistics.js\
> > > > > <i class="fa fa-file-code-o"></i> gamelist.js\
> > > > > <i class="fa fa-file-code-o"></i> gamereport.js\
> > > > > <i class="fa fa-file-code-o"></i> groupmanage.js\
> > > > > <i class="fa fa-file-code-o"></i> memberlist.js\
> > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > <i class="fa fa-file-code-o"></i> user-wallet.js\
> > > > > <i class="fa fa-file-code-o"></i> usermanage.js\
> > > > > <i class="fa fa-file-code-o"></i> white-list.js
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> header</summary>
> > > >
> > > > > <details><summary><i class="fa fa-folder-open"></i> headeritems</summary>
> > > > >
> > > > > > <i class="fa fa-file-code-o"></i> BetRecordDetail.js\
> > > > > > <i class="fa fa-file-code-o"></i> conversionrecord.js\
> > > > > > <i class="fa fa-file-code-o"></i> groupmanage.js\
> > > > > > <i class="fa fa-file-code-o"></i> memberlist.js\
> > > > > > <i class="fa fa-file-code-o"></i> usermanage.js
> > > > > </details>
> > > > >
> > > > > <i class="fa fa-file-code-o"></i> agent.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-list.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-provider.js\
> > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > <i class="fa fa-file-code-o"></i> apisetting.js\
> > > > > <i class="fa fa-file-code-o"></i> balance-history.js\
> > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > <i class="fa fa-file-code-o"></i> BetRecord_Index_L1.js \
> > > > > <i class="fa fa-file-code-o"></i> BetRecordDetail.js\
> > > > > <i class="fa fa-file-code-o"></i> by-member.js\
> > > > > <i class="fa fa-file-code-o"></i> by-txn.js\
> > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > <i class="fa fa-file-code-o"></i> conversionrecord.js\
> > > > > <i class="fa fa-file-code-o"></i> franchiser.js\
> > > > > <i class="fa fa-file-code-o"></i> game-statistics.js\
> > > > > <i class="fa fa-file-code-o"></i> gamelist.js\
> > > > > <i class="fa fa-file-code-o"></i> gamereport.js\
> > > > > <i class="fa fa-file-code-o"></i> groupmanage.js\
> > > > > <i class="fa fa-file-code-o"></i> memberlist.js\
> > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > <i class="fa fa-file-code-o"></i> user-wallet.js\
> > > > > <i class="fa fa-file-code-o"></i> usermanage.js\
> > > > > <i class="fa fa-file-code-o"></i> white-list.js
> > > > </details>
> > > > <details><summary><i class="fa fa-folder-open"></i> item</summary>
> > > >
> > > > > <i class="fa fa-file-code-o"></i> agent.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-list.js\
> > > > > <i class="fa fa-file-code-o"></i> all-game-provider.js\
> > > > > <i class="fa fa-file-code-o"></i> all.js\
> > > > > <i class="fa fa-file-code-o"></i> apisetting.js\
> > > > > <i class="fa fa-file-code-o"></i> balance-history.js\
> > > > > <i class="fa fa-file-code-o"></i> bet-record.js\
> > > > > <i class="fa fa-file-code-o"></i> BetRecord_Index_L1.js \
> > > > > <i class="fa fa-file-code-o"></i> BetRecordDetail.js\
> > > > > <i class="fa fa-file-code-o"></i> by-member.js\
> > > > > <i class="fa fa-file-code-o"></i> by-txn.js\
> > > > > <i class="fa fa-file-code-o"></i> config.js\
> > > > > <i class="fa fa-file-code-o"></i> conversionrecord.js\
> > > > > <i class="fa fa-file-code-o"></i> franchiser.js\
> > > > > <i class="fa fa-file-code-o"></i> game-statistics.js\
> > > > > <i class="fa fa-file-code-o"></i> gamelist.js\
> > > > > <i class="fa fa-file-code-o"></i> gamereport.js\
> > > > > <i class="fa fa-file-code-o"></i> groupmanage.js\
> > > > > <i class="fa fa-file-code-o"></i> memberlist.js\
> > > > > <i class="fa fa-file-code-o"></i> schedule.js\
> > > > > <i class="fa fa-file-code-o"></i> user-wallet.js\
> > > > > <i class="fa fa-file-code-o"></i> usermanage.js\
> > > > > <i class="fa fa-file-code-o"></i> white-list.js
> > > > </details>
> > > >
> > > > <i class="fa fa-file-code-o"></i> admin.js\
> > > > <i class="fa fa-file-code-o"></i> index.js
> > > </details>
> > >
> > > <i class="fa fa-file-code-o"></i> dialog.js\
> > > <i class="fa fa-file-code-o"></i> index.js
> > </details>
> > <details><summary><i class="fa fa-folder-open"></i> views</summary>
> >
> > > <i class="fa fa-file-code-o"></i> c-apexChart.vue\
> > > <i class="fa fa-file-code-o"></i> v-apiProduction.vue\
> > > <i class="fa fa-file-code-o"></i> v-BetRecord_Index_L1.vue\
> > > <i class="fa fa-file-code-o"></i> v-BetRecord_Index_L2.vue\
> > > <i class="fa fa-file-code-o"></i> v-BetRecord_Index_L3.vue\
> > > <i class="fa fa-file-code-o"></i> v-BetRecord_Index_RAW.vue\
> > > <i class="fa fa-file-code-o"></i> v-BetRecord_Index.vue\
> > > <i class="fa fa-file-code-o"></i> v-component_test.vue\
> > > <i class="fa fa-file-code-o"></i> v-conversionrecord.vue\
> > > <i class="fa fa-file-code-o"></i> v-editgroup.vue\
> > > <i class="fa fa-file-code-o"></i> v-edituser.vue\
> > > <i class="fa fa-file-code-o"></i> v-groupmanage.vue\
> > > <i class="fa fa-file-code-o"></i> v-headerProduction.vue\
> > > <i class="fa fa-file-code-o"></i> v-index.vue\
> > > <i class="fa fa-file-code-o"></i> v-memberlist.vue\
> > > <i class="fa fa-file-code-o"></i> v-Production.vue\
> > > <i class="fa fa-file-code-o"></i> v-record-hierarchy.vue\
> > > <i class="fa fa-file-code-o"></i> v-signin.vue\
> > > <i class="fa fa-file-code-o"></i> v-usermanage.vue
> > </details>
> >
> > <i class="fa fa-file-code-o"></i> i18n.js\
> > <i class="fa fa-file-code-o"></i> plugin.js
> </details>
>
> <details><summary><i class="fa fa-folder-open"></i> tools</summary>
>
> ><i class="fa fa-file-code-o"></i> lang.js\
> ><i class="fa fa-file-excel-o"></i> langs.csv
> </details>
>
> <i class="fa fa-cog"></i> .env \
> <i class="fa fa-cog"></i> .env.production.dev\
> <i class="fa fa-cog"></i> .env.production.uat\
> <i class="fa fa-git-square"></i> .gitignore\
> <i class="fa fa-gitlab"></i> .gitlab-ci.yml\
> <i class="fa fa-git-square"></i> .gitmodules\
> <i class="fa fa-wrench"></i> .docker-compose.yml\
> <i class="fa fa-wrench"></i> Dockerfile\
> <i class="fa fa-wrench"></i> Dockerfile.node_module\
> <i class="fa fa-file-text-o"></i> jsconfig.json\
> <i class="fa fa-file-text-o"></i> package.json\
> <i class="fa fa-info-circle"></i> README.md\
> <i class="fa fa-file-code-o"></i> vue.config.js\
> <i class="fa fa-wrench"></i> yarn.lock
> 修改日期 2023/01/03
5.組件介紹
==
* c-btn-toggle
-> 按鈕組件
* c-checkbox-group
-> 勾選按鈕群組
* c-checkbox-subform
*-> w0特殊需求獨立設計用*
* c-condition
-> 目前無使用
* c-date-picker
-> 日期選擇器 目前無使用
* c-date-pickerstartdate
-> 日期時間選擇 , 包含常用日期
* c-form
-> 驗證型表單
* c-qrcode
-> QRCODE
* c-radio
-> 單選選項
* c-select
-> 下拉選單
* c-signin
-> 登入組件
* c-switch
-> 切換開關
* c-text-area
-> 多行文字輸入框
* c-text-field
-> 文字輸入框
* c-time-picker
-> 時間選擇器
> 修改日期 2022/11/4
6.頁面設定
==
### 左上方導覽列標題設定
設定檔案位置:backend-foundation/src/layouts/AuthLayouts.vue
```javascript=
.d-flex.text-center.flex-column.flex-md-row.flex-grow-1
.pa-2.pa-md-4.flex-grow-1.align-center.justify-center.d-flex.flex-column
.layout-content.ma-auto.w-full
slot
.overline.mt-4 (檔案名稱位置)- {{version}}
```
---
### 左側導覽列設定
左側導覽列可以依照專案情況使用不同方式設置
1. 後端api回傳參數
2. 使用json檔案
w0 當前版本sideBar設置 會在w0-signin做處理,會跟後端api請求登入帳號所可以檢視的sideBar清單,並回傳功能權限。
請求完資料,會執行 this.sidebarCompose() ,並檢查回傳資料是否存在,如果順利取得資料,則會進入與sidebar-extensions.json mapping的步驟。
> 以下為後端回傳api 部分內容
```json
{
"success":true,
"message":"登入成功!",
"data":{
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9...",
"sideBars":[
{
"id":"99a1f879-1007-4a5e-a63d-f145a90aec7f",
"name":"管理者帳號",
"code":"manager",
"authCode":null,
"status":1,
"uri":null,
"parentId":null
},
{
"id":"009de7fd-0d8f-4ac1-98f1-6d83cc3d0cb9",
"name":"子帳號列表",
"code":"account",
"authCode":30,
"status":1,
"uri":"Backend/Manager/Index",
"parentId":"99a1f879-1007-4a5e-a63d-f145a90aec7f"
}
],
"userName":"mao"
}
}
```
| key | 說明 | 型別 | 備註 |
| -------- | ------------ | -------- | ---------------------------------------- |
| id | 唯一值 | (String) | |
| name | 功能名稱 | (String) | |
| code | 程式名稱 | (String) | 需與前端sideBar-extensions相符合 |
| authCode | 功能權限 | (Int) | |
| status | 狀態 | (Int) | |
| uri | 後端提供路由 | (String) | 可與前端協議,路徑由前端設置或是後端提供 |
| parentId | 父層唯一值 | (String) | |
> 以下為 sidebar-extensions.json 部分內容
```json
[
{
"name": "管理者帳號",
"code": "manager",
"icon": "mdi-account-details",
"order": 1,
"agents": [""]
},
{
"name": "子帳號列表",
"code": "account",
"icon": "mdi-account",
"to": "/report/usermanage",
"agents": [""]
},
{
"name": "組件開發",
"authCode": 30,
"code": "component",
"icon": "mdi-wrench",
"order": 9999,
"id": "9999"
},
{
"name": "畫面產生器",
"code": "Production",
"to": "/tool/Production",
"parentId": 9999
},
]
```
| key | 說明 | 型別 | 備註 |
| -------- | ------------------ | -------- | ---------------------------------------- |
| name | sideBar 名稱 | (String) | 與後端名稱為主 |
| code | 程式名稱 | (String) | 需與 api 回傳 code值一致 |
| icon | 使用圖標 | (String) | 後端沒回傳值的情況下 ,需自行設置 |
| to | 前往路徑 | (String) | 可與後端協議,路徑由前端設置或是後端提供 |
| order | 排序順序 | (Int) | |
| agents | 可使用此頁面代理商 | (Array) | |
| authCode | 使用權限 | (Int) | |
| id | 功能唯一值 | (String) | |
| parentId | 父層唯一值 | (String) | |
mapping 會將api回傳項目,依照對應的code 來做組合。
若出現 api回傳項目沒有的項目,則會檢查是否有id跟parentId,若是有id與parentId,則會加入要顯示的sideBar內容,即可自訂義需顯示內容
---
### 右上 profile設定
設定檔案位置:backend-foundation/src/components/toolbar/ToolbarUser.vue
```xml=
<template>
<v-menu offset-y left transition="slide-y-transition">
<template v-slot:activator="{ on }">
<v-icon v-on="on">mdi-account-circle</v-icon>
<!-- <v-btn icon class="elevation-2" v-on="on">
<v-badge color="success" dot bordered offset-x="10" offset-y="10">
</v-badge>
</v-btn> -->
</template>
<!-- user menu list -->
<v-list dense nav>
<v-list-item
v-for="(item, index) in menu"
:key="index"
:to="item.link"
:exact="item.exact"
:disabled="item.disabled"
link
>
<v-list-item-icon>
<v-icon small :class="{ 'grey--text': item.disabled }">{{
item.icon
}}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{
item.key ? $t(item.key) : item.text
}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- 顯示使用者名稱 -->
<v-list-item>
Hello
{{
$store.state.userInfo.userName == ""
? "user"
: $store.state.userInfo.userName
}}</v-list-item
>
<v-divider class="my-1"></v-divider>
<v-list-item @click="signOut">
<v-list-item-icon>
<v-icon small>mdi-logout-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ $t("logout") }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-menu>
</template>
```
---
### api 設定
設定檔案位置:store/module/api
1. 檔案命名方式: 對應網頁.js
2. 檔案內容格式:
```javascript=
export default {
list: { uri: "/w1api/GetBetSummary", method: "get" },
};
```
#### key值說明
* api名稱/(對應觸發事件名稱) : { uri: api呼叫位置 (String) , method : 呼叫方法 (String) }
---
### condition設定
設定檔案位置:store/module/condition
1. 檔案命名方式: 對應網頁.js
2. 檔案內容格式:
```js
//----------------------------------------
// #1
import item from "../item/usermanage";
import btn from "../btn/gamelist";
//----------------------------------------
//#2
const [account, status, roleId, addstatus, name, password, addRole, qrcode] =
item;
const [add, edit, deletes, close] = btn;
//----------------------------------------
//#3
export default {
//#3.1
list: [...item],
//#3.2
search: [account, roleId, status],
//#3.3
update: [
account,
name,
{
...password,
// bind: {
// rule: [
// (v) => (v && v.length <= 16) || "密碼上限長度16字元",
// (v) => (v && v.length >= 6) || "密碼最少需要6字元",
// ],
// },
},
addstatus,
addRole,
qrcode,
],
//#3.4
add: [
{
...account,
bind: {
label: "xaccount",
rule: [
(v) => !!v || "xaccountrequired",
(v) => (v && v.length <= 16) || "xaccountlength",
(v) => (v && v.length >= 2) || "xaccountmin",
(v) => (v && /^[A-Za-z0-9_]{2,16}$/.test(v)) || "xaccountrule",
],
},
},
{
...password,
bind: {
label: "password",
rule: [
(v) => !!v || "passwordrequired",
(v) => (v && v.length <= 16) || "passwordmax",
(v) => (v && v.length >= 2) || "passwordmin",
(v) => (v && /^[A-Za-z0-9]{2,16}$/.test(v)) || " passwordrequired",
],
},
},
{
...name,
bind: {
label: "name",
rule: [
(v) => !!v || "namerequired",
(v) => (v && v.length <= 16) || "namemax",
(v) => (v && v.length >= 2) || "namelength",
(v) =>
(v && /^[\u3400-\u9FA5A-Za-z0-9_]{2,16}$/.test(v)) || "namerule",
],
},
},
addstatus,
addRole,
],
//#3.5
btn: {
add: {
title: "adddata",
item: [add, close],
},
update: {
title: "editdata",
item: [edit, close],
},
delete: {
title: "delemsg",
item: [deletes, close],
},
},
};
```
#### 程式碼解釋
以usermanage.js為範例,
1. import item、btn 來引用通用設定檔
2. 將要使用的通用變數 宣告出來
3. 開始設定頁面
1. 在list部分 展開 item 裡面的通用設定
2. 在 search部分 提供 查詢所需要的 變數 [ account, roleId, status ]
3. 在 update部分 提供 更新所需要變數 [account,name,password,addstatus,addRole,qrcode],並且將password部分直接展開
4. 在add部分 依照各個不同變數,有不同的檢查條件,展開通用變數,然後綁定指定的條件與label名稱
5. 宣告 頁面上使用到的按鈕,給予對應的title跟對應的事件
#### key值說明
| key | 說明 | 型別 |
|:----- | --------------------- | -------- |
| name | 物件名稱 | (String) |
| is | 對應 vuetify 組件名稱 | (String) |
| field | 對應組件 id | (String) |
| alert | 對應組件提示訊息 | (String) |
| bind | 組件對應參數設定 | (String) |
---
### dataTable HeaderItems 設定
用於設定dataTable的title,依照頁面不同需求,設定不同功能
1. 檔案命名方式: 對應網頁.js
2. 檔案內容格式:
```javascript=
//#1
const account = {
value: "account",
sortable: true,
i18n: "xaccount",
};
const name = {
value: "name",
sortable: true,
i18n: "xName",
};
const roles = {
value: "roles",
sortable: false,
i18n: "group",
};
//#2
const status = {
value: "status",
sortable: false,
i18n: "status",
enable_icon: "mdi-account-check",
disable_icon: "mdi-account-cancel",
};
//#3
const action = {
value: "operate",
sortable: false,
i18n: "action",
btns: [
{
icon: "mdi-pencil",
action: "update",
rules: (v) => {
console.log("update", v);
return true;
},
},
{
icon: "mdi-trash-can",
action: "delete",
rules: (v) => {
console.log("delete", v);
let bool = false;
for (let i = 0; i < v.item.roles.length; i++) {
if (
//暫時寫死
v.item.roles[i].id == "79d56654-6676-4edc-880a-ad5b961fcdc0"
) {
bool = true;
}
}
return !bool;
},
},
],
};
export { account, name, roles, status, action };
```
#### 程式碼解釋
1. 宣告title ,以object方式來記錄設定,基本預設為 value,sortable,i18n
value為對應api回傳資料對應key值,sortable為是否能夠以此欄位來做排序設定,i18n為多語系對應文字
2. 宣告title,另外多出兩個不同key值,分別為 enable_icon、disable_icon,
主要用來判別欄位狀態,是否啟用,啟用的話則使用enable_icon做為顯示,不啟用則使用disable_icon
3. 宣告titel, 多出btns這個key值,用來 觸發指定事件, 像是編輯此資料相關等,
btns為陣列型別,接收object物件 , 物件內格式:{ icon:對應的icon,action:對應觸發事件,rules:型別為 function,用於判斷是否顯示在當前的dataTable上,必需回傳Boolean值}
==btns陣列中的物件 {icon,action,rules} 皆為必填參數==
### dataTable Header顯示設定
設定檔案位置:store/module/header
1. 檔案命名方式: 對應網頁.js
2. 檔案內容格式:
```javascript=
import {
account,
name,
roles,
status,
action,
} from "@/store/module/header/headeritems/usermanage";
export default [
{
bk: "xl",
items: [account, name, roles, status, action],
},
{
bk: "lg",
items: [account, name, roles, status, action],
},
{
bk: "md",
items: [account, roles, status, action],
},
{
bk: "sm",
items: [account, status, action],
},
{
bk: "xs",
items: [account, status, action],
},
];
```
#### 程式碼解釋
依照不同解析度(bk),來決定dataTable上要顯示多少欄位(items)
#### key值說明
| key | 說明 | 型別 |
| ----- | ------------- |:--------- |
| bk | 解析度斷點 | (String) |
| items | 對應欄位key值 | Array [ ] |
---
### button設定
設定檔案位置:store/module/btn
1. 檔案內容格式:
```javascript=
export default [
{
id: "add",
text: "confirm",
action: "add",
color: "primary",
},
{
id: "edit",
text: "confirm",
action: "edit",
color: "primary",
},
{
id: "delete",
text: "confirm",
action: "delete",
color: "primary",
},
{
id: "close",
text: "closed",
action: "close",
color: "error",
},
];
```
#### key值說明
| key | 說明 | 型別 |
|:------ | ------------ | -------- |
| id | 按鈕id | (String) |
| text | 按鈕顯示文字 | (String) |
| action | 按鈕對應事件 | (String) |
| color | 按鈕顏色 | (String) |
---
### item設定
設定檔案位置:store/module/header
1. 檔案命名方式: 對應網頁.js
2. 檔案內容格式:
```javascript=
//#1
const account = {
name: "account",
is: "text-field",
field: "account",
bind: {
label: "xaccount",
hint: "帳號為英文、數字、底線,長度為 2~16 字元",
},
};
const status = {
name: "status",
is: "radio",
field: "status",
defaultValue: null,
bind: {
label: "status",
multiple: false,
mandatory: true,
items: [
{ value: null, title: "showAll" },
{ value: 1, title: "showEnabledXOnly" },
{ value: 0, title: "showDisabledXOnly" },
],
},
};
const addstatus = {
name: "status",
field: "status",
is: "switch",
bind: {
label: "status",
},
};
const addRole = {
name: "roles",
field: "roles",
is: "checkbox-group",
text: "roles",
childselectfirstid: true,
lazyLoad: {
uri: "/api/Role",
payload: {
pageSize: 10,
pageIndex: 1,
SortColumnName: "name",
IsAscending: null,
},
method: "get",
label: "name",
value: "id",
},
bind: {
label: "group",
},
};
const name = {
name: "name",
is: "text-field",
field: "name",
bind: {
label: "name",
hint: "暱稱為中文、英文、數字、底線組成,長度為 16 字元",
rule: [
(v) => !!v || "暱稱為必填項目",
(v) => (v && v.length <= 16) || "暱稱上限長度為16字元",
(v) => (v && v.length >= 2) || "暱稱長度為2~16字元",
],
},
};
const password = {
name: "password",
is: "text-field",
field: "password",
bind: {
password: true,
label: "password",
hint: "密碼為為英文、數字共16字元,最少需要6字元",
},
};
const qrcode = {
name: "qrcode",
is: "qrcode",
field: "qrcode",
bind: {
label: "qrcode",
},
};
const roleId = {
name: "roleId",
is: "select",
field: "roleId",
text: "roleId",
Searchclasslist: true,
Searchapi: "Searchclasslist",
defaultValue: "",
lazyLoad: {
uri: "/api/Role",
payload: {
pageSize: 100,
pageIndex: 1,
SortColumnName: "name",
IsAscending: true,
},
method: "get",
label: "game_name_en",
value: "id",
selectval: "id",
selectlabel: "name",
},
bind: {
label: "group",
defaultall: true,
// items: [
// { label: "add", value: "add", appendIcon: "mdi-database" },
// { label: "reme ", value: "100" },
// { label: "edit ", value: "200" },
// { divider: true },
// { label: "get ", value: "300" },
// { label: "suspend", value: "400" },
// ],
},
};
export default [
account,
status,
roleId,
addstatus,
name,
password,
addRole,
qrcode,
];
```
#### 程式碼解釋
1. 依照所需顯示在畫面上的物件,宣告變數,並設置對應的組件、對應名稱、對應組件的細項設定等
#### key值說明
| key | 說明 | 型別 |
| ------------------ | ---------------------------------------------------------- |:-------- |
| name | 物件名稱 | (String) |
| is | 對應component | (String) |
| field | 對應變數名稱 | (String) |
| bind | 對應 component 設定 (object) 對應項目可前往 [vuetify] 查詢 | (Object) |
| text | 對應名稱 | (String) |
| childselectfirstid | dialog設定變數 | (String) |
| defaultValue | 預設值 | |
| `*` lazyLoad | 需要加載項目 | (Object) |
`*` lazyLoad 物件格式 :
```javascript=
lazyLoad: {
uri: "/api/Role",
payload: {
pageSize: 10,
pageIndex: 1,
SortColumnName: "name",
IsAscending: null,
},
method: "get",
label: "name",
value: "id",
},
```
##### payload key值說明
| key | 說明 | 型別 |
|:------- |:------------- |:-------- |
| uri | API位置 | (String) |
| payload | 請求資料/條件 | (Object) |
| method | API 方法 | (String) |
| label | 名稱 | (String) |
| value | 對應欄位 | (String) |
---
7.使用者資料設定
===
使用者從login登入後,會取得token,sideBars

當前w0專案會將 sideBar 另外拆解成兩個部分 (w0-sigin執行)
1. 路徑位置
* 路徑部分會分成父層與子層關係

#### key值解釋
| Key | 說明 | 型別 |
|:-------- |:------------ |:------ |
| *children | 子層路徑項目 | Array |
| code | 功能代碼 | String |
| i18n | 多語系 | String |
| icon | icon圖示 | String |
| id | 路徑唯一值 | String |
| name | 路徑名稱 | String |
*children 展開後裡面項目也一樣

2. 功能權限
* 紀錄每個頁面所擁有權限,僅記錄子層

#### key值解釋
| key | 說明 | 型別 |
|:--------- | ------------ |:------ |
| *authCode | CRUD權限加總 | Int |
| code | 功能代碼 | String |
| id | 路徑唯一值 | String |
| name | 路徑名稱 | String |
| status | 狀態 | Int |
*authCode 需要經過二進制轉換
``` javascript
/// 無權限
None = 0,
/// 搜尋權限
Read = 2,
/// 新增權限
Add = 4,
/// 編輯權限
Edit = 8,
/// 刪除權限
Delete = 16,
/// CRUD 權限
All = Read | Add | Edit | Delete
```
當這些資料切分完成後,需存入vuex state userinfo裡面
以w0為例
程式會去呼叫 src/store/index.js裡面的 w0procAfterSignin
```javascript=
this.$store.dispatch("domain/w0procAfterSignin", d);
```

會需要將四個值傳入
token,sideBars,path,authCode 可依照專案需求另外增加
另外也需要去
backend-foundation/src/store/index.js

還有需要設定
backend-foundation/src/router/submodule.js

vuex 的 userinfo 才會正常紀錄使用者所需要資訊
---
8.環境檔.env
===
```=
VUE_APP_I18N_LOCALE=zh-TW
VUE_APP_I18N_FALLBACK_LOCALE=zhHant
VUE_APP_AGENT=
```
| key | 解釋 |
|:---------------------------- |:---------------- |
| VUE_APP_I18N_LOCALE | 多語系本地預設 |
| VUE_APP_I18N_FALLBACK_LOCALE | 多語系本地預設 |
| VUE_APP_AGENT | 固定公司選項設定 |
---
9.協助建立設定檔
===
此功能僅限於 開發環境中顯示
:::warning
此項目目前還在測試中,部分功能尚未完全完成
:::
### 1. api設定檔生產器
頁面路徑 : /tool/apiProduction

欄位解釋 :
| 欄位 | 說明 |
| ------------- | ------------------------------------- |
| name | API 對應 action |
| uri | API 位置 |
| method | API 請求方式,GET、POST、PUT、DELETE |
| param | 預設帶入欄位資料 |
| IsAscending | 使用排序功能(需要API有開啟此功能才有用作) |
| SoreColumnName | 排序欄位(需要IsAscending 功能開啟,且API有開啟此功能才有用作) |
#### 操作說明 :
依照順訊填寫左側欄位
1. 填寫name
2. 填寫uri
3. 選擇method
4. 是否有需要預先帶入指定欄位資料,如果是則填寫對應欄位名稱
5. 是否有需要排序欄位
6. 如果選取第五點,則需要提供須排序的欄位名稱
7. 填寫完畢後按下加入即可
8. 若填寫完畢,可點選輸出按鈕

9. 點選複製
10. 貼到js程式碼
### 2. header設定檔生產器

欄位說明 :
| 欄位 | 說明 |
| ------------ | ------------------------- |
| label / i18n | table 的 th 欄位 顯示文字 |
| value | 對應傳入資料的欄位 |
| sortable | 是否可以啟用排序功能 |
| use Icon | 是否替換為icon |
| icon | 使用的 *icon樣式 與顏色 |
* icon樣式可由此頁面查詢 https://materialdesignicons.com/
#### 操作說明 :
依照順訊填寫左側欄位
1. 填寫 label/i18n (若使用多語系項目,則需填入對應多語系名詞)
2. 填寫 value
3. 選擇是否啟用排序功能
4. 選擇是否替換為 icon
5. 若第四點有開啟,請點選右側 + 符號進行新增icon操作

6. icon圖示僅需填寫圖示名稱即可,程式會自動轉換為vuetify可以讀取模式
7. icon顏色可依照需求帶入
8. 按下加入按鍵

備註: table 項目皆可使用拖曳方式排列順序
### 3. 組件介面設定檔生產器

組件可選擇項目:
1. 文字輸入 (text-field)

欄位解釋 :
| 欄位 | 說明 |
| ------------ | -------------- |
| field | 組件唯一值 |
| name | 組件名稱 |
| defalutValue | 預設值 |
| label | 組件顯示標題 |
| hint | 組件提示訊息 |
| isPassword | 是否為密碼輸入 |
| uesRule | 使用規則(點選使用後,勾選需使用的預設規則) |
2. 單選按鈕 (radio button)

欄位解釋 :
| 欄位 | 說明 |
| ------------ | ------------ |
| field | 組件唯一值 |
| name | 組件名稱 |
| defalutValue | 預設值 |
| label | 組件顯示標題 |
| items | 單選按鈕選項 |
3. 切換開關 (switch button)

欄位解釋 :
| 欄位 | 說明 |
| ------------ | ------------ |
| field | 組件唯一值 |
| name | 組件名稱 |
| defalutValue | 預設值 |
| label | 組件顯示標題 |
4. 下拉選單 (select)


欄位解釋 :
| 欄位 | 說明 |
| ------------ | ---------------------------------------------- |
| field | 組件唯一值 |
| name | 組件名稱 |
| defalutValue | 預設值 |
| label | 組件顯示標題 |
| defaultAll | 使用全部選項 |
| items | 下拉選單項目 |
| lazyload | 組件api設定 |
| uri | api路徑 |
| method | API 請求方式,GET、POST、PUT、DELETE |
| selectVal | 從api回傳中取出 select項目值 需填入對應key值 |
| selectLabel | 從api回傳中取出 select項目標題 需填入對應key值 |
| payload | api預設帶入資料 |
| pageSize | 回傳筆數 |
| pageIndex | 回傳頁數 |
5. QrCode

欄位解釋 :
| 欄位 | 說明 |
| ------------ | ---------------------------------------------- |
| field | 組件唯一值 |
| label | 組件顯示標題 |
6. 切換按鈕 (button-toggle)


欄位解釋 :
| 欄位 | 說明 |
| ------------ | ---------------------------------------------- |
| field | 組件唯一值 |
| name | 組件名稱 |
| defalutValue | 預設值 |
| label | 組件顯示標題 |
| lazyload | 組件api設定 |
| uri | api路徑 |
| method | API 請求方式,GET、POST、PUT、DELETE |
| payload | api預設帶入資料 |
| pageSize | 回傳筆數 |
| pageIndex | 回傳頁數 |
7. 時間選單 (dateTime-picker)


欄位解釋 :
| 欄位 | 說明 |
| ----------- | ------------------------------------ |
| field | 組件唯一值 |
| name | 組件名稱 |
| startTime | 對應開始時間參數 |
| endTime | 對應結束時間參數 |
| prependIcon | 顯示Icon |
| 常用時間 | 提供快速選取日期項目 |
| lazyload | 提供給常用時間 來請求api |
| uri | api路徑 |
| method | API 請求方式,GET、POST、PUT、DELETE |
| payload | api預設帶入資料 |
| pageSize | 回傳筆數 |
| pageIndex | 回傳頁數 |
---
.**假資料建立**
===
先建立一個public資料夾,再建立一個資料夾來存放假資料

將uri直接指向假資料位置

[vuetify]:https://vuetifyjs.com/zh-Hans/components/text-fields/
###### tags `W0封存`