index.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <div class="app-container">
  3. <el-card v-loading="loading" shadow="never">
  4. <div slot="header">
  5. <span>OSS云存储配置</span>
  6. </div>
  7. <el-form ref="form" :model="form" label-width="200px">
  8. <el-form-item label="类型" prop="type">
  9. <el-radio-group v-model="form.type">
  10. <el-radio :label="1">七牛云</el-radio>
  11. <el-radio :label="2">阿里云</el-radio>
  12. <el-radio :label="3">腾讯云</el-radio>
  13. <el-radio :label="4">华为云</el-radio>
  14. </el-radio-group>
  15. </el-form-item>
  16. <!-- 七牛云 -->
  17. <template v-if="form.type === 1">
  18. <el-card shadow="never" class="section-card">
  19. <div slot="header"><span>七牛云配置</span></div>
  20. <el-form-item label="七牛绑定的域名" prop="qiniuDomain">
  21. <el-input v-model="form.qiniuDomain" placeholder="请输入七牛绑定的域名"></el-input>
  22. </el-form-item>
  23. <el-form-item label="七牛路径前缀" prop="qiniuPrefix">
  24. <el-input v-model="form.qiniuPrefix" placeholder="请输入七牛路径前缀"></el-input>
  25. </el-form-item>
  26. <el-form-item label="七牛ACCESS_KEY" prop="qiniuAccessKey">
  27. <el-input v-model="form.qiniuAccessKey" placeholder="请输入七牛ACCESS_KEY"></el-input>
  28. </el-form-item>
  29. <el-form-item label="七牛SecretKey" prop="qiniuSecretKey">
  30. <el-input v-model="form.qiniuSecretKey" placeholder="请输入七牛SecretKey"></el-input>
  31. </el-form-item>
  32. <el-form-item label="七牛空间名" prop="qiniuBucketName">
  33. <el-input v-model="form.qiniuBucketName" placeholder="请输入七牛空间名"></el-input>
  34. </el-form-item>
  35. </el-card>
  36. </template>
  37. <!-- 阿里云 -->
  38. <template v-if="form.type === 2">
  39. <el-card shadow="never" class="section-card">
  40. <div slot="header"><span>阿里云配置</span></div>
  41. <el-form-item label="阿里云绑定的域名" prop="aliyunDomain">
  42. <el-input v-model="form.aliyunDomain" placeholder="请输入阿里云绑定的域名"></el-input>
  43. </el-form-item>
  44. <el-form-item label="阿里云路径前缀" prop="aliyunPrefix">
  45. <el-input v-model="form.aliyunPrefix" placeholder="请输入阿里云路径前缀"></el-input>
  46. </el-form-item>
  47. <el-form-item label="阿里云EndPoint" prop="aliyunEndPoint">
  48. <el-input v-model="form.aliyunEndPoint" placeholder="请输入阿里云EndPoint"></el-input>
  49. </el-form-item>
  50. <el-form-item label="阿里云AccessKeyId" prop="aliyunAccessKeyId">
  51. <el-input v-model="form.aliyunAccessKeyId" placeholder="请输入阿里云AccessKeyId"></el-input>
  52. </el-form-item>
  53. <el-form-item label="阿里云AccessKeySecret" prop="aliyunAccessKeySecret">
  54. <el-input v-model="form.aliyunAccessKeySecret" placeholder="请输入阿里云AccessKeySecret"></el-input>
  55. </el-form-item>
  56. <el-form-item label="阿里云BucketName" prop="aliyunBucketName">
  57. <el-input v-model="form.aliyunBucketName" placeholder="请输入阿里云BucketName"></el-input>
  58. </el-form-item>
  59. </el-card>
  60. </template>
  61. <!-- 腾讯云 -->
  62. <template v-if="form.type === 3">
  63. <el-card shadow="never" class="section-card">
  64. <div slot="header"><span>腾讯云配置</span></div>
  65. <el-form-item label="腾讯云绑定的域名" prop="qcloudDomain">
  66. <el-input v-model="form.qcloudDomain" placeholder="请输入腾讯云绑定的域名"></el-input>
  67. </el-form-item>
  68. <el-form-item label="腾讯云前缀" prop="qcloudPrefix">
  69. <el-input v-model="form.qcloudPrefix" placeholder="请输入腾讯云前缀"></el-input>
  70. </el-form-item>
  71. <el-form-item label="腾讯云SecretId" prop="qcloudSecretId">
  72. <el-input v-model="form.qcloudSecretId" placeholder="请输入腾讯云SecretId"></el-input>
  73. </el-form-item>
  74. <el-form-item label="腾讯云SecretKey" prop="qcloudSecretKey">
  75. <el-input v-model="form.qcloudSecretKey" placeholder="请输入腾讯云SecretKey"></el-input>
  76. </el-form-item>
  77. <el-form-item label="腾讯云BucketName" prop="qcloudBucketName">
  78. <el-input v-model="form.qcloudBucketName" placeholder="请输入腾讯云BucketName"></el-input>
  79. </el-form-item>
  80. <el-form-item label="所属地区" prop="qcloudRegion">
  81. <el-input v-model="form.qcloudRegion" placeholder="请输入所属地区"></el-input>
  82. </el-form-item>
  83. </el-card>
  84. </template>
  85. <!-- 华为云 -->
  86. <template v-if="form.type === 4">
  87. <el-card shadow="never" class="section-card">
  88. <div slot="header"><span>华为云配置</span></div>
  89. <el-form-item label="华为云绑定的域名" prop="huaweiDomain">
  90. <el-input v-model="form.huaweiDomain" placeholder="请输入华为云绑定的域名"></el-input>
  91. </el-form-item>
  92. <el-form-item label="华为云Endpoint" prop="huaweiEndpoint">
  93. <el-input v-model="form.huaweiEndpoint" placeholder="请输入华为云Endpoint"></el-input>
  94. </el-form-item>
  95. <el-form-item label="华为云AK" prop="huaweiAK">
  96. <el-input v-model="form.huaweiAK" placeholder="请输入华为云AK"></el-input>
  97. </el-form-item>
  98. <el-form-item label="华为云SK" prop="huaweiSK">
  99. <el-input v-model="form.huaweiSK" placeholder="请输入华为云SK"></el-input>
  100. </el-form-item>
  101. <el-form-item label="华为云BucketName" prop="huaweiBucketName">
  102. <el-input v-model="form.huaweiBucketName" placeholder="请输入华为云BucketName"></el-input>
  103. </el-form-item>
  104. </el-card>
  105. </template>
  106. <div class="footer">
  107. <el-button type="primary" :loading="submitLoading" @click="submitForm">提 交</el-button>
  108. </div>
  109. </el-form>
  110. </el-card>
  111. </div>
  112. </template>
  113. <script>
  114. import { getConfigByKey, updateConfigByKey } from '@/api/system/config'
  115. export default {
  116. name: 'AdminOssConfig',
  117. data() {
  118. return {
  119. loading: false,
  120. submitLoading: false,
  121. configId: null,
  122. configKey: 'sys.oss.cloudStorage',
  123. form: {
  124. type: 1,
  125. // 七牛云
  126. qiniuDomain: '',
  127. qiniuPrefix: '',
  128. qiniuAccessKey: '',
  129. qiniuSecretKey: '',
  130. qiniuBucketName: '',
  131. // 阿里云
  132. aliyunDomain: '',
  133. aliyunPrefix: '',
  134. aliyunEndPoint: '',
  135. aliyunAccessKeyId: '',
  136. aliyunAccessKeySecret: '',
  137. aliyunBucketName: '',
  138. // 腾讯云
  139. qcloudDomain: '',
  140. qcloudPrefix: '',
  141. qcloudSecretId: '',
  142. qcloudSecretKey: '',
  143. qcloudBucketName: '',
  144. qcloudRegion: '',
  145. // 华为云
  146. huaweiDomain: '',
  147. huaweiEndpoint: '',
  148. huaweiAK: '',
  149. huaweiSK: '',
  150. huaweiBucketName: ''
  151. }
  152. }
  153. },
  154. created() {
  155. this.loadConfig()
  156. },
  157. methods: {
  158. loadConfig() {
  159. this.loading = true
  160. getConfigByKey(this.configKey).then(response => {
  161. const configValue = response && response.data ? response.data.configValue : null
  162. if (response.data) {
  163. this.configId = response.data.configId
  164. } else {
  165. this.configId = null
  166. }
  167. // 安全解析
  168. if (configValue !== null && configValue !== undefined && configValue !== '' && configValue !== 'null') {
  169. try {
  170. const parsed = JSON.parse(configValue)
  171. if (parsed !== null && parsed !== undefined) {
  172. this.form = { ...this.form, ...parsed }
  173. }
  174. } catch (e) {
  175. // 使用默认值
  176. }
  177. }
  178. }).finally(() => {
  179. this.loading = false
  180. })
  181. },
  182. submitForm() {
  183. this.$refs['form'].validate(valid => {
  184. if (valid) {
  185. this.submitLoading = true
  186. const param = {
  187. configId: this.configId,
  188. configValue: JSON.stringify(this.form)
  189. }
  190. updateConfigByKey(param).then(response => {
  191. if (response.code === 200) {
  192. this.msgSuccess('修改成功')
  193. }
  194. }).finally(() => {
  195. this.submitLoading = false
  196. })
  197. }
  198. })
  199. }
  200. }
  201. }
  202. </script>
  203. <style scoped>
  204. .section-card {
  205. margin-bottom: 20px;
  206. }
  207. .footer {
  208. width: 100%;
  209. display: flex;
  210. margin-top: 30px;
  211. align-items: flex-end;
  212. justify-content: flex-end;
  213. }
  214. </style>