config.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true">
  7. <el-form-item label="配置key" prop="configKey">
  8. <el-input v-model="queryParams.configKey" placeholder="配置key" clearable @keyup.enter="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="桶名称" prop="bucketName">
  11. <el-input v-model="queryParams.bucketName" placeholder="请输入桶名称" clearable @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="是否默认" prop="status">
  14. <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
  15. <el-option key="0" label="是" value="0" />
  16. <el-option key="1" label="否" value="1" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button type="primary" icon="search" @click="handleQuery">搜索</el-button>
  21. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  22. </el-form-item>
  23. </el-form>
  24. </el-card>
  25. </div>
  26. </transition>
  27. <el-card shadow="hover">
  28. <template #header>
  29. <el-row :gutter="10" class="mb8">
  30. <el-col :span="1.5">
  31. <el-button v-hasPermi="['system:ossConfig:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
  32. </el-col>
  33. <el-col :span="1.5">
  34. <el-button v-hasPermi="['system:ossConfig:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
  35. >修改</el-button
  36. >
  37. </el-col>
  38. <el-col :span="1.5">
  39. <el-button v-hasPermi="['system:ossConfig:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
  40. 删除
  41. </el-button>
  42. </el-col>
  43. <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
  44. </el-row>
  45. </template>
  46. <el-table v-loading="loading" border :data="ossConfigList" @selection-change="handleSelectionChange">
  47. <el-table-column type="selection" width="55" align="center" />
  48. <el-table-column v-if="columns[0].visible" label="主建" align="center" prop="ossConfigId" />
  49. <el-table-column v-if="columns[1].visible" label="配置key" align="center" prop="configKey" />
  50. <el-table-column v-if="columns[2].visible" label="访问站点" align="center" prop="endpoint" width="200" />
  51. <el-table-column v-if="columns[3].visible" label="自定义域名" align="center" prop="domain" width="200" />
  52. <el-table-column v-if="columns[4].visible" label="桶名称" align="center" prop="bucketName" />
  53. <el-table-column v-if="columns[5].visible" label="前缀" align="center" prop="prefix" />
  54. <el-table-column v-if="columns[6].visible" label="域" align="center" prop="region" />
  55. <el-table-column v-if="columns[7].visible" label="桶权限类型" align="center" prop="accessPolicy">
  56. <template #default="scope">
  57. <el-tag v-if="scope.row.accessPolicy === '0'" type="warning">private</el-tag>
  58. <el-tag v-if="scope.row.accessPolicy === '1'" type="success">public</el-tag>
  59. <el-tag v-if="scope.row.accessPolicy === '2'" type="info">custom</el-tag>
  60. </template>
  61. </el-table-column>
  62. <el-table-column v-if="columns[8].visible" label="是否默认" align="center" prop="status">
  63. <template #default="scope">
  64. <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
  65. </template>
  66. </el-table-column>
  67. <el-table-column label="操作" fixed="right" align="center" width="150" class-name="small-padding">
  68. <template #default="scope">
  69. <el-tooltip content="修改" placement="top">
  70. <el-button v-hasPermi="['system:ossConfig:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
  71. </el-tooltip>
  72. <el-tooltip content="删除" placement="top">
  73. <el-button v-hasPermi="['system:ossConfig:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
  74. </el-tooltip>
  75. </template>
  76. </el-table-column>
  77. </el-table>
  78. <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
  79. </el-card>
  80. <!-- 添加或修改对象存储配置对话框 -->
  81. <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" append-to-body>
  82. <el-form ref="ossConfigFormRef" :model="form" :rules="rules" label-width="120px">
  83. <el-form-item label="配置key" prop="configKey">
  84. <el-input v-model="form.configKey" placeholder="请输入配置key" />
  85. </el-form-item>
  86. <el-form-item label="访问站点" prop="endpoint">
  87. <el-input v-model="form.endpoint" placeholder="请输入访问站点">
  88. <template #prefix>
  89. <span style="color: #999">{{ protocol }}</span>
  90. </template>
  91. </el-input>
  92. </el-form-item>
  93. <el-form-item label="自定义域名" prop="domain">
  94. <el-input v-model="form.domain" placeholder="请输入自定义域名">
  95. <template #prefix>
  96. <span style="color: #999">{{ protocol }}</span>
  97. </template>
  98. </el-input>
  99. </el-form-item>
  100. <el-form-item label="accessKey" prop="accessKey">
  101. <el-input v-model="form.accessKey" placeholder="请输入accessKey" />
  102. </el-form-item>
  103. <el-form-item label="secretKey" prop="secretKey">
  104. <el-input v-model="form.secretKey" placeholder="请输入秘钥" show-password />
  105. </el-form-item>
  106. <el-form-item label="桶名称" prop="bucketName">
  107. <el-input v-model="form.bucketName" placeholder="请输入桶名称" />
  108. </el-form-item>
  109. <el-form-item label="前缀" prop="prefix">
  110. <el-input v-model="form.prefix" placeholder="请输入前缀" />
  111. </el-form-item>
  112. <el-form-item label="是否HTTPS">
  113. <el-radio-group v-model="form.isHttps">
  114. <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  115. </el-radio-group>
  116. </el-form-item>
  117. <el-form-item label="桶权限类型">
  118. <el-radio-group v-model="form.accessPolicy">
  119. <el-radio value="0">private</el-radio>
  120. <el-radio value="1">public</el-radio>
  121. <el-radio value="2">custom</el-radio>
  122. </el-radio-group>
  123. </el-form-item>
  124. <el-form-item label="域" prop="region">
  125. <el-input v-model="form.region" placeholder="请输入域" />
  126. </el-form-item>
  127. <el-form-item label="备注" prop="remark">
  128. <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
  129. </el-form-item>
  130. </el-form>
  131. <template #footer>
  132. <div class="dialog-footer">
  133. <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
  134. <el-button @click="cancel">取 消</el-button>
  135. </div>
  136. </template>
  137. </el-dialog>
  138. </div>
  139. </template>
  140. <script setup name="OssConfig" lang="ts">
  141. import { listOssConfig, getOssConfig, delOssConfig, addOssConfig, updateOssConfig, changeOssConfigStatus } from '@/api/system/ossConfig';
  142. import { OssConfigForm, OssConfigQuery, OssConfigVO } from '@/api/system/ossConfig/types';
  143. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  144. const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
  145. const ossConfigList = ref<OssConfigVO[]>([]);
  146. const buttonLoading = ref(false);
  147. const loading = ref(true);
  148. const showSearch = ref(true);
  149. const ids = ref<Array<number | string>>([]);
  150. const single = ref(true);
  151. const multiple = ref(true);
  152. const total = ref(0);
  153. const queryFormRef = ref<ElFormInstance>();
  154. const ossConfigFormRef = ref<ElFormInstance>();
  155. const dialog = reactive<DialogOption>({
  156. visible: false,
  157. title: ''
  158. });
  159. // 列显隐信息
  160. const columns = ref<FieldOption[]>([
  161. { key: 0, label: `主建`, visible: false },
  162. { key: 1, label: `配置key`, visible: true },
  163. { key: 2, label: `访问站点`, visible: true },
  164. { key: 3, label: `自定义域名`, visible: true },
  165. { key: 4, label: `桶名称`, visible: true },
  166. { key: 5, label: `前缀`, visible: true },
  167. { key: 6, label: `域`, visible: true },
  168. { key: 7, label: `桶权限类型`, visible: true },
  169. { key: 8, label: `状态`, visible: true }
  170. ]);
  171. const initFormData: OssConfigForm = {
  172. ossConfigId: undefined,
  173. configKey: '',
  174. accessKey: '',
  175. secretKey: '',
  176. bucketName: '',
  177. prefix: '',
  178. endpoint: '',
  179. domain: '',
  180. isHttps: 'N',
  181. accessPolicy: '1',
  182. region: '',
  183. status: '1',
  184. remark: ''
  185. };
  186. const data = reactive<PageData<OssConfigForm, OssConfigQuery>>({
  187. form: { ...initFormData },
  188. // 查询参数
  189. queryParams: {
  190. pageNum: 1,
  191. pageSize: 10,
  192. configKey: '',
  193. bucketName: '',
  194. status: ''
  195. },
  196. rules: {
  197. configKey: [{ required: true, message: 'configKey不能为空', trigger: 'blur' }],
  198. accessKey: [
  199. { required: true, message: 'accessKey不能为空', trigger: 'blur' },
  200. {
  201. min: 2,
  202. max: 200,
  203. message: 'accessKey长度必须介于 2 和 100 之间',
  204. trigger: 'blur'
  205. }
  206. ],
  207. secretKey: [
  208. { required: true, message: 'secretKey不能为空', trigger: 'blur' },
  209. {
  210. min: 2,
  211. max: 100,
  212. message: 'secretKey长度必须介于 2 和 100 之间',
  213. trigger: 'blur'
  214. }
  215. ],
  216. bucketName: [
  217. { required: true, message: 'bucketName不能为空', trigger: 'blur' },
  218. {
  219. min: 2,
  220. max: 100,
  221. message: 'bucketName长度必须介于 2 和 100 之间',
  222. trigger: 'blur'
  223. }
  224. ],
  225. endpoint: [
  226. { required: true, message: 'endpoint不能为空', trigger: 'blur' },
  227. {
  228. min: 2,
  229. max: 100,
  230. message: 'endpoint名称长度必须介于 2 和 100 之间',
  231. trigger: 'blur'
  232. }
  233. ],
  234. accessPolicy: [{ required: true, message: 'accessPolicy不能为空', trigger: 'blur' }]
  235. }
  236. });
  237. const { queryParams, form, rules } = toRefs(data);
  238. const protocol = computed(() => (form.value.isHttps === 'Y' ? 'https://' : 'http://'));
  239. /** 查询对象存储配置列表 */
  240. const getList = async () => {
  241. loading.value = true;
  242. const res = await listOssConfig(queryParams.value);
  243. ossConfigList.value = res.rows;
  244. total.value = res.total;
  245. loading.value = false;
  246. };
  247. /** 取消按钮 */
  248. const cancel = () => {
  249. dialog.visible = false;
  250. reset();
  251. };
  252. /** 表单重置 */
  253. const reset = () => {
  254. form.value = { ...initFormData };
  255. ossConfigFormRef.value?.resetFields();
  256. };
  257. /** 搜索按钮操作 */
  258. const handleQuery = () => {
  259. queryParams.value.pageNum = 1;
  260. getList();
  261. };
  262. /** 重置按钮操作 */
  263. const resetQuery = () => {
  264. queryFormRef.value?.resetFields();
  265. handleQuery();
  266. };
  267. /** 选择条数 */
  268. const handleSelectionChange = (selection: OssConfigVO[]) => {
  269. ids.value = selection.map((item) => item.ossConfigId);
  270. single.value = selection.length != 1;
  271. multiple.value = !selection.length;
  272. };
  273. /** 新增按钮操作 */
  274. const handleAdd = () => {
  275. reset();
  276. dialog.visible = true;
  277. dialog.title = '添加对象存储配置';
  278. };
  279. /** 修改按钮操作 */
  280. const handleUpdate = async (row?: OssConfigVO) => {
  281. reset();
  282. const ossConfigId = row?.ossConfigId || ids.value[0];
  283. const res = await getOssConfig(ossConfigId);
  284. Object.assign(form.value, res.data);
  285. dialog.visible = true;
  286. dialog.title = '修改对象存储配置';
  287. };
  288. /** 提交按钮 */
  289. const submitForm = () => {
  290. ossConfigFormRef.value?.validate(async (valid: boolean) => {
  291. if (valid) {
  292. buttonLoading.value = true;
  293. if (form.value.ossConfigId) {
  294. await updateOssConfig(form.value).finally(() => (buttonLoading.value = false));
  295. } else {
  296. await addOssConfig(form.value).finally(() => (buttonLoading.value = false));
  297. }
  298. proxy?.$modal.msgSuccess('新增成功');
  299. dialog.visible = false;
  300. await getList();
  301. }
  302. });
  303. };
  304. /** 状态修改 */
  305. const handleStatusChange = async (row: OssConfigVO) => {
  306. const text = row.status === '0' ? '启用' : '停用';
  307. try {
  308. await proxy?.$modal.confirm('确认要"' + text + '""' + row.configKey + '"配置吗?');
  309. await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey);
  310. await getList();
  311. proxy?.$modal.msgSuccess(text + '成功');
  312. } catch {
  313. return;
  314. } finally {
  315. row.status = row.status === '0' ? '1' : '0';
  316. }
  317. };
  318. /** 删除按钮操作 */
  319. const handleDelete = async (row?: OssConfigVO) => {
  320. const ossConfigIds = row?.ossConfigId || ids.value;
  321. await proxy?.$modal.confirm('是否确认删除OSS配置编号为"' + ossConfigIds + '"的数据项?');
  322. loading.value = true;
  323. await delOssConfig(ossConfigIds).finally(() => (loading.value = false));
  324. await getList();
  325. proxy?.$modal.msgSuccess('删除成功');
  326. };
  327. onMounted(() => {
  328. getList();
  329. });
  330. </script>