宇恒一号官网
This commit is contained in:
121
admin/src/views/settings/PaymentConfig.vue
Normal file
121
admin/src/views/settings/PaymentConfig.vue
Normal file
@@ -0,0 +1,121 @@
|
||||
<template>
|
||||
<div class="payment-config">
|
||||
<el-card>
|
||||
<template #header>
|
||||
<span>支付配置</span>
|
||||
</template>
|
||||
<el-form
|
||||
v-if="canManage"
|
||||
ref="formRef"
|
||||
label-width="140px"
|
||||
style="max-width: 640px"
|
||||
>
|
||||
<el-divider content-position="left">微信支付</el-divider>
|
||||
<el-form-item label="AppID">
|
||||
<el-input v-model="form.wechat.app_id" placeholder="微信应用 AppID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="商户号">
|
||||
<el-input v-model="form.wechat.mch_id" placeholder="商户号 MchID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="API 密钥">
|
||||
<el-input v-model="form.wechat.api_key" type="password" placeholder="API 密钥(v2)" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="APIv3 密钥">
|
||||
<el-input v-model="form.wechat.api_key_v3" type="password" placeholder="APIv3 密钥(可选)" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="启用">
|
||||
<el-switch v-model="form.wechat.enabled" />
|
||||
</el-form-item>
|
||||
|
||||
<el-divider content-position="left">支付宝</el-divider>
|
||||
<el-form-item label="AppID">
|
||||
<el-input v-model="form.alipay.app_id" placeholder="支付宝应用 AppID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="应用私钥">
|
||||
<el-input v-model="form.alipay.private_key" type="textarea" :rows="3" placeholder="应用私钥(支持多行)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="支付宝公钥">
|
||||
<el-input v-model="form.alipay.alipay_public_key" type="textarea" :rows="3" placeholder="支付宝公钥(支持多行)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="启用">
|
||||
<el-switch v-model="form.alipay.enabled" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="handleSave">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, computed } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getPaymentConfig, updatePaymentConfig } from '../../api/admin'
|
||||
import { useAuthStore } from '../../stores/auth'
|
||||
|
||||
const authStore = useAuthStore()
|
||||
const formRef = ref(null)
|
||||
const loading = ref(false)
|
||||
|
||||
const form = reactive({
|
||||
wechat: {
|
||||
app_id: '',
|
||||
mch_id: '',
|
||||
api_key: '',
|
||||
api_key_v3: '',
|
||||
enabled: false
|
||||
},
|
||||
alipay: {
|
||||
app_id: '',
|
||||
private_key: '',
|
||||
alipay_public_key: '',
|
||||
enabled: false
|
||||
}
|
||||
})
|
||||
|
||||
const canManage = computed(() => {
|
||||
const user = authStore.getUser()
|
||||
if (!user) return false
|
||||
return user.role_id === 9527 && user.role === 'admin'
|
||||
})
|
||||
|
||||
const fetchConfig = async () => {
|
||||
if (!canManage.value) return
|
||||
try {
|
||||
const res = await getPaymentConfig()
|
||||
if (res.wechat) {
|
||||
form.wechat = { ...form.wechat, ...res.wechat }
|
||||
}
|
||||
if (res.alipay) {
|
||||
form.alipay = { ...form.alipay, ...res.alipay }
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error(e.message || '获取配置失败')
|
||||
}
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
await updatePaymentConfig({
|
||||
wechat: form.wechat,
|
||||
alipay: form.alipay
|
||||
})
|
||||
ElMessage.success('保存成功')
|
||||
} catch (e) {
|
||||
ElMessage.error(e.response?.data?.error || e.message || '保存失败')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(fetchConfig)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.payment-config {
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
102
admin/src/views/settings/RolePermissions.vue
Normal file
102
admin/src/views/settings/RolePermissions.vue
Normal file
@@ -0,0 +1,102 @@
|
||||
<template>
|
||||
<div class="role-permissions">
|
||||
<el-card>
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span>角色权限管理</span>
|
||||
<el-button type="primary" :loading="saving" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<p class="tip">超级管理员(9527)拥有全部权限且不可修改。为其他角色勾选其可用的后台权限。</p>
|
||||
<el-table v-loading="loading" :data="list" border stripe>
|
||||
<el-table-column prop="role_name" label="角色" width="140" />
|
||||
<el-table-column prop="role_id" label="role_id" width="100" />
|
||||
<el-table-column label="权限">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.role_id === 9527" class="perm-all">(全部权限,不可修改)</span>
|
||||
<div v-else class="perm-checkboxes">
|
||||
<el-checkbox
|
||||
v-for="p in allPermissions"
|
||||
:key="p.key"
|
||||
v-model="row._checked[p.key]"
|
||||
style="margin-right: 16px; margin-bottom: 8px"
|
||||
>
|
||||
{{ p.name }}
|
||||
</el-checkbox>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getRolePermissionsList, updateRolePermissions } from '../../api/admin'
|
||||
|
||||
const list = ref([])
|
||||
const allPermissions = ref([])
|
||||
const loading = ref(false)
|
||||
const saving = ref(false)
|
||||
|
||||
function buildChecked(permissions) {
|
||||
const o = {}
|
||||
allPermissions.value.forEach((p) => {
|
||||
o[p.key] = permissions.includes(p.key)
|
||||
})
|
||||
return o
|
||||
}
|
||||
|
||||
const fetchList = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
const res = await getRolePermissionsList()
|
||||
allPermissions.value = res.all_permissions || []
|
||||
list.value = (res.list || []).map((r) => ({
|
||||
...r,
|
||||
_checked: buildChecked(r.permissions || [])
|
||||
}))
|
||||
} catch (e) {
|
||||
ElMessage.error(e.message)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
saving.value = true
|
||||
try {
|
||||
for (const row of list.value) {
|
||||
if (row.role_id === 9527) continue
|
||||
const permissions = allPermissions.value.filter((p) => row._checked[p.key]).map((p) => p.key)
|
||||
await updateRolePermissions(row.role_id, { permissions })
|
||||
}
|
||||
ElMessage.success('保存成功')
|
||||
} catch (e) {
|
||||
ElMessage.error(e.response?.data?.error || e.message)
|
||||
} finally {
|
||||
saving.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(fetchList)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.card-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.tip {
|
||||
color: #666;
|
||||
font-size: 13px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.perm-checkboxes {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
</style>
|
||||
102
admin/src/views/settings/SMSConfig.vue
Normal file
102
admin/src/views/settings/SMSConfig.vue
Normal file
@@ -0,0 +1,102 @@
|
||||
<template>
|
||||
<div class="sms-config">
|
||||
<el-card>
|
||||
<template #header>
|
||||
<span>短信平台配置</span>
|
||||
</template>
|
||||
<el-form
|
||||
v-if="isSuperUser"
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
label-width="120px"
|
||||
style="max-width: 600px"
|
||||
>
|
||||
<el-form-item label="服务商">
|
||||
<el-select v-model="form.provider" placeholder="请选择">
|
||||
<el-option label="阿里云" value="aliyun" />
|
||||
<el-option label="腾讯云" value="tencent" />
|
||||
<el-option label="其他" value="other" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="AccessKey">
|
||||
<el-input v-model="form.access_key" placeholder="AccessKey" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="SecretKey">
|
||||
<el-input v-model="form.secret_key" placeholder="SecretKey" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="签名">
|
||||
<el-input v-model="form.sign_name" placeholder="短信签名" />
|
||||
</el-form-item>
|
||||
<el-form-item label="模板ID">
|
||||
<el-input v-model="form.template_id" placeholder="验证码模板ID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="启用">
|
||||
<el-switch v-model="form.enabled" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="handleSave">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, computed } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getSMSConfig, updateSMSConfig } from '../../api/admin'
|
||||
import { useAuthStore } from '../../stores/auth'
|
||||
|
||||
const authStore = useAuthStore()
|
||||
const formRef = ref(null)
|
||||
const loading = ref(false)
|
||||
|
||||
const form = reactive({
|
||||
provider: '',
|
||||
access_key: '',
|
||||
secret_key: '',
|
||||
sign_name: '',
|
||||
template_id: '',
|
||||
enabled: false
|
||||
})
|
||||
|
||||
const isSuperUser = computed(() => {
|
||||
const user = authStore.getUser()
|
||||
if (!user) return false
|
||||
return user.role_id === 9527 && user.role === 'admin'
|
||||
})
|
||||
|
||||
const fetchConfig = async () => {
|
||||
if (!isSuperUser.value) return
|
||||
try {
|
||||
const res = await getSMSConfig()
|
||||
Object.assign(form, res)
|
||||
} catch (e) {
|
||||
if (e.response?.status === 403) {
|
||||
ElMessage.warning('仅超级用户可配置')
|
||||
} else {
|
||||
ElMessage.error(e.message || '获取配置失败')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
await updateSMSConfig(form)
|
||||
ElMessage.success('保存成功')
|
||||
} catch (e) {
|
||||
ElMessage.error(e.response?.data?.error || e.message || '保存失败')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(fetchConfig)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.sms-config {
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user