form.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <el-dialog :close-on-click-modal="false" :title="form.id ? $t('common.editBtn') : $t('common.addBtn')" width="600"
  3. draggable v-model="visible">
  4. <el-form :model="form" :rules="dataRules" formDialogRef label-width="120px" ref="dataFormRef" v-loading="loading">
  5. <el-form-item :label="t('client.clientId')" prop="clientId">
  6. <el-input :placeholder="t('client.inputClientIdTip')" v-model="form.clientId"/>
  7. </el-form-item>
  8. <el-form-item :label="t('client.clientSecret')" prop="clientSecret">
  9. <el-input :placeholder="t('client.inputClientSecretTip')" v-model="form.clientSecret"/>
  10. </el-form-item>
  11. <el-form-item :label="t('client.scope')" prop="scope">
  12. <el-input :placeholder="t('client.inputScopeTip')" v-model="form.scope"/>
  13. </el-form-item>
  14. <el-form-item :label="t('client.authorizedGrantTypes')" prop="authorizedGrantTypes">
  15. <el-select collapse-tags collapse-tags-tooltip multiple v-model="form.authorizedGrantTypes">
  16. <el-option :key="index" :label="item.label" :value="item.value"
  17. v-for="(item, index) in grant_types"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item :label="t('client.accessTokenValidity')" prop="accessTokenValidity">
  21. <el-input-number :placeholder="t('client.inputAccessTokenValidityTip')" v-model="form.accessTokenValidity"/>
  22. </el-form-item>
  23. <el-form-item :label="t('client.refreshTokenValidity')" prop="refreshTokenValidity">
  24. <el-input-number :placeholder="t('client.inputRefreshTokenValidityTip')" v-model="form.refreshTokenValidity"/>
  25. </el-form-item>
  26. <el-form-item :label="t('client.autoapprove')" prop="autoapprove"
  27. v-if="form.authorizedGrantTypes.includes('authorization_code')">
  28. <el-radio-group v-model="form.autoapprove">
  29. <el-radio :key="index" :value="item.value" border v-for="(item, index) in common_status">{{
  30. item.label
  31. }}
  32. </el-radio>
  33. </el-radio-group>
  34. </el-form-item>
  35. <el-form-item :label="t('client.authorities')" prop="authorities"
  36. v-if="form.authorizedGrantTypes.includes('authorization_code')">
  37. <el-input :placeholder="t('client.inputAuthoritiesTip')" v-model="form.authorities"/>
  38. </el-form-item>
  39. <el-form-item :label="t('client.webServerRedirectUri')" prop="webServerRedirectUri"
  40. v-if="form.authorizedGrantTypes.includes('authorization_code')">
  41. <el-input :placeholder="t('client.inputWebServerRedirectUriTip')" v-model="form.webServerRedirectUri"/>
  42. </el-form-item>
  43. </el-form>
  44. <template #footer>
  45. <span class="dialog-footer">
  46. <el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
  47. <el-button @click="onSubmit" type="primary" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
  48. </span>
  49. </template>
  50. </el-dialog>
  51. </template>
  52. <script lang="ts" name="SysOauthClientDetailsDialog" setup>
  53. import {useDict} from '/@/hooks/dict';
  54. import {useMessage} from '/@/hooks/message';
  55. import {addObj, getObj, putObj, validateclientId} from '/@/api/admin/client';
  56. import {useI18n} from 'vue-i18n';
  57. import {rule} from '/@/utils/validate';
  58. // 定义子组件向父组件传值/事件
  59. const emit = defineEmits(['refresh']);
  60. const {t} = useI18n();
  61. // 定义变量内容
  62. const dataFormRef = ref();
  63. const visible = ref(false);
  64. const loading = ref(false);
  65. // 定义字典
  66. const {grant_types, common_status} = useDict(
  67. 'grant_types',
  68. 'common_status',
  69. );
  70. // 提交表单数据
  71. const form = reactive({
  72. id: '',
  73. clientId: '',
  74. clientSecret: '',
  75. scope: 'server',
  76. authorizedGrantTypes: [] as string[],
  77. webServerRedirectUri: '',
  78. authorities: '',
  79. accessTokenValidity: 43200,
  80. refreshTokenValidity: 2592001,
  81. autoapprove: 'true',
  82. delFlag: '',
  83. createBy: '',
  84. updateBy: '',
  85. createTime: '',
  86. updateTime: '',
  87. tenantId: '',
  88. onlineQuantity: '1',
  89. captchaFlag: '1',
  90. encFlag: '1',
  91. });
  92. // 定义校验规则
  93. const dataRules = ref({
  94. clientId: [
  95. {validator: rule.overLength, trigger: 'blur'},
  96. {required: true, message: '编号不能为空', trigger: 'blur'},
  97. {validator: rule.validatorLowercase, trigger: 'blur'},
  98. {
  99. validator: (rule: any, value: any, callback: any) => {
  100. validateclientId(rule, value, callback, form.id !== '');
  101. },
  102. trigger: 'blur',
  103. },
  104. ],
  105. clientSecret: [
  106. {validator: rule.overLength, trigger: 'blur'},
  107. {required: true, message: '密钥不能为空', trigger: 'blur'},
  108. {validator: rule.validatorLower, trigger: 'blur'},
  109. ],
  110. scope: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '域不能为空', trigger: 'blur'}],
  111. authorizedGrantTypes: [{required: true, message: '授权模式不能为空', trigger: 'blur'}],
  112. accessTokenValidity: [
  113. {validator: rule.overLength, trigger: 'blur'},
  114. {required: true, message: '令牌时效不能为空', trigger: 'blur'},
  115. {type: 'number', min: 1, message: '令牌时效不能小于一小时', trigger: 'blur'},
  116. ],
  117. refreshTokenValidity: [
  118. {validator: rule.overLength, trigger: 'blur'},
  119. {required: true, message: '刷新时效不能为空', trigger: 'blur'},
  120. {type: 'number', min: 1, message: '刷新时效不能小于两小时', trigger: 'blur'},
  121. ],
  122. autoapprove: [{required: true, message: '自动放行不能为空', trigger: 'blur'}],
  123. webServerRedirectUri: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '回调地址不能为空', trigger: 'blur'}],
  124. authorities: [{validator: rule.overLength, trigger: 'blur'}],
  125. });
  126. // 打开弹窗
  127. const openDialog = (id: string) => {
  128. visible.value = true;
  129. form.id = '';
  130. // 重置表单数据
  131. nextTick(() => {
  132. dataFormRef.value?.resetFields();
  133. });
  134. // 获取sysOauthClientDetails信息
  135. if (id) {
  136. form.id = id;
  137. getsysOauthClientDetailsData(id);
  138. }
  139. };
  140. // 提交
  141. const onSubmit = async () => {
  142. const valid = await dataFormRef.value.validate().catch(() => {
  143. });
  144. if (!valid) return false;
  145. try {
  146. loading.value = true;
  147. form.id ? await putObj(form) : await addObj(form);
  148. useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
  149. visible.value = false;
  150. emit('refresh');
  151. } catch (err: any) {
  152. useMessage().error(err.msg);
  153. } finally {
  154. loading.value = false;
  155. }
  156. };
  157. // 初始化表单数据
  158. const getsysOauthClientDetailsData = (id: string) => {
  159. // 获取数据
  160. getObj(id).then((res: any) => {
  161. Object.assign(form, res.data);
  162. });
  163. };
  164. // 暴露变量
  165. defineExpose({
  166. openDialog,
  167. });
  168. </script>