Browse Source

金豆充值和余额页面开发联调

dev
zhaoln 1 month ago
committed by donghaolin
parent
commit
9fb24b9b94
  1. 1
      gold-system/.env.test
  2. 272
      gold-system/package-lock.json
  3. 6
      gold-system/package.json
  4. 2
      gold-system/src/router/index.js
  5. 2
      gold-system/src/util/http.js
  6. 115
      gold-system/src/views/goldBeen/addGoldenBeen.vue
  7. 461
      gold-system/src/views/goldBeen/goldenBeenBalance.vue
  8. 13
      gold-system/src/views/goldBeen/goldenBeenDetail.vue
  9. 4
      gold-system/src/views/index.vue
  10. 12
      gold-system/src/views/recharge/addRecharge.vue
  11. 2
      gold-system/src/views/refund/addRefund.vue
  12. 12
      gold-system/src/views/usergold/index.vue
  13. 245
      gold-system/src/views/workspace/index.vue
  14. 95
      gold-system/src/views/z.vue
  15. 4949
      gold-system/stats.html
  16. 22
      gold-system/tsconfig.app.json
  17. 3
      gold-system/tsconfig.json
  18. 11
      gold-system/tsconfig.node.json
  19. 1
      gold-system/tsconfig.tsbuildinfo
  20. 32
      gold-system/vite.config.ts

1
gold-system/.env.test

@ -0,0 +1 @@
VITE_API_BASE='http://54.251.137.151:10704/'

272
gold-system/package-lock.json

@ -26,8 +26,10 @@
},
"devDependencies": {
"@types/node": "^22.10.5",
"@types/vue": "^2.0.0",
"@vitejs/plugin-legacy": "^6.0.2",
"@vitejs/plugin-vue": "^5.1.4",
"rollup-plugin-visualizer": "^5.14.0",
"sass": "^1.86.3",
"terser": "^5.38.1",
"typescript": "~5.6.2",
@ -2659,6 +2661,16 @@
"undici-types": "~6.20.0"
}
},
"node_modules/@types/vue": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz",
"integrity": "sha512-WDElkBv/o4lVwu6wYHB06AXs4Xo2fwDjJUpvPRc1QQdzkUSiGFjrYuSCy8raxLE5FObgKq8ND7R5gSZTFLK60w==",
"deprecated": "This is a stub types definition for vuejs (https://github.com/vuejs/vue). vuejs provides its own type definitions, so you don't need @types/vue installed!",
"dev": true,
"dependencies": {
"vue": "*"
}
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
@ -3028,6 +3040,30 @@
"dev": true,
"license": "MIT"
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/async-validator/-/async-validator-4.2.5.tgz",
@ -3245,6 +3281,20 @@
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/codepage": {
"version": "1.15.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/codepage/-/codepage-1.15.0.tgz",
@ -3254,6 +3304,24 @@
"node": ">=0.8"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/combined-stream/-/combined-stream-1.0.8.tgz",
@ -3385,6 +3453,15 @@
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
"license": "MIT"
},
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -3462,6 +3539,12 @@
"vue": "^3.2.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/entities/-/entities-4.5.0.tgz",
@ -3661,6 +3744,15 @@
"node": ">=6.9.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@ -3718,6 +3810,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true,
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
@ -3728,6 +3835,15 @@
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
@ -3762,6 +3878,18 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"dependencies": {
"is-docker": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/javascript-natural-sort": {
"version": "0.7.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
@ -4016,6 +4144,23 @@
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz",
"integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
"dev": true,
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/path-browserify/-/path-browserify-1.0.1.tgz",
@ -4208,6 +4353,15 @@
"node": ">=6"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@ -4272,6 +4426,45 @@
"fsevents": "~2.3.2"
}
},
"node_modules/rollup-plugin-visualizer": {
"version": "5.14.0",
"resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz",
"integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==",
"dev": true,
"dependencies": {
"open": "^8.4.0",
"picomatch": "^4.0.2",
"source-map": "^0.7.4",
"yargs": "^17.5.1"
},
"bin": {
"rollup-plugin-visualizer": "dist/bin/cli.js"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"rolldown": "1.x",
"rollup": "2.x || 3.x || 4.x"
},
"peerDependenciesMeta": {
"rolldown": {
"optional": true
},
"rollup": {
"optional": true
}
}
},
"node_modules/rollup-plugin-visualizer/node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/sass": {
"version": "1.86.3",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.86.3.tgz",
@ -4361,6 +4554,32 @@
"node": ">=0.8"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
@ -4736,6 +4955,23 @@
"node": ">=0.8"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/xe-utils": {
"version": "3.7.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/xe-utils/-/xe-utils-3.7.0.tgz",
@ -4763,12 +4999,48 @@
"node": ">=0.8"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
"engines": {
"node": ">=12"
}
},
"node_modules/zrender": {
"version": "5.6.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/zrender/-/zrender-5.6.0.tgz",

6
gold-system/package.json

@ -3,9 +3,11 @@
"private": true,
"version": "0.0.0",
"type": "module",
"sideEffects": false,
"scripts": {
"dev": "vite --host 0.0.0.0",
"build": "vue-tsc -b && vite build",
"build:test": "vite build --mode test",
"build:prod": "vite build --mode production",
"preview": "vite preview",
"serve": "vite - service serve --host 0.0.0.0 --port 8080"
},
@ -28,8 +30,10 @@
},
"devDependencies": {
"@types/node": "^22.10.5",
"@types/vue": "^2.0.0",
"@vitejs/plugin-legacy": "^6.0.2",
"@vitejs/plugin-vue": "^5.1.4",
"rollup-plugin-visualizer": "^5.14.0",
"sass": "^1.86.3",
"terser": "^5.38.1",
"typescript": "~5.6.2",

2
gold-system/src/router/index.js

@ -45,6 +45,8 @@ const router = createRouter({
{ path: '/noPermission', name: "noPermission", component: () => import("../views/noPermissionPage.vue") },
//金豆充值
{ path: '/addGoldenBeen', name: "addGoldenBeen", component: () => import("../views/goldBeen/addGoldenBeen.vue") },
//金豆余额
{ path: '/goldenBeenBalance', name: "goldenBeenBalance", component: () => import("../views/goldBeen/goldenBeenBalance.vue") },
//金豆充值明细
{ path: '/goldenBeenDetail', name: "goldenBeenDetail", component: () => import("../views/goldBeen/goldenBeenDetail.vue") },
]

2
gold-system/src/util/http.js

@ -1,6 +1,6 @@
import request from './request'
export default function requestHandler(options) {
export default function(options) {
const { method = 'post', url, data = {}, params = {}, headers = {} } = options
return request({

115
gold-system/src/views/goldBeen/addGoldenBeen.vue

@ -4,7 +4,7 @@
<div class="add-box">
<el-form
:model="beenObj"
ref="Ref"
ref="ruleFormRef"
:rules="rules"
label-width="auto"
style="max-width: 600px"
@ -14,23 +14,31 @@
<el-input v-model="beenObj.jwcode" style="width: 220px" />
<el-button
type="primary"
@click="beenObj.jwcode"
@click="getUser(beenObj.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="type" label="充值类型">
<el-radio-group v-model="beenObj.type">
<el-radio value="0">增加</el-radio>
<el-radio label="1">减少</el-radio>
<el-radio :value="0">增加</el-radio>
<el-radio :value="1">减少</el-radio>
</el-radio-group>
</el-form-item>
<div style="display: flex">
<el-form-item prop="payBeean" label="付费金豆">
<el-input v-model="beenObj.payBeean" style="width: 50px" />
<el-input-number
v-model="beenObj.payBeean"
:controls="false"
:min="0"
/>
</el-form-item>
<el-form-item prop="freeBeean" label="免费金豆">
<el-input v-model="beenObj.freeBeean" style="width: 50px" />
<el-input-number
v-model="beenObj.freeBeean"
:controls="false"
:min="0"
/>
</el-form-item>
</div>
@ -44,18 +52,20 @@
type="textarea"
/>
</el-form-item>
<el-form-item prop="submitter" label="提交人">
<!-- <el-form-item prop="submitter" label="提交人">
<el-input
style="width: 300px"
:value="beenObj.submitter"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
</el-form-item> -->
<el-form-item>
<div class="btn-group">
<el-button @click="deleteRecharge">重置</el-button>
<el-button type="primary" @click="addBean"> 提交 </el-button>
<el-button @click="resetData(ruleFormRef)">重置</el-button>
<el-button type="primary" @click="addBean(ruleFormRef)">
提交
</el-button>
</div>
</el-form-item>
</el-form>
@ -63,87 +73,98 @@
<el-card>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<div class="custom-box">
<el-text>姓名:{{ user.name }}</el-text>
<el-text>当前付费金豆:</el-text>
<el-text>姓名:{{ user.nickname }}</el-text>
<el-text>当前付费金豆:{{ user.jinbiBuy }}</el-text>
<el-text>精网号:{{ user.jwcode }}</el-text>
<el-text>当前免费金豆:</el-text>
<el-text>负责客服:</el-text>
<el-text>消费次数:</el-text>
<el-text>所属门店</el-text>
<el-text>当前免费金豆:{{ user.jinbiFree }}</el-text>
<!-- <el-text>负责客服:</el-text> -->
<el-text>消费次数:{{ user.number }}</el-text>
<!-- <el-text>所属门店</el-text> -->
</div>
</el-card>
</div>
</div>
</template>
<script setup>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import API from '@/util/http'
import type { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus'
type userType = {
[key: string]: number | string
}
const ruleFormRef = ref<FormInstance>()
const beenObj = ref({
jwcode: '',
remark: '',
submitter: '',
type: '0',
type: 0, //01
payBeean: 0,
freeBeean: 0
})
const user = reactive({})
const adminData = reactive({})
let user: userType = reactive({})
const rules = ref({
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
remark: [{ required: true, message: '请输入备注', trigger: 'blur' }],
submitter: [{ required: true, message: '请输入提交人', trigger: 'blur' }],
// submitter: [{ required: true, message: '', trigger: 'blur' }],
type: [{ required: true, message: '请选择充值类型', trigger: 'change' }],
payBeean: [{ required: true, message: '请输入付费金豆', trigger: 'blur' }],
freeBeean: [{ required: true, message: '请输入免费金豆', trigger: 'blur' }]
})
const addBean = () => {
const addBean = (formEl) => {
//
bean.value.validate((valid) => {
formEl.validate(async (valid) => {
if (valid) {
//
console.log('表单提交成功', beenObj.value)
const result = await API({
url: '/dou/add',
data: {
jwcode: beenObj.value.jwcode,
content: beenObj.value.remark,
moneyFree: Number(beenObj.value.freeBeean),
moneyBuy: Number(beenObj.value.payBeean),
time: Math.floor(Date.now() / 1000),
data: beenObj.value.type
}
})
if (result.code === 200) {
ElMessage.success('充值成功')
beenObj.value.jwcode = ''
beenObj.value.remark = ''
beenObj.value.payBeean = 0
beenObj.value.freeBeean = 0
} else if (result.code === 0) {
ElMessage.error(result.msg)
return
}
console.log('请求成功', result)
} else {
console.log('表单验证失败')
return false
ElMessage.error('表单验证失败')
}
})
}
const resetData = (formEl) => {
if (!formEl) return
formEl.resetFields()
}
const getUser = async function (jwcode) {
try {
// POST
const result = await API({
url: '/recharge/user',
url: '/dou/search',
data: {
jwcode: jwcode,
area: adminData.area
jwcode: jwcode
}
})
if (result.code === 0) {
ElMessage.error(result.msg)
} else {
user = result.data
user.A =
Number(user.pendingRechargeTimes) + Number(user.pendingSpendTimes)
ElMessage.success(result.msg)
Object.assign(user, result.data)
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('查询失败,请检查精网号是否正确')
}
}
const getAdminData = async function () {
try {
const result = await API({
url: '/admin/userinfo',
data: {}
})
adminData = result
} catch (error) {
console.log('请求失败', error)
}
}
getAdminData()
</script>
<style scoped>
.add-box {

461
gold-system/src/views/goldBeen/goldenBeenBalance.vue

@ -1,14 +1,14 @@
<template>
<div class="filter-box">
<el-form>
<el-form-item label="精网号">
<el-form :model="detailY" ref="ruleFormRef">
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="detailY.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item label="地区">
<el-form-item prop="area" label="地区">
<el-select
v-model="detailY.area"
placeholder="请选择所属地区"
@ -16,22 +16,35 @@
clearable
>
<el-option
v-for="item in area"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in areaArray"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" @click="getInit({})"
>查询</el-button
>
<el-button type="primary" size="small" @click="reset(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
</div>
<div class="table-box">
<p>金豆总数充值金豆总数合计新币数</p>
<p>
现有金豆:&nbsp;&nbsp;付费金豆:{{ getObj.jinbiBuy }}&nbsp;&nbsp;免费金豆:{{
getObj.jinbiFree
}}&nbsp;&nbsp;历史消费:{{ getObj.jinbiCostTotal }}
</p>
<el-table
:data="tableData"
style="width: 100%"
:default-sort="{ prop: 'createTime', order: 'descending' }"
:default-sort="{ prop: 'jinbiCostTotal', order: 'descending' }"
height="584px"
@sort-change="handleSortChange"
>
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
@ -40,67 +53,21 @@
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="username" label="姓名" width="150" />
<el-table-column fixed="left" prop="nickname" label="姓名" width="150" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" />
<el-table-column prop="area" label="所属地区" width="120" />
<el-table-column prop="type" label="类型" width="110">
<!-- 模板内容 -->
<template #default="scope">
<span v-if="scope.row.updateType == 1">
<span>消费</span>
</span>
<span v-if="scope.row.updateType == 0">
<span>充值</span>
</span>
<span v-if="scope.row.updateType == 2">
<span>退款</span>
</span>
<span v-if="scope.row.updateType == 3">
<span>其他</span>
</span>
</template>
</el-table-column>
<el-table-column prop="order" label="订单号" width="120" />
<el-table-column prop="been" label="金豆数量" width="120">
<template #default="scope">
<span>{{ scope.row.gold / 100 }}</span>
</template>
</el-table-column>
<el-table-column prop="paybeen" label="付费金豆" width="120">
<template #default="scope">
<span>{{ scope.row.paybeen / 100 }}</span>
</template>
<el-table-column prop="ipAddress" label="所属地区" width="120" />
<el-table-column prop="jinbi" label="金豆数量" width="120">
</el-table-column>
<el-table-column prop="freebeen" label="免费金豆" width="120">
<template #default="scope">
<span>{{ scope.row.freebeen / 100 }}</span>
</template>
<el-table-column prop="jinbiBuy" label="付费金豆" width="120">
</el-table-column>
<el-table-column prop="count" label="金额"></el-table-column>
<el-table-column prop="consumePlatform" label="充值平台" width="140">
<template #default="scope">
<!-- 使用非严格相等比较 -->
<span v-if="scope.row.consumePlatform == 0">初始化金币</span>
<span v-if="scope.row.consumePlatform == 1">ERP系统</span>
<span v-if="scope.row.consumePlatform == 3">Homily Link</span>
<span v-if="scope.row.consumePlatform == 2">Homily Chart</span>
<span v-if="scope.row.consumePlatform == 4">金币系统</span>
</template>
<el-table-column prop="jinbiFree" label="免费金豆" width="120">
</el-table-column>
<el-table-column prop="notes" label="备注" width="210"></el-table-column>
<el-table-column
prop="createTime"
sortable="“custom”"
label="充值时间"
width="210"
show-overflow-tooltip
>
<template #default="scope">
<span>{{
moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss')
}}</span>
</template>
</el-table-column>
sortable
prop="jinbiCostTotal"
label="历史消费"
></el-table-column>
</el-table>
<!-- 分页 -->
<div class="pagination">
@ -114,7 +81,7 @@
<el-select
v-model="getObj.pageSize"
class="page-size"
@change="get()"
@change="handlePageSizeChange"
style="width: 80px"
>
<el-option
@ -132,334 +99,114 @@
:page-size="getObj.pageSize"
:total="total"
:current-page="getObj.pageNum"
@current-change="get"
@current-change="handlePageChange"
>
<div>跳至</div>
<el-input
v-model="getObj.pageNum"
style="width: 40px"
@change="checkNumber"
/>
<el-input v-model="getObj.pageNum" style="width: 40px" />
<div></div>
</el-pagination>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
<!-- 这是导出excel的弹窗 -->
<el-dialog
v-model="getPutEX"
title="请选择导出条件"
width="500"
:close-on-click-modal="false"
>
<template #footer>
<el-form
v-loading="loading"
ref="ruleFormRef"
style="max-width: 600px"
:model="putExcel"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item prop="activityName" label="精网号:">
<el-input
v-model="putExcel.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item label="所属地区:"
><el-select
v-model="putExcel.area"
placeholder="请选择所属地区"
style="width: 240px"
clearable
>
<el-option
v-for="item in area"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
import type { FormInstance } from 'element-plus'
<el-form-item label="更新时间:">
<el-radio-group v-model="TimeGet">
<el-radio value="1" @click="getT()">今天</el-radio>
<el-radio value="3" @click="get3()">近三天</el-radio>
<el-radio value="7" @click="get7()">近一周</el-radio>
<el-radio value="30" @click="get30()">近一个月</el-radio>
</el-radio-group>
</el-form-item>
<el-button
type="primary"
size="small"
style="margin-left: 10px"
@click="areyour()"
>确定</el-button
>
</el-form>
</template>
</el-dialog>
<el-dialog
v-model="areyouright"
title=""
width="500"
:close-on-click-modal="false"
>
<el-button type="success" @click="exportExcel()">导出</el-button>
</el-dialog>
</template>
<script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
import * as XLSX from 'xlsx'
//
const adminData = ref({})
//
const tableData = ref([])
//
const total = ref(100)
//
const detailY = ref({})
const detailY = reactive({ jwcode: '', area: '' })
const ruleFormRef = ref<FormInstance>()
let areaArray = ref<string[]>([])
let getObj = ref({
pageNum: 1,
pageSize: 50,
jinbiBuy: 0,
jinbiCostTotal: 0,
jinbiFree: 0
})
//
const get = async function (val) {
const getInit = async function ({
sortField = '',
sortOrder = ''
}: {
sortField?: string
sortOrder?: string
}) {
try {
//
if (adminData.value.area === '泰国') {
detailY.value.areas = ['泰国', '越南']
} else if (adminData.value.area !== '总部') {
detailY.value.area = adminData.value.area
}
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
detailY.value.startDate = getTime.value[0]
detailY.value.endDate = getTime.value[1]
}
} else {
detailY.value.startDate = ''
detailY.value.endDate = ''
}
//
detailY.value.sortField = sortField.value
detailY.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
// POST
const result = await API({
url: '/detailY',
method: 'post',
data: { ...getObj.value, detailY: { ...detailY.value } }
url: '/dou/getYve',
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
yve: {
jwcode: detailY.jwcode,
ipAddress: detailY.area,
sortField: sortField,
sortOrder: sortOrder
}
}
})
tableData.value = result.data.list
console.log('tableData', tableData.value)
total.value = result.data.total
console.log('total', total.value)
} catch (error) {
console.log('请求失败', error)
//
}
}
//
const search = function () {}
//
const reset = function () {}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
const handleSortChange = (column) => {
const { prop, order } = column
if (order === 'ascending') {
getInit({ sortField: prop, sortOrder: 'ASC' })
} else if (order === 'descending') {
getInit({ sortField: prop, sortOrder: 'DESC' })
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
getInit({})
}
}
//
onMounted(async function () {
await getAdminData()
await get()
})
// excel
// Excel
//
const json_fields = (row) => {
return [
row.jwcode, //
row.area, //
row.platform, //
row.consumePlatform, //
row.gold, //
row.rechargeCoin, //
row.freeCoin, //
row.taskCoin, //
row.createAdmin, //
row.createTime,
row.name,
row.id
]
const handlePageChange = (val: number): void => {
getObj.value.pageNum = val
getInit({})
}
const headers = [
'精网号',
'地区',
'平台信息',
'数量',
'更新类型',
'永久金币',
'免费金币',
'任务金币',
'提交人',
'更新时间',
'用户名',
'id'
]
const exportExcel = () => {
// json_fields
const data = excelInfo.value.map(json_fields)
const ws = XLSX.utils.aoa_to_sheet(data)
//
XLSX.utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
XLSX.writeFile(wb, '客户金币明细.xlsx')
const handlePageSizeChange = (val) => {
getObj.value.pageSize = val
getObj.value.pageNum = 1
getInit({})
}
//
const reset = function (formEl: FormInstance | undefined) {
if (!formEl) return
formEl.resetFields()
}
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const putExcel = ref({
startDate: startDate,
endDate: endDate
})
const excelInfo = ref({})
const loading = ref(false)
const areyour = async function () {
try {
loading.value = true
const result = await API({
url: '/detailY/searchAll',
method: 'post',
data: { ...putExcel.value }
})
excelInfo.value = result.data
// excelInfo
if (Array.isArray(excelInfo.value)) {
excelInfo.value.forEach((item) => {
if (item.rechargeCoin) {
item.rechargeCoin = item.rechargeCoin / 100
}
if (item.freeCoin) {
item.freeCoin = item.freeCoin / 100
}
if (item.taskCoin) {
item.taskCoin = item.taskCoin / 100
}
const getArea = async () => {
const result = await API({
url: '/dou/getIp'
})
console.log('获取地区', result.data)
if (result.code == 200) {
areaArray.value = result.data
}
areyouright.value = true
ElMessage({
type: 'success',
message: '查询成功'
}
const getCount = async () => {
const result = await API({
url: '/dou/getYveTotal'
})
loading.value = false
} catch (error) {
console.log('请求失败', error)
loading.value = false
if (result.code == 200) {
const { jinbiBuy, jinbiFree, jinbiCostTotal } = result.data
getObj.value.jinbiBuy = jinbiBuy
getObj.value.jinbiFree = jinbiFree
getObj.value.jinbiCostTotal = jinbiCostTotal
}
}
const areyouright = ref(false)
//
const area = [
{
value: '马来西亚',
label: '马来西亚'
},
{
value: '新加坡',
label: '新加坡'
},
{
value: '香港',
label: '香港'
},
{
value: '泰国',
label: '泰国'
},
{
value: '加拿大',
label: '加拿大'
},
{
value: '越南HCM',
label: '越南HCM'
}
]
//
const platform = [
{
value: '4',
label: '金币系统'
},
{
value: '1',
label: 'ERP系统'
},
{
value: '2',
label: 'Homily Chart'
},
{
value: '3',
label: 'Homily Link'
},
{
value: '0',
label: '初始化金币'
}
]
const TimeGet = ref('1')
getArea()
getCount()
getInit({})
</script>
<style scoped lang="scss">
.filter-box {

13
gold-system/src/views/goldBeen/goldenBeenDetail.vue

@ -256,7 +256,8 @@ import { ref, onMounted, reactive, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
import * as XLSX from 'xlsx'
// import * as XLSX from 'xlsx'
import { utils, writeFile } from 'xlsx'
//
const adminData = ref({})
//
@ -382,12 +383,12 @@ const headers = [
const exportExcel = () => {
// json_fields
const data = excelInfo.value.map(json_fields)
const ws = XLSX.utils.aoa_to_sheet(data)
const ws = utils.aoa_to_sheet(data)
//
XLSX.utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
XLSX.writeFile(wb, '客户金币明细.xlsx')
utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const wb = utils.book_new()
utils.book_append_sheet(wb, ws, 'Sheet1')
writeFile(wb, '客户金币明细.xlsx')
}
const today = new Date()
const startDate = new Date(

4
gold-system/src/views/index.vue

@ -230,8 +230,8 @@ const changeDataByArea = (item) => {
>
<el-menu-item index="/addGoldenBeen">金豆充值</el-menu-item>
<!-- <el-menu-item index="/goldenBeenDetail">金豆充值明细</el-menu-item>
<el-menu-item>金豆消费明细</el-menu-item>
<el-menu-item>客户金豆余额</el-menu-item> -->
<el-menu-item>金豆消费明细</el-menu-item>-->
<el-menu-item index="/goldenBeenBalance">客户金豆余额</el-menu-item>
</el-sub-menu>
<el-menu-item
index="/usergold"

12
gold-system/src/views/recharge/addRecharge.vue

@ -7,8 +7,8 @@ import { ElMessageBox } from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
import { range, re } from 'mathjs'
import * as xlsx from 'xlsx'
import _ from 'lodash'
import { utils, read } from 'xlsx'
import throttle from 'lodash/throttle'
//
const beforeAvatarUpload = (file) => {
@ -476,7 +476,7 @@ const addLines = async function () {
// }
// };
// 使 _.throttle trailing false
const throttledAddLines = _.throttle(addLines, 500, { trailing: false })
const throttledAddLines = throttle(addLines, 500, { trailing: false })
// excelref
const uploadRefMap = ref({})
// excel
@ -494,9 +494,9 @@ const httpExcelRequest = async (op) => {
// excel
let file = op.file
let dataBinary = await readFile(file)
let workBook = xlsx.read(dataBinary, { type: 'binary', cellDates: true })
let workBook = read(dataBinary, { type: 'binary', cellDates: true })
let workSheet = workBook.Sheets[workBook.SheetNames[0]]
const excelData = xlsx.utils.sheet_to_json(workSheet, { header: 1 })
const excelData = utils.sheet_to_json(workSheet, { header: 1 })
excelList.value = excelData
console.log(excelData)
}
@ -780,7 +780,7 @@ const batchAdd = async function () {
}
}
// 使 _.throttle trailing false
const throttledBatchAdd = _.throttle(batchAdd, 2000, { trailing: false })
const throttledBatchAdd = throttle(batchAdd, 2000, { trailing: false })
//
const batchSettingObj = ref({
rechargeGold: '0',

2
gold-system/src/views/refund/addRefund.vue

@ -7,7 +7,7 @@ import axios from 'axios'
import { ElMessageBox } from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
import _ from 'lodash'
// import _ from 'lodash'
const addRe = ref({
typeR: '0'

12
gold-system/src/views/usergold/index.vue

@ -6,7 +6,7 @@ import axios from 'axios'
import moment from 'moment'
import { ta } from 'element-plus/es/locales.mjs'
import API from '@/util/http'
import * as XLSX from 'xlsx'
import { writeFile, utils } from 'xlsx'
//
//
const adminData = ref({})
@ -292,12 +292,12 @@ const headers = [
const exportExcel = () => {
// json_fields
const data = excelInfo.value.map(json_fields)
const ws = XLSX.utils.aoa_to_sheet(data)
const ws = utils.aoa_to_sheet(data)
//
XLSX.utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
XLSX.writeFile(wb, '客户金币明细.xlsx')
utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const wb = utils.book_new()
utils.book_append_sheet(wb, ws, 'Sheet1')
writeFile(wb, '客户金币明细.xlsx')
}
const today = new Date()
const startDate = new Date(

245
gold-system/src/views/workspace/index.vue

@ -1,5 +1,6 @@
<script setup>
import * as echarts from 'echarts'
import * as echarts from 'echarts'
import { ref, onMounted, reactive, computed } from 'vue'
import { VscInfo } from 'vue-icons-plus/vsc'
import * as bs from 'vue-icons-plus/bs'
@ -8,7 +9,7 @@ import API from '@/util/http'
import moment from 'moment'
import * as math from 'mathjs'
import { getTime } from 'element-plus/es/components/countdown/src/utils.mjs'
// const echarts = await import('echarts')
//
//
const loading = ref(true)
@ -645,15 +646,15 @@ const getAreaRank = async function () {
//
const findBsComponent = function (index) {
let iconName
if (index < 3) {
iconName = `bs.Bs${index + 1}CircleFill` // index
} else {
iconName = `bs.Bs${index + 1}Circle` // index
}
return eval(iconName) //
}
// const findBsComponent = function (index) {
// let iconName
// if (index < 3) {
// iconName = `bs.Bs${index + 1}CircleFill` // index
// } else {
// iconName = `bs.Bs${index + 1}Circle` // index
// }
// return eval(iconName) //
// }
//
const changeGoldType = function () {
console.log('changeGoldType', goldType.value)
@ -818,105 +819,105 @@ const search = function () {
}
//
const changePlatform = function () {
console.log('changePlatform', platform.value)
if (platform.value == '全部平台') {
// domecharts
var all = echarts.init(document.getElementById('all'))
const option6 = {
tooltip: {
trigger: 'item'
},
series: [
{
name: '四大学科类别占比',
type: 'pie',
radius: ['40%', '60%'],
avoidLabelOverlap: false,
data: allData.value
}
]
}
// 使
all.setOption(option6)
} else if (platform.value == 'ERP') {
// domecharts
var ERP = echarts.init(document.getElementById('ERP'))
const option7 = {
tooltip: {
trigger: 'item'
},
series: [
{
name: '四大学科类别占比',
type: 'pie',
radius: ['40%', '60%'],
avoidLabelOverlap: false,
data: ERPData.value
}
]
}
// 使
ERP.setOption(option7)
} else if (platform.value == 'HC') {
// 4-3 domecharts
var HC = echarts.init(document.getElementById('HC'))
const option8 = {
tooltip: {
trigger: 'item'
},
series: [
{
name: '四大学科类别占比',
type: 'pie',
radius: ['40%', '60%'],
avoidLabelOverlap: false,
data: HCData.value
}
]
}
// 使
HC.setOption(option8)
} else if (platform.value == 'Link') {
// 4-4 domecharts
var Link = echarts.init(document.getElementById('Link'))
const option9 = {
tooltip: {
trigger: 'item'
},
series: [
{
name: '四大学科类别占比',
type: 'pie',
radius: ['40%', '60%'],
avoidLabelOverlap: false,
data: LinkData.value
}
]
}
// 使
Link.setOption(option9)
} else if (platform.value == '金币系统') {
// 4-5 domecharts
var gold = echarts.init(document.getElementById('gold'))
const option10 = {
tooltip: {
trigger: 'item'
},
series: [
{
name: '四大学科类别占比',
type: 'pie',
radius: ['40%', '60%'],
avoidLabelOverlap: false,
data: goldData.value
}
]
}
// 使
gold.setOption(option10)
}
}
// const changePlatform = function () {
// console.log('changePlatform', platform.value)
// if (platform.value == '') {
// // domecharts
// var all = echarts.init(document.getElementById('all'))
// const option6 = {
// tooltip: {
// trigger: 'item'
// },
// series: [
// {
// name: '',
// type: 'pie',
// radius: ['40%', '60%'],
// avoidLabelOverlap: false,
// data: allData.value
// }
// ]
// }
// // 使
// all.setOption(option6)
// } else if (platform.value == 'ERP') {
// // domecharts
// var ERP = echarts.init(document.getElementById('ERP'))
// const option7 = {
// tooltip: {
// trigger: 'item'
// },
// series: [
// {
// name: '',
// type: 'pie',
// radius: ['40%', '60%'],
// avoidLabelOverlap: false,
// data: ERPData.value
// }
// ]
// }
// // 使
// ERP.setOption(option7)
// } else if (platform.value == 'HC') {
// // 4-3 domecharts
// var HC = echarts.init(document.getElementById('HC'))
// const option8 = {
// tooltip: {
// trigger: 'item'
// },
// series: [
// {
// name: '',
// type: 'pie',
// radius: ['40%', '60%'],
// avoidLabelOverlap: false,
// data: HCData.value
// }
// ]
// }
// // 使
// HC.setOption(option8)
// } else if (platform.value == 'Link') {
// // 4-4 domecharts
// var Link = echarts.init(document.getElementById('Link'))
// const option9 = {
// tooltip: {
// trigger: 'item'
// },
// series: [
// {
// name: '',
// type: 'pie',
// radius: ['40%', '60%'],
// avoidLabelOverlap: false,
// data: LinkData.value
// }
// ]
// }
// // 使
// Link.setOption(option9)
// } else if (platform.value == '') {
// // 4-5 domecharts
// var gold = echarts.init(document.getElementById('gold'))
// const option10 = {
// tooltip: {
// trigger: 'item'
// },
// series: [
// {
// name: '',
// type: 'pie',
// radius: ['40%', '60%'],
// avoidLabelOverlap: false,
// data: goldData.value
// }
// ]
// }
// // 使
// gold.setOption(option10)
// }
// }
//
//
@ -1443,17 +1444,7 @@ onMounted(async function () {
</div>
<div class="bar">
<div id="recharge" style="width: 100%; height: 400px"></div>
<div style="width: 140px">
<div class="goldCategory">
<span>永久金币</span>
</div>
<div class="goldCategory">
<span>免费金币</span>
</div>
<div class="goldCategory">
<span>任务金币</span>
</div>
</div>
<div style="width: 30%">
<div class="ranking-header">
<span style="width: 150px">地区金币充值排名</span>
@ -1510,17 +1501,7 @@ onMounted(async function () {
</div>
<div class="bar">
<div id="consume" style="width: 100%; height: 400px"></div>
<div style="width: 140px">
<div class="goldCategory">
<span>永久金币</span>
</div>
<div class="goldCategory">
<span>免费金币</span>
</div>
<div class="goldCategory">
<span>任务金币</span>
</div>
</div>
<div style="width: 310px">
<div class="ranking-header">
<span style="margin-right: 90px; width: 150px"

95
gold-system/src/views/z.vue

@ -1,20 +1,20 @@
<script setup>
import { ref, onMounted, reactive, computed, nextTick } from "vue";
import { ref, onMounted, reactive, computed, nextTick } from 'vue'
//
const allData = ref([]);
const tableData = ref([]);
const elTableHeight = ref('');
const theadHeight = ref('');
const contentHeight = ref(0);
const showRowCount = ref(0);
const falseBox = ref(null);
const scollBoxHeight = ref(0);
const scrollTopRowCount = ref(0);
const allData = ref([])
const tableData = ref([])
const elTableHeight = ref('')
const theadHeight = ref('')
const contentHeight = ref(0)
const showRowCount = ref(0)
const falseBox = ref(null)
const scollBoxHeight = ref(0)
const scrollTopRowCount = ref(0)
//
onMounted(async function () {
allData.value = [];
allData.value = []
for (let i = 0; i < 10000; i++) {
allData.value.push({
name: '张三' + i,
@ -24,35 +24,56 @@ onMounted(async function () {
date: '2022-01-01'
})
}
scollBoxHeight.value = 45 * allData.value.length + 45; //
scollBoxHeight.value = 45 * allData.value.length + 45 //
nextTick(() => {
elTableHeight.value = document.querySelector('.table-box .el-table').offsetHeight;
theadHeight.value = document.querySelector('.table-box .el-table__header-wrapper').offsetHeight;
console.log("elTableHeight", elTableHeight.value);
console.log("theadHeight", theadHeight.value);
contentHeight.value = elTableHeight.value - theadHeight.value;
console.log("contentHeight", contentHeight.value);
showRowCount.value = Math.floor(contentHeight.value / 45);
console.log("showRowCount", showRowCount.value);
elTableHeight.value = document.querySelector(
'.table-box .el-table'
).offsetHeight
theadHeight.value = document.querySelector(
'.table-box .el-table__header-wrapper'
).offsetHeight
console.log('elTableHeight', elTableHeight.value)
console.log('theadHeight', theadHeight.value)
contentHeight.value = elTableHeight.value - theadHeight.value
console.log('contentHeight', contentHeight.value)
showRowCount.value = Math.floor(contentHeight.value / 45)
console.log('showRowCount', showRowCount.value)
// <showRowCount>
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(0, showRowCount.value);
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(
0,
showRowCount.value
)
})
falseBox.value = document.querySelector('.false-box');
falseBox.value = document.querySelector('.false-box')
falseBox.value.addEventListener('scroll', function (e) {
scrollTopRowCount.value = Math.ceil(e.target.scrollTop / 45);
scrollTopRowCount.value = Math.ceil(e.target.scrollTop / 45)
// <scrollTopRowCount> <showRowCount>
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(scrollTopRowCount.value, showRowCount.value);
});
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(
scrollTopRowCount.value,
showRowCount.value
)
})
})
</script>
<template>
<div class="box" style="width: 1000px; height: 500px; overflow: hidden; position: relative;">
<div
class="box"
style="width: 1000px; height: 500px; overflow: hidden; position: relative"
>
<!-- false-box这是一个用来显示滚动条的方法 -->
<div class="false-box"
style="width: 100%; height: 100%; position: absolute; top: 0%; left: 0%; overflow: auto;">
<div class="scroll-box" :style="{ 'height': scollBoxHeight + 'px' }">
<div
class="false-box"
style="
width: 100%;
height: 100%;
position: absolute;
top: 0%;
left: 0%;
overflow: auto;
"
>
<div class="scroll-box" :style="{ height: scollBoxHeight + 'px' }">
<!-- scroll-box是用来撑起盒子的方法 -->
</div>
</div>
@ -60,17 +81,12 @@ onMounted(async function () {
<el-table class="el-table" :data="allData" style="width: 100%">
<el-table-column prop="name" label="姓名" width="180">
</el-table-column>
<el-table-column prop="age" label="年龄" width="180">
</el-table-column>
<el-table-column prop="address" label="地址">
</el-table-column>
<el-table-column prop="age" label="年龄" width="180"> </el-table-column>
<el-table-column prop="address" label="地址"> </el-table-column>
<el-table-column prop="salary" label="薪资" width="180">
</el-table-column>
<el-table-column prop="date" label="日期" width="180">
</el-table-column>
</el-table>
</div>
</div>
@ -109,8 +125,7 @@ onMounted(async function () {
left: 0%;
}
::v-deep .el-table {
:deep(.el-table) {
width: 100%;
height: 100%;
}
@ -120,6 +135,6 @@ onMounted(async function () {
}
.el-table .el-table__row td {
padding: 0px
padding: 0px;
}
</style>

4949
gold-system/stats.html
File diff suppressed because it is too large
View File

22
gold-system/tsconfig.app.json

@ -1,27 +1,41 @@
{
"compilerOptions": {
"strict": true,
"skipLibCheck": true,
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"noEmitOnError": false,
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"emitDeclarationOnly": false,
"jsx": "preserve",
/* Linting */
"strict": true,
// "strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true,
"noImplicitAny": false
"noImplicitAny": false,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.d.ts",
"src/**/*.vue",
"src/util/http.js"
]
}

3
gold-system/tsconfig.json

@ -3,6 +3,5 @@
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
],
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
]
}

11
gold-system/tsconfig.node.json

@ -5,19 +5,24 @@
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
"composite": true,
"noEmitOnError": false,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"emitDeclarationOnly": false,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
"noUncheckedSideEffectImports": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}

1
gold-system/tsconfig.tsbuildinfo

@ -0,0 +1 @@
{"root":["./src/main.ts","./src/vite-env.d.ts","./src/app.vue","./src/views/index.vue","./src/views/login.vue","./src/views/nopermissionpage.vue","./src/views/z.vue","./src/views/audit/rechargeaudit.vue","./src/views/audit/refundaudit.vue","./src/views/consume/addconsume.vue","./src/views/consume/allconsume.vue","./src/views/goldbeen/addgoldenbeen.vue","./src/views/goldbeen/goldenbeenbalance.vue","./src/views/goldbeen/goldenbeendetail.vue","./src/views/managerecharge/activity.vue","./src/views/managerecharge/rate.vue","./src/views/permissions/index.vue","./src/views/recharge/addrecharge.vue","./src/views/recharge/adminrecharge.vue","./src/views/recharge/allrecharge.vue","./src/views/refund/addrefund.vue","./src/views/refund/allrefund.vue","./src/views/usergold/index.vue","./src/views/usergoldinfo/index.vue","./src/views/workspace/index.vue"],"errors":true,"version":"5.6.3"}

32
gold-system/vite.config.ts

@ -3,6 +3,7 @@ import vue from '@vitejs/plugin-vue'
import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import'
import legacy from '@vitejs/plugin-legacy'
import path from 'path'
import { visualizer } from 'rollup-plugin-visualizer'
// https://vite.dev/config/
export default defineConfig(({ mode }) => {
@ -13,10 +14,16 @@ export default defineConfig(({ mode }) => {
esbuild: {
supported: {
bigint: true
}
},
treeShaking: true
},
plugins: [
vue(),
visualizer({
open: true, // 打包完成后自动展示
gzipSize: true, // 显示gzip压缩后的大小
brotliSize: true // 显示brotli压缩后的大小
}),
legacy({
targets: ['defaults', 'not IE 11', 'chrome >=73'],
modernPolyfills: true
@ -37,6 +44,27 @@ export default defineConfig(({ mode }) => {
'@': path.resolve(__dirname, './src')
}
},
base: process.env.NODE_ENV === 'production' ? './' : '/'
base: process.env.NODE_ENV === 'production' ? './' : '/',
build: {
sourcemap: false, // 关闭 sourcemap
minify: 'terser',
terserOptions: {
compress: {
drop_console: true, // 生产环境去除console
drop_debugger: true // 生产环境去除 debugger
}
},
rollupOptions: {
output: {
manualChunks: {
echarts: ['echarts'],
xlsx: ['xlsx'],
lodash: ['lodash'],
vue: ['vue', 'vue-router', 'pinia'],
elementPlus: ['element-plus']
}
}
}
}
}
})
Loading…
Cancel
Save