From 40ce04761278800f484a7af41efeca4f0cd0f09f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=85=A8=E6=A0=88=E5=B0=8F=E5=AD=A6=E7=94=9F?=
<1518079521@qq.com>
Date: Sat, 20 May 2023 18:44:16 +0800
Subject: [PATCH] admin
---
admin/components.d.ts | 7 +
admin/index.html | 2 +-
admin/package.json | 100 +-
admin/src/api/addon.ts | 35 +
admin/src/api/article.ts | 4 +-
admin/src/api/auth.ts | 12 +-
admin/src/api/diy.ts | 40 +-
admin/src/api/member.ts | 142 ++-
admin/src/api/message.ts | 75 --
admin/src/api/notice.ts | 85 ++
admin/src/api/order.ts | 24 +
admin/src/api/personal.ts | 4 +-
admin/src/api/site.ts | 10 +-
admin/src/api/sys.ts | 99 +-
admin/src/api/tools.ts | 12 +-
admin/src/api/user.ts | 2 +-
admin/src/api/wechat.ts | 4 +-
admin/src/assets/images/back_login.jpg | Bin 0 -> 110321 bytes
admin/src/assets/images/icon-addon.png | Bin 0 -> 673 bytes
.../assets/images/login/login_index_bg.png | Bin 0 -> 1822714 bytes
.../assets/images/login/login_index_left.png | Bin 0 -> 117940 bytes
admin/src/assets/images/site_login.png | Bin 0 -> 10714 bytes
admin/src/components/diy-link/index.vue | 22 +-
admin/src/components/select-icon/index.vue | 10 +-
.../upload-attachment/attachment.vue | 52 +-
admin/src/components/upload-file/index.vue | 4 +-
admin/src/components/verifition/Verify.vue | 434 +++++++++
.../verifition/Verify/VerifyPoints.vue | 260 ++++++
.../verifition/Verify/VerifySlide.vue | 366 ++++++++
admin/src/components/verifition/api/index.js | 31 +
admin/src/components/verifition/utils/ase.js | 11 +
.../src/components/verifition/utils/axios.js | 30 +
admin/src/components/verifition/utils/util.js | 35 +
admin/src/lang/i18n.ts | 1 +
admin/src/lang/index.ts | 2 +-
admin/src/lang/language.ts | 10 +-
admin/src/lang/zh-cn/article.edit.json | 3 +-
admin/src/lang/zh-cn/auth.menu.json | 25 +
admin/src/lang/zh-cn/auth.user.json | 2 +
admin/src/lang/zh-cn/channel.h5.config.json | 1 +
admin/src/lang/zh-cn/channel.pc.config.json | 5 +-
admin/src/lang/zh-cn/common.json | 6 +-
admin/src/lang/zh-cn/finance.cash_out.json | 39 +
admin/src/lang/zh-cn/finance.recharge.json | 6 +-
admin/src/lang/zh-cn/finance.refund.json | 14 +
admin/src/lang/zh-cn/finance.withdrawal.json | 24 -
admin/src/lang/zh-cn/index.json | 21 +-
admin/src/lang/zh-cn/login.json | 7 +-
admin/src/lang/zh-cn/member.balance.json | 7 +-
admin/src/lang/zh-cn/member.commission.json | 24 +
admin/src/lang/zh-cn/member.detail.json | 7 +-
admin/src/lang/zh-cn/member.label.json | 2 +-
admin/src/lang/zh-cn/member.member.json | 10 +-
admin/src/lang/zh-cn/setting.adminlogin.json | 7 +
...cords.json => setting.notice.records.json} | 16 +-
...late.json => setting.notice.template.json} | 6 +-
...ting.pay.json => setting.pay.channel.json} | 17 +-
.../src/lang/zh-cn/setting.pay.transfer.json | 31 +
admin/src/lang/zh-cn/setting.sms.records.json | 32 +
...ting.sms.json => setting.sms.setting.json} | 0
admin/src/lang/zh-cn/site.group.json | 6 +-
admin/src/lang/zh-cn/site.list.json | 6 +-
admin/src/lang/zh-cn/siteindex.json | 4 +-
admin/src/lang/zh-cn/tools.app_store.json | 11 +-
.../{setting.cron.json => tools.cron.json} | 0
admin/src/lang/zh-cn/tools.detection.json | 15 +
admin/src/lang/zh-cn/tools.update.json | 7 +
.../default/components/header/index.vue | 64 +-
admin/src/router/index.ts | 59 +-
admin/src/router/routers.ts | 102 ++-
admin/src/stores/modules/diy.ts | 7 +-
admin/src/stores/modules/user.ts | 17 +-
admin/src/styles/iconfont.css | 46 +-
admin/src/utils/common.ts | 37 +-
admin/src/utils/request.ts | 2 +-
admin/src/utils/storage.ts | 15 +-
admin/src/views/app/index.vue | 63 ++
.../article/components/edit-category.vue | 72 +-
admin/src/views/article/edit.vue | 27 +-
admin/src/views/article/list.vue | 24 +-
admin/src/views/auth/components/edit-menu.vue | 24 +-
admin/src/views/auth/components/edit-role.vue | 14 +-
admin/src/views/auth/components/edit-user.vue | 23 +-
admin/src/views/auth/user.vue | 4 +-
admin/src/views/channel/aliapp/config.vue | 6 +-
admin/src/views/channel/h5/config.vue | 18 +-
admin/src/views/channel/pc/config.vue | 73 +-
admin/src/views/channel/weapp/template.vue | 26 +-
admin/src/views/channel/wechat/config.vue | 4 +-
admin/src/views/channel/wechat/menu.vue | 4 +-
admin/src/views/channel/wechat/template.vue | 26 +-
admin/src/views/diy/edit.vue | 631 ++++++-------
admin/src/views/diy/index.vue | 14 +-
admin/src/views/diy/list.vue | 864 +++++++++---------
admin/src/views/diy/member.vue | 3 -
admin/src/views/error/403.vue | 16 -
admin/src/views/error/404.vue | 53 +-
admin/src/views/error/components/error.vue | 58 --
admin/src/views/finance/cash_out.vue | 332 +++++++
admin/src/views/finance/recharge/list.vue | 53 +-
admin/src/views/finance/withdrawal.vue | 158 ----
admin/src/views/index/index.vue | 108 ++-
admin/src/views/login/index.vue | 199 +++-
admin/src/views/member/balance.vue | 121 ++-
admin/src/views/member/commission.vue | 150 +++
.../views/member/components/edit-member.vue | 43 +-
.../components/member-commission-info.vue | 111 +++
admin/src/views/member/member.vue | 97 +-
admin/src/views/member/member_detail.vue | 60 +-
admin/src/views/order/refund.vue | 139 +++
admin/src/views/setting/adminlogin.vue | 91 ++
admin/src/views/setting/agreement_edit.vue | 6 +-
...cords-info.vue => notice-records-info.vue} | 34 +-
.../{message-sms.vue => notice-sms.vue} | 38 +-
.../{message-weapp.vue => notice-weapp.vue} | 42 +-
.../{message-wechat.vue => notice-wechat.vue} | 54 +-
.../views/setting/components/pay-alipay.vue | 83 +-
.../setting/components/pay-wechatpay.vue | 73 +-
.../src/views/setting/components/sms-ali.vue | 26 +-
.../views/setting/components/sms-tencent.vue | 26 +-
.../views/setting/components/storage-ali.vue | 29 +-
.../setting/components/storage-local.vue | 4 +-
.../setting/components/storage-qiniu.vue | 28 +-
.../setting/components/storage-tencent.vue | 28 +-
.../views/setting/{message.vue => notice.vue} | 74 +-
...message_records.vue => notice_records.vue} | 34 +-
admin/src/views/setting/pay.vue | 244 +++--
admin/src/views/setting/sms.vue | 2 +-
admin/src/views/setting/sms_records.vue | 155 ++++
admin/src/views/setting/transfer.vue | 191 ++++
.../src/views/site/components/edit-group.vue | 15 +-
admin/src/views/site/components/edit-site.vue | 131 +--
admin/src/views/site/group.vue | 2 +-
admin/src/views/site/info.vue | 71 +-
admin/src/views/site/list.vue | 99 +-
admin/src/views/site/user.vue | 15 +-
admin/src/views/tools/app/index.vue | 145 ++-
admin/src/views/tools/code/edit.vue | 514 ++++++-----
admin/src/views/tools/code/index.vue | 1 -
admin/src/views/tools/cron.vue | 147 +++
admin/src/views/tools/detection.vue | 105 +++
admin/src/views/tools/updatecache.vue | 62 ++
admin/vite.config.ts | 2 +-
143 files changed, 6419 insertions(+), 2405 deletions(-)
create mode 100644 admin/src/api/addon.ts
delete mode 100644 admin/src/api/message.ts
create mode 100644 admin/src/api/notice.ts
create mode 100644 admin/src/assets/images/back_login.jpg
create mode 100644 admin/src/assets/images/icon-addon.png
create mode 100644 admin/src/assets/images/login/login_index_bg.png
create mode 100644 admin/src/assets/images/login/login_index_left.png
create mode 100644 admin/src/assets/images/site_login.png
create mode 100644 admin/src/components/verifition/Verify.vue
create mode 100644 admin/src/components/verifition/Verify/VerifyPoints.vue
create mode 100644 admin/src/components/verifition/Verify/VerifySlide.vue
create mode 100644 admin/src/components/verifition/api/index.js
create mode 100644 admin/src/components/verifition/utils/ase.js
create mode 100644 admin/src/components/verifition/utils/axios.js
create mode 100644 admin/src/components/verifition/utils/util.js
create mode 100644 admin/src/lang/zh-cn/auth.menu.json
create mode 100644 admin/src/lang/zh-cn/finance.cash_out.json
create mode 100644 admin/src/lang/zh-cn/finance.refund.json
delete mode 100644 admin/src/lang/zh-cn/finance.withdrawal.json
create mode 100644 admin/src/lang/zh-cn/member.commission.json
create mode 100644 admin/src/lang/zh-cn/setting.adminlogin.json
rename admin/src/lang/zh-cn/{setting.message.records.json => setting.notice.records.json} (73%)
rename admin/src/lang/zh-cn/{setting.message.template.json => setting.notice.template.json} (82%)
rename admin/src/lang/zh-cn/{setting.pay.json => setting.pay.channel.json} (75%)
create mode 100644 admin/src/lang/zh-cn/setting.pay.transfer.json
create mode 100644 admin/src/lang/zh-cn/setting.sms.records.json
rename admin/src/lang/zh-cn/{setting.sms.json => setting.sms.setting.json} (100%)
rename admin/src/lang/zh-cn/{setting.cron.json => tools.cron.json} (100%)
create mode 100644 admin/src/lang/zh-cn/tools.detection.json
create mode 100644 admin/src/lang/zh-cn/tools.update.json
create mode 100644 admin/src/views/app/index.vue
delete mode 100644 admin/src/views/error/403.vue
delete mode 100644 admin/src/views/error/components/error.vue
create mode 100644 admin/src/views/finance/cash_out.vue
delete mode 100644 admin/src/views/finance/withdrawal.vue
create mode 100644 admin/src/views/member/commission.vue
create mode 100644 admin/src/views/member/components/member-commission-info.vue
create mode 100644 admin/src/views/order/refund.vue
create mode 100644 admin/src/views/setting/adminlogin.vue
rename admin/src/views/setting/components/{message-records-info.vue => notice-records-info.vue} (81%)
rename admin/src/views/setting/components/{message-sms.vue => notice-sms.vue} (79%)
rename admin/src/views/setting/components/{message-weapp.vue => notice-weapp.vue} (77%)
rename admin/src/views/setting/components/{message-wechat.vue => notice-wechat.vue} (72%)
rename admin/src/views/setting/{message.vue => notice.vue} (68%)
rename admin/src/views/setting/{message_records.vue => notice_records.vue} (80%)
create mode 100644 admin/src/views/setting/sms_records.vue
create mode 100644 admin/src/views/setting/transfer.vue
create mode 100644 admin/src/views/tools/cron.vue
create mode 100644 admin/src/views/tools/detection.vue
create mode 100644 admin/src/views/tools/updatecache.vue
diff --git a/admin/components.d.ts b/admin/components.d.ts
index 38ab22df0..2909be755 100644
--- a/admin/components.d.ts
+++ b/admin/components.d.ts
@@ -10,6 +10,7 @@ declare module '@vue/runtime-core' {
Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default']
DiyLink: typeof import('./src/components/diy-link/index.vue')['default']
Editor: typeof import('./src/components/editor/index.vue')['default']
+ ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
@@ -17,12 +18,14 @@ declare module '@vue/runtime-core' {
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+ ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
+ ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
@@ -39,10 +42,12 @@ declare module '@vue/runtime-core' {
ElImage: typeof import('element-plus/es')['ElImage']
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
+ ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
+ ElOptionGroup: typeof import('element-plus/es')['ElOptionGroup']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
@@ -58,7 +63,9 @@ declare module '@vue/runtime-core' {
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
+ ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
+ ElTree: typeof import('element-plus/es')['ElTree']
ElUpload: typeof import('element-plus/es')['ElUpload']
Icon: typeof import('./src/components/icon/index.vue')['default']
PopoverInput: typeof import('./src/components/popover-input/index.vue')['default']
diff --git a/admin/index.html b/admin/index.html
index 4a284685b..5ea97a166 100644
--- a/admin/index.html
+++ b/admin/index.html
@@ -4,7 +4,7 @@
-
管理端
+
diff --git a/admin/package.json b/admin/package.json
index c76f11884..baf556113 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -1,51 +1,53 @@
{
- "name": "admin",
- "private": true,
- "version": "1.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview"
- },
- "dependencies": {
- "@element-plus/icons-vue": "^2.0.10",
- "@vueuse/core": "^9.12.0",
- "@wangeditor/editor": "^5.1.23",
- "@wangeditor/editor-for-vue": "^5.1.12",
- "axios": "^1.3.1",
- "css-color-function": "^1.3.3",
- "echarts": "^5.4.1",
- "element-plus": "^2.2.29",
- "nprogress": "^0.2.0",
- "pinia": "^2.0.30",
- "qrcode": "^1.5.1",
- "sass": "^1.58.0",
- "sortablejs": "^1.15.0",
- "vue": "^3.2.45",
- "vue-i18n": "^9.2.2",
- "vue-router": "^4.1.6",
- "vue3-video-play": "^1.3.1-beta.6"
- },
- "devDependencies": {
- "@tailwindcss/line-clamp": "^0.4.2",
- "@types/qrcode": "^1.5.0",
- "@types/sortablejs": "^1.15.0",
- "@typescript-eslint/eslint-plugin": "^5.53.0",
- "@vitejs/plugin-vue": "^4.0.0",
- "autoprefixer": "^10.4.13",
- "eslint": "^8.34.0",
- "eslint-config-standard-with-typescript": "^34.0.0",
- "eslint-plugin-import": "^2.27.5",
- "eslint-plugin-n": "^15.6.1",
- "eslint-plugin-promise": "^6.1.1",
- "eslint-plugin-vue": "^9.9.0",
- "postcss": "^8.4.21",
- "tailwindcss": "^3.2.4",
- "typescript": "^4.9.5",
- "unplugin-auto-import": "^0.13.0",
- "unplugin-vue-components": "^0.23.0",
- "vite": "^4.1.0",
- "vue-tsc": "^1.0.24"
- }
+ "name": "admin",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.0.10",
+ "@vueuse/core": "^9.12.0",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^5.1.12",
+ "axios": "^1.4.0",
+ "crypto-js": "^4.1.1",
+ "css-color-function": "^1.3.3",
+ "echarts": "^5.4.1",
+ "element-plus": "^2.2.29",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.0.30",
+ "qrcode": "^1.5.1",
+ "sass": "^1.58.0",
+ "sortablejs": "^1.15.0",
+ "vue": "^3.2.45",
+ "vue-i18n": "^9.2.2",
+ "vue-router": "^4.1.6",
+ "vue-web-terminal": "^3.1.7",
+ "vue3-video-play": "^1.3.1-beta.6"
+ },
+ "devDependencies": {
+ "@tailwindcss/line-clamp": "^0.4.2",
+ "@types/qrcode": "^1.5.0",
+ "@types/sortablejs": "^1.15.0",
+ "@typescript-eslint/eslint-plugin": "^5.53.0",
+ "@vitejs/plugin-vue": "^4.0.0",
+ "autoprefixer": "^10.4.13",
+ "eslint": "^8.34.0",
+ "eslint-config-standard-with-typescript": "^34.0.0",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-n": "^15.6.1",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-vue": "^9.9.0",
+ "postcss": "^8.4.21",
+ "tailwindcss": "^3.2.4",
+ "typescript": "^4.9.5",
+ "unplugin-auto-import": "^0.13.0",
+ "unplugin-vue-components": "^0.23.0",
+ "vite": "^4.1.0",
+ "vue-tsc": "^1.0.24"
+ }
}
diff --git a/admin/src/api/addon.ts b/admin/src/api/addon.ts
new file mode 100644
index 000000000..6c4b314bf
--- /dev/null
+++ b/admin/src/api/addon.ts
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+/**
+ * 本地下载的插件列表
+ * @returns
+ */
+export function getAddonLocal(params: Record) {
+ return request.get('addon/local', params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 插件详情
+ * @returns
+ */
+export function getAddonDetial(id: number) {
+ return request.get(`addon/${id}`)
+}
+
+/**
+ * 安装插件
+ * @param params
+ * @returns
+ */
+export function installAddon(params: Record) {
+ return request.post(`addon/install/${params.addon}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 卸载插件
+ * @param params
+ * @returns
+ */
+export function uninstallAddon(params: Record) {
+ return request.post(`addon/uninstall/${params.addon}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
\ No newline at end of file
diff --git a/admin/src/api/article.ts b/admin/src/api/article.ts
index 3fbbc88a6..eb7a40896 100644
--- a/admin/src/api/article.ts
+++ b/admin/src/api/article.ts
@@ -35,7 +35,7 @@ export function addArticle(params: Record) {
* @param params
* @returns
*/
-export function updateArticle(params: Record) {
+export function editArticle(params: Record) {
return request.put(`article/article/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -91,7 +91,7 @@ export function addArticleCategory(params: Record) {
* @param params
* @returns
*/
-export function updateArticleCategory(params: Record) {
+export function editArticleCategory(params: Record) {
return request.put(`article/category/${params.category_id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
diff --git a/admin/src/api/auth.ts b/admin/src/api/auth.ts
index d9121948c..be02108ac 100644
--- a/admin/src/api/auth.ts
+++ b/admin/src/api/auth.ts
@@ -5,8 +5,8 @@ import request from '@/utils/request'
* @param params
* @returns
*/
-export function login(params: Record) {
- return request.get('login', { params, showErrorMessage: true })
+export function login(params: Record, app_type: string) {
+ return request.get(`login/${app_type}`, { params, showErrorMessage: true })
}
/**
@@ -23,4 +23,12 @@ export function getAuthMenus() {
*/
export function getSiteInfo() {
return request.get('auth/site')
+}
+
+/**
+ * 获取登录配置信息
+ * @returns
+ */
+export function getLoginConfig() {
+ return request.get('login/config')
}
\ No newline at end of file
diff --git a/admin/src/api/diy.ts b/admin/src/api/diy.ts
index e3c74e628..7d7f901cf 100644
--- a/admin/src/api/diy.ts
+++ b/admin/src/api/diy.ts
@@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns
*/
export function getDiyPageList(params: Record) {
- return request.get(`diy/diy`, {params})
+ return request.get(`diy/diy`, { params })
}
/**
@@ -26,15 +26,15 @@ export function getDiyPageInfo(id: number) {
* @returns
*/
export function addDiyPage(params: Record) {
- return request.post('diy/diy', params, {showErrorMessage: true, showSuccessMessage: true})
+ return request.post('diy/diy', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
* 编辑自定义页面
* @param params
*/
-export function updateDiyPage(params: Record) {
- return request.put(`diy/diy/${params.id}`, params, {showErrorMessage: true, showSuccessMessage: true})
+export function editDiyPage(params: Record) {
+ return request.put(`diy/diy/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
@@ -42,15 +42,15 @@ export function updateDiyPage(params: Record) {
* @param params
*/
export function setUseDiyPage(params: Record) {
- return request.put(`diy/use`, params, {showErrorMessage: true, showSuccessMessage: true})
+ return request.put(`diy/use`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
* 修改自定义页面分享内容
* @param params
*/
-export function updateDiyPageShare(params: Record) {
- return request.put(`diy/diy/share`, params, {showErrorMessage: true, showSuccessMessage: true})
+export function editDiyPageShare(params: Record) {
+ return request.put(`diy/diy/share`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
@@ -59,28 +59,28 @@ export function updateDiyPageShare(params: Record) {
* @returns
*/
export function deleteDiyPage(id: number) {
- return request.delete(`diy/diy/${id}`, {showErrorMessage: true, showSuccessMessage: true})
+ return request.delete(`diy/diy/${id}`, { showErrorMessage: true, showSuccessMessage: true })
}
/**
* 获取自定义页面初始化数据
*/
export function initPage(params: Record) {
- return request.get(`diy/init`, {params})
+ return request.get(`diy/init`, { params })
}
/**
* 获取自定义链接列表
*/
export function getLink(params: Record) {
- return request.get(`diy/link`, {params})
+ return request.get(`diy/link`, { params })
}
/**
* 获取底部导航数据
*/
export function getDiyBottom(params: Record) {
- return request.get(`diy/bottom`, {params})
+ return request.get(`diy/bottom`, { params })
}
/**
@@ -89,14 +89,14 @@ export function getDiyBottom(params: Record) {
* @returns
*/
export function setDiyBottom(params: Record) {
- return request.post('diy/bottom', params, {showErrorMessage: true, showSuccessMessage: true})
+ return request.post('diy/bottom', params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
* 获取页面类型
*/
export function getDiyPageType(params: Record) {
- return request.get(`diy/type`, {params})
+ return request.get(`diy/type`, { params })
}
/**
@@ -105,13 +105,21 @@ export function getDiyPageType(params: Record) {
* @returns
*/
export function getDiyRouteList(params: Record) {
- return request.get(`diy/route`, {params})
+ return request.get(`diy/route`, { params })
+}
+
+/**
+ * 获取自定义路由信息
+ * @param params
+ */
+export function getDiyRouteInfo(params: Record) {
+ return request.get(`diy/route/info`, { params });
}
/**
* 修改路由页面分享内容
* @param params
*/
-export function updateDiyRouteShare(params: Record) {
- return request.put(`diy/route/share`, params, {showErrorMessage: true, showSuccessMessage: true})
+export function editDiyRouteShare(params: Record) {
+ return request.put(`diy/route/share`, params, { showErrorMessage: true, showSuccessMessage: true })
}
\ No newline at end of file
diff --git a/admin/src/api/member.ts b/admin/src/api/member.ts
index 0a2eea448..0c1253468 100644
--- a/admin/src/api/member.ts
+++ b/admin/src/api/member.ts
@@ -9,7 +9,7 @@ import request from '@/utils/request'
* @returns
*/
export function getMemberList(params: Record) {
-return request.get(`member/member`, {params})
+ return request.get(`member/member`, { params })
}
/**
@@ -39,6 +39,15 @@ export function getRegisterType(params: Record) {
return request.get(`member/registertype`, params)
}
+/**
+ * 会员注册渠道
+ * @param params
+ * @returns
+ */
+export function getRegisterChannelType(params: Record) {
+ return request.get(`member/register/channel`, params)
+}
+
/***************************************************** 会员标签 ****************************************************/
@@ -49,7 +58,7 @@ export function getRegisterType(params: Record) {
* @returns
*/
export function getMemberLabelList(params: Record) {
- return request.get(`member/label`, {params})
+ return request.get(`member/label`, { params })
}
/**
@@ -104,20 +113,13 @@ export function getMemberLabelAll() {
* @param params
* @returns
*/
-export function updateMemberDetail(params: Record) {
+export function editMemberDetail(params: Record) {
return request.put(`member/member/modify/${params.member_id}/${params.field}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/***************************************************** 会员零钱 ****************************************************/
-/**
- * 获取会员零钱列表
- * @param params
- * @returns
- */
-export function getMoneyList(params: Record) {
- return request.get(`member/account/money`, {params})
-}
+
/***************************************************** 会员账户 ****************************************************/
@@ -146,7 +148,23 @@ export function getPointList(params: Record) {
*/
export function getBalanceList(params: Record) {
return request.get(`member/account/balance`, { params })
- }
+}
+/**
+ * 获取会员可提现余额列表
+ * @param params
+ * @returns
+ */
+export function getMoneyList(params: Record) {
+ return request.get(`member/account/money`, { params })
+}
+/**
+ * 获取会员佣金列表
+ * @param params
+ * @returns
+ */
+export function getCommissionList(params: Record) {
+ return request.get(`member/account/commission`, { params })
+}
/**
* 会员积分调整
* @param params
@@ -154,7 +172,7 @@ export function getBalanceList(params: Record) {
*/
export function adjustPoint(params: Record) {
return request.post(`member/account/point`, params, { showErrorMessage: true, showSuccessMessage: true })
- }
+}
/**
* 会员余额调整
* @param params
@@ -162,9 +180,9 @@ export function adjustPoint(params: Record) {
*/
export function adjustBalance(params: Record) {
return request.post(`member/account/balance`, params, { showErrorMessage: true, showSuccessMessage: true })
- }
+}
-/***************************************************** 会员相关设置 ****************************************************/
+/***************************************************** 会员相关设置 ****************************************************/
/**
* 获取登录设置
@@ -173,7 +191,7 @@ export function adjustBalance(params: Record) {
*/
export function getLoginConfig(params: Record) {
return request.get(`member/config/login`, params)
- }
+}
/**
* 注册登录设置
* @param params
@@ -183,21 +201,58 @@ export function setLoginConfig(params: Record) {
return request.post(`member/config/login`, params, { showErrorMessage: true, showSuccessMessage: true })
}
+/**
+ * 获取会员转账方式
+ * @param params
+ * @returns
+ */
+export function getTransfertype() {
+ return request.get(`member/cash_out/transfertype`)
+}
+
+/**
+ * 余额统计
+ * @param params
+ * @returns
+ */
+export function getBalanceSum(params: Record) {
+ return request.get(`member/account/sum_balance`, { params })
+}
+
+/**
+ * 余额类型
+ * @param params
+ * @returns
+ */
+export function getBalanceStatus() {
+ return request.get(`member/account/type`)
+}
+
+/**
+ * 获取余额变动类型
+ */
+export function getAccountType(params: Record) {
+ return request.get(`member/account/change_type/${params.account_type}`)
+}
+
+
+/***************************************************** 会员提现 ****************************************************/
+
/**
* 获取提现设置
* @param params
* @returns
*/
export function getWithdrawConfig() {
- return request.get(`member/config/withdraw`)
- }
+ return request.get(`member/config/cash_out`)
+}
/**
* 设置提现设置
* @param params
* @returns
*/
export function setWithdrawConfig(params: Record) {
- return request.post(`member/config/withdraw`, params, { showErrorMessage: true, showSuccessMessage: true })
+ return request.post(`member/config/cash_out`, params, { showErrorMessage: true, showSuccessMessage: true })
}
/**
@@ -206,14 +261,53 @@ export function setWithdrawConfig(params: Record) {
* @returns
*/
export function getWithdrawList(params: Record) {
- return request.get(`member/withdraw`, {params})
+ return request.get(`member/cash_out`, { params })
}
/**
- * 获取会员转账方式
+ * 会员提现详情
+ * @param params
+ * @returns id
+ */
+export function getWithdrawDetail(id: number) {
+ return request.get(`member/cash_out/${id}`, {})
+}
+
+/**
+ * 会员提现审核
+ * @param id
+ * @param params
+ * @returns
+ */
+export function memberAudit(params: Record) {
+ return request.put(`member/cash_out/audit/${params.id}/${params.action}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 会员提现转账
+ * @param id
+ * @param params
+ * @returns
+ */
+export function memberTransfer(params: Record) {
+ return request.put(`member/cash_out/transfer/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 会员状态变更
+ * @param id
* @param params
* @returns
*/
-export function getTransfertype() {
- return request.get(`member/withdraw/transfertype`)
-}
\ No newline at end of file
+export function editMemberStatus(params: Record) {
+ return request.put(`member/setstatus/${params.status}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 会员提现状态
+ * @param params
+ * @returns
+ */
+export function getWithdrawStatusList() {
+ return request.get(`member/cash_out/status`)
+}
diff --git a/admin/src/api/message.ts b/admin/src/api/message.ts
deleted file mode 100644
index a007e0753..000000000
--- a/admin/src/api/message.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import request from '@/utils/request'
-
-/***************************************************** 消息管理 ****************************************************/
-
-/**
- * 消息列表
- * @returns
- */
-export function getMessageList() {
- return request.get('message/message')
-}
-
-/**
- * 消息详情
- * @param params
- * @returns
- */
-export function getMessageInfo(key: string) {
- return request.get(`message/message/${key}`)
-}
-
-/**
- * 消息发送记录
- * @param params
- * @returns
- */
-export function getMessageLog(params: any) {
- return request.get(`message/log`, { params })
-}
-
-
-/**
- * 消息启动与关闭
- * @param params
- * @returns
- */
-export function updateMessageStatus(params: Record) {
- return request.post(`message/message/updatestatus`, params, { showErrorMessage: true, showSuccessMessage: true })
-}
-
-/**
- * 消息修改
- * @param params
- * @returns
- */
-export function updateMessage(params: Record) {
- return request.post(`message/message/update`, params, { showErrorMessage: true, showSuccessMessage: true })
-}
-
-/**
- * 短信配置列表
- * @returns
- */
-export function getSmsList() {
- return request.get('message/message/sms')
-}
-
-/**
- * 短信配置详情
- * @param sms_type
- * @returns
- */
-export function getSmsInfo(sms_type: string) {
- return request.get(`message/message/sms/${sms_type}`,)
-}
-
-/**
- * 短信配置修改
- * @param sms_type
- * @param params
- * @returns
- */
-export function updateSms(params: Record) {
- return request.put(`message/message/sms/${params.sms_type}`, params, { showErrorMessage: true, showSuccessMessage: true })
-}
diff --git a/admin/src/api/notice.ts b/admin/src/api/notice.ts
new file mode 100644
index 000000000..7e8272754
--- /dev/null
+++ b/admin/src/api/notice.ts
@@ -0,0 +1,85 @@
+import request from '@/utils/request'
+
+/***************************************************** 消息管理 ****************************************************/
+
+/**
+ * 消息列表
+ * @returns
+ */
+export function getNoticeList() {
+ return request.get('notice/notice')
+}
+
+/**
+ * 消息详情
+ * @param params
+ * @returns
+ */
+export function getNoticeInfo(key: string) {
+ return request.get(`notice/notice/${key}`)
+}
+
+/**
+ * 消息发送记录
+ * @param params
+ * @returns
+ */
+export function getNoticeLog(params: any) {
+ return request.get(`notice/log`, { params })
+}
+
+
+/**
+ * 消息启动与关闭
+ * @param params
+ * @returns
+ */
+export function editNoticeStatus(params: Record) {
+ return request.post(`notice/notice/editstatus`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 消息修改
+ * @param params
+ * @returns
+ */
+export function editNotice(params: Record) {
+ return request.post(`notice/notice/edit`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 短信配置列表
+ * @returns
+ */
+export function getSmsList() {
+ return request.get('notice/notice/sms')
+}
+
+/**
+ * 短信配置详情
+ * @param sms_type
+ * @returns
+ */
+export function getSmsInfo(sms_type: string) {
+ return request.get(`notice/notice/sms/${sms_type}`,)
+}
+
+/**
+ * 短信配置修改
+ * @param sms_type
+ * @param params
+ * @returns
+ */
+export function editSms(params: Record) {
+ return request.put(`notice/notice/sms/${params.sms_type}`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 短信发送记录
+ * @param sms_type
+ * @param params
+ * @returns
+ */
+export function getSmsLog(params: Record) {
+ return request.put(`notice/sms/log`, params)
+}
diff --git a/admin/src/api/order.ts b/admin/src/api/order.ts
index b3f34d59a..cfb7f0bc5 100644
--- a/admin/src/api/order.ts
+++ b/admin/src/api/order.ts
@@ -27,3 +27,27 @@ export function getRechargeOrderInfo(order_id: number) {
export function getRechargeOrderStatusList() {
return request.get(`order/recharge/status`)
}
+
+/**
+ * 获取退款记录
+ * @returns
+ */
+export function getRefund(params: Record) {
+ return request.get(`refund/refund`, { params })
+}
+
+/**
+ * 获取退款状态
+ * @returns
+ */
+export function getRefundStatus() {
+ return request.get(`refund/status`)
+}
+
+/**
+* 充值订单发起退款
+ * @returns
+ */
+export function rechargeRefund(id) {
+ return request.get(`order/recharge/refund/${id}`);
+}
\ No newline at end of file
diff --git a/admin/src/api/personal.ts b/admin/src/api/personal.ts
index 613bd0f79..767615f77 100644
--- a/admin/src/api/personal.ts
+++ b/admin/src/api/personal.ts
@@ -4,7 +4,7 @@ import request from '@/utils/request'
* 获取支付设置
* @returns
*/
-export function getUserInfo(type:string) {
+export function getUserInfo(type: string) {
return request.get(`auth/get`)
}
@@ -13,6 +13,6 @@ export function getUserInfo(type:string) {
* @returns
*/
export function setUserInfo(params: Record) {
- return request.put(`auth/update`, params, { showErrorMessage: true, showSuccessMessage: true });
+ return request.put(`auth/edit`, params, { showErrorMessage: true, showSuccessMessage: true });
}
diff --git a/admin/src/api/site.ts b/admin/src/api/site.ts
index 4e9edc579..fe8cb46e3 100644
--- a/admin/src/api/site.ts
+++ b/admin/src/api/site.ts
@@ -10,7 +10,7 @@ import request from '@/utils/request'
* @returns
*/
export function getSiteList(params: Record) {
- return request.get(`site/site`, {params})
+ return request.get(`site/site`, { params })
}
/**
@@ -37,7 +37,7 @@ export function addSite(params: Record) {
* @param params
* @returns
*/
-export function updateSite(params: Record) {
+export function editSite(params: Record) {
return request.put(`site/site/${params.site_id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -59,7 +59,7 @@ export function getStatusList() {
* @returns
*/
export function getSiteGroupList(params: Record) {
- return request.get(`site/group`, {params})
+ return request.get(`site/group`, { params })
}
/**
@@ -86,7 +86,7 @@ export function addSiteGroup(params: Record) {
* @param params
* @returns
*/
-export function updateSiteGroup(params: Record) {
+export function editSiteGroup(params: Record) {
return request.put(`site/group/${params.group_id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -144,7 +144,7 @@ export function addUser(params: Record) {
* @param params
* @returns
*/
-export function updateUser(params: Record) {
+export function editUser(params: Record) {
return request.put(`site/user/${params.uid}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
diff --git a/admin/src/api/sys.ts b/admin/src/api/sys.ts
index 50e6fd379..e9c3dfc7d 100644
--- a/admin/src/api/sys.ts
+++ b/admin/src/api/sys.ts
@@ -9,6 +9,14 @@ import request from '@/utils/request'
export function getInfo() {
return request.get('sys/role')
}
+
+/**
+ * 系统信息
+ * @returns
+ */
+export function getUrl() {
+ return request.get('sys/url')
+}
/***************************************************** 用户组 ****************************************************/
/**
@@ -43,7 +51,7 @@ export function addRole(params: Record) {
* @param params
* @returns
*/
-export function updateRole(params: Record) {
+export function editRole(params: Record) {
return request.put(`sys/role/${params.role_id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -70,7 +78,7 @@ export function allRole() {
* 获取全部菜单
* @returns
*/
-export function getMenus(type:string) {
+export function getMenus(type: string) {
return request.get(`sys/menu/${type}`)
}
@@ -98,7 +106,7 @@ export function addMenu(params: Record) {
* @param params
* @returns
*/
-export function updateMenu(params: Record) {
+export function editMenu(params: Record) {
return request.put(`sys/menu/${params.menu_key}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -180,7 +188,7 @@ export function addAttachmentCategory(params: Record) {
* @param params
* @returns
*/
-export function updateAttachmentCategory(params: Record) {
+export function editAttachmentCategory(params: Record) {
return request.put(`sys/attachment/category/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -208,7 +216,7 @@ export function getAttachmentList(params: Record) {
* @returns
*/
export function deleteAttachment(params: Record) {
- return request.delete(`sys/attachment/del`, { data: params, showErrorMessage: true, showSuccessMessage: true})
+ return request.delete(`sys/attachment/del`, { data: params, showErrorMessage: true, showSuccessMessage: true })
}
/**
@@ -266,7 +274,7 @@ export function getStorageInfo(type: string) {
* @param params
* @returns
*/
-export function updateStorage(params: Record) {
+export function editStorage(params: Record) {
return request.put(`sys/storage/${params.storage_type}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -276,7 +284,7 @@ export function updateStorage(params: Record) {
* 获取支付设置
* @returns
*/
-export function getPayConfig(type:string) {
+export function getPayConfig(type: string) {
return request.get(`pay/config/${type}`)
}
@@ -296,13 +304,31 @@ export function getPayList() {
return request.get(`pay/lists`)
}
+/***************************************************** 打款设置 ****************************************************/
+/**
+ * 获取打款设置配置
+ * @returns channel 渠道
+ * @returns
+ */
+export function getTransferInfo(channel) {
+ return request.get(`pay/channel/lists/${channel}`)
+}
+
+/**
+ * 设置打款配置
+ * @param params
+ * @returns
+ */
+export function setTransferInfo(params: Record) {
+ return request.post(`pay/channel/set/transfer`, params)
+}
/***************************************************** 定时任务 ****************************************************/
/**
* 获取任务列表
* @returns
*/
-export function getCronList(params:any) {
+export function getCronList(params: any) {
return request.get(`sys/cron`, { params })
}
@@ -310,7 +336,7 @@ export function getCronList(params:any) {
* 任务详情
* @returns
*/
-export function getCronInfo(id:string) {
+export function getCronInfo(id: string) {
return request.get(`sys/cron/${id}`);
}
@@ -336,7 +362,7 @@ export function getAgreementList() {
* 协议详情
* @returns
*/
-export function getAgreementInfo(key:string) {
+export function getAgreementInfo(key: string) {
return request.get(`sys/agreement/${key}`);
}
@@ -344,7 +370,7 @@ export function getAgreementInfo(key:string) {
* 更新协议
* @returns
*/
-export function updateAgreement(params: Record) {
+export function editAgreement(params: Record) {
return request.put(`sys/agreement/${params.key}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -365,3 +391,54 @@ export function getSceneDomain() {
return request.get(`sys/scene_domain`);
}
+/***************************************************** 登录注册配置 ****************************************************/
+
+/**
+ * 管理端登录注册配置
+ * @param params
+ * @returns
+ */
+export function getConfigLogin() {
+ return request.get(`sys/config/login`)
+}
+
+/**
+ * 设置管理端登录注册配置
+ * @param params
+ * @returns
+ */
+export function setConfigLogin(params: Record) {
+ return request.put(`sys/config/login`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+/**
+ * 获取支付设置
+ */
+export function getPayConfigList() {
+ return request.get(`pay/channel/lists`)
+}
+
+/**
+ * 设置支付配置
+ */
+export function setPatConfig(params: Record) {
+ return request.post(`pay/channel/set/all`, params, { showErrorMessage: true, showSuccessMessage: true })
+}
+
+
+/***************************************************** 刷新菜单 ****************************************************/
+/**
+ * 刷新菜单
+ */
+export function menuRefresh(params: Record) {
+ return request.post(`sys/menu/refresh`,{},{ showErrorMessage: true, showSuccessMessage: true })
+}
+
+/***************************************************** 获取应用 ****************************************************/
+/**
+ * 获取应用
+ */
+export function getAppMange() {
+ return request.get(`sys/applist`)
+}
+
diff --git a/admin/src/api/tools.ts b/admin/src/api/tools.ts
index 57bb5df5a..e40c23032 100644
--- a/admin/src/api/tools.ts
+++ b/admin/src/api/tools.ts
@@ -8,7 +8,7 @@ import request from '@/utils/request'
* @returns
*/
export function getGenerateTableList(params: Record) {
- return request.get(`generator/generator`, {params})
+ return request.get(`generator/generator`, { params })
}
/**
@@ -35,7 +35,7 @@ export function addGenerateTable(params: Record) {
* @param params
* @returns
*/
-export function updateGenerateTable(params: Record) {
+export function editGenerateTable(params: Record) {
return request.put(`generator/generator/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -66,3 +66,11 @@ export function generateTable() {
return request.get(`generator/table`)
}
+/**
+ * 获取服务器环境配置
+ * @param file
+ * @returns
+ */
+export function getSystem() {
+ return request.get(`sys/system`)
+}
diff --git a/admin/src/api/user.ts b/admin/src/api/user.ts
index 997d4ce2a..8a5a57825 100644
--- a/admin/src/api/user.ts
+++ b/admin/src/api/user.ts
@@ -37,7 +37,7 @@ export function addUser(params: Record) {
* @param params
* @returns
*/
-export function updateUser(params: Record) {
+export function editUser(params: Record) {
return request.put(`user/user/${params.uid}`, params, { showErrorMessage: true, showSuccessMessage: true })
}
diff --git a/admin/src/api/wechat.ts b/admin/src/api/wechat.ts
index 34798f8bc..d642c7c83 100644
--- a/admin/src/api/wechat.ts
+++ b/admin/src/api/wechat.ts
@@ -22,7 +22,7 @@ export function getWechatStatic() {
* @param params
* @returns
*/
-export function updateWechatConfig(params: Record) {
+export function editWechatConfig(params: Record) {
return request.put('wechat/config', params, { showErrorMessage: true, showSuccessMessage: true })
}
@@ -39,7 +39,7 @@ export function getWechatMenu() {
* @param params
* @returns
*/
-export function updateWechatMenu(params: Record) {
+export function editWechatMenu(params: Record) {
return request.put('wechat/menu', params, { showErrorMessage: true, showSuccessMessage: true })
}
diff --git a/admin/src/assets/images/back_login.jpg b/admin/src/assets/images/back_login.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..bc50300becd44b8a5f5d5007058bf0eb2e266c72
GIT binary patch
literal 110321
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