ny
22 小时以前 282fbc6488f4e8ceb5fda759f963ee88fbf7b999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
<script lang="ts" setup>
import { onMounted, reactive, toRefs } from 'vue';
 
import { useMessage } from '@jnpf/hooks';
 
import { getSysConfig, update } from '#/api/system/sysConfig';
import { $t } from '#/locales';
import { useBaseStore } from '#/store';
 
interface State {
  baseForm: any;
  activeKey: number;
  btnLoading: boolean;
  singleLoginOptions: any[];
  lockTypeOptions: any[];
}
 
defineOptions({ name: 'SysConfigStrategy' });
 
const state = reactive<State>({
  baseForm: {},
  activeKey: 1,
  btnLoading: false,
  singleLoginOptions: [
    { fullName: '单一登录', id: 1 },
    { fullName: '同时登录', id: 2 },
  ],
  lockTypeOptions: [
    { fullName: '账号锁定', id: 1 },
    { fullName: '延时登录', id: 2 },
  ],
});
const { baseForm, activeKey, btnLoading, singleLoginOptions, lockTypeOptions } = toRefs(state);
const { createConfirm, createMessage } = useMessage();
const baseStore = useBaseStore();
 
function initData() {
  getSysConfig().then((res) => {
    state.baseForm = res.data;
    state.baseForm.lockType = state.baseForm.lockType ? state.baseForm.lockType : 1;
    state.baseForm.lockTime = state.baseForm.lockTime ? state.baseForm.lockTime : 10;
  });
}
function handleSubmit() {
  if (!state.baseForm.newUserDefaultPassword) {
    return createMessage.error('新用户默认密码不能为空');
  }
  createConfirm({
    iconType: 'warning',
    title: $t('common.tipTitle'),
    content: '您确定要保存,是否继续?',
    onOk: () => {
      state.btnLoading = true;
      update(state.baseForm)
        .then((res) => {
          createMessage.success(res.msg);
          state.btnLoading = false;
          const sysConfigInfo = {
            newUserDefaultPassword: state.baseForm.newUserDefaultPassword,
          };
          baseStore.setSysConfig(sysConfigInfo);
          initData();
        })
        .catch(() => {
          state.btnLoading = false;
        });
    },
  });
}
function onNumberChange(val, key) {
  if (val) return;
  if (key === 'verificationCodeNumber') return (state.baseForm[key] = 3);
  state.baseForm[key] = 1;
}
 
onMounted(() => {
  initData();
});
</script>
<template>
  <div class="jnpf-content-wrapper">
    <div class="jnpf-content-wrapper-center bg-white">
      <a-form :colon="false" label-align="right" :label-col="{ style: { width: '140px' } }" class="h-full">
        <a-tabs class="jnpf-content-wrapper-tabs tabs-contain" v-model:active-key="activeKey">
          <a-tab-pane :key="1" tab="登录策略" class="p-[30px]">
            <a-row>
              <a-col :span="10">
                <a-form-item label="登录方式">
                  <jnpf-select v-model:value="baseForm.singleLogin" placeholder="请选择" :options="singleLoginOptions" />
                </a-form-item>
                <a-form-item label="超时登出">
                  <a-input-number
                    v-model:value="baseForm.tokenTimeout"
                    :min="1"
                    :precision="0"
                    addon-after="分钟"
                    @change="onNumberChange($event, 'tokenTimeout')" />
                </a-form-item>
                <a-form-item label="密码错误次数">
                  <a-input-number
                    v-model:value="baseForm.passwordErrorsNumber"
                    :min="1"
                    :precision="0"
                    addon-after="次"
                    @change="onNumberChange($event, 'passwordErrorsNumber')" />
                </a-form-item>
              </a-col>
              <a-col :span="24" class="common-tip mb-[10px] ml-[140px] mt-[-10px]">输入密码错误将用户锁定,设置3以下值表示不启动该功能</a-col>
              <a-col :span="10">
                <a-form-item label=" " class="mb-[10px]">
                  <jnpf-radio v-model:value="baseForm.lockType" :options="lockTypeOptions" />
                  <div class="mt-[10px]">
                    <a-form-item label="延迟时间" v-if="baseForm.lockType === 2" class="!mb-[6px]">
                      <a-input-number
                        v-model:value="baseForm.lockTime"
                        :min="1"
                        :precision="0"
                        addon-after="分钟"
                        @change="onNumberChange($event, 'lockTime')" />
                    </a-form-item>
                  </div>
                </a-form-item>
                <a-form-item label="登录验证码">
                  <jnpf-switch v-model:value="baseForm.enableVerificationCode" />
                </a-form-item>
                <a-form-item label="验证码位数" v-if="baseForm.enableVerificationCode">
                  <a-input-number
                    v-model:value="baseForm.verificationCodeNumber"
                    :min="3"
                    :max="6"
                    :precision="0"
                    addon-after="位"
                    @change="onNumberChange($event, 'verificationCodeNumber')" />
                </a-form-item>
                <a-form-item label="登录提示语">
                  <jnpf-switch v-model:value="baseForm.lastLoginTimeSwitch" />
                </a-form-item>
                <a-form-item v-if="baseForm.lastLoginTimeSwitch" label=" ">
                  <a-card size="small" class="w-[300px]" :body-style="{ padding: '0px 20px' }">
                    <template #title>
                      <span>上次登录信息提示</span>
                    </template>
                    <template #extra>
                      <i class="icon-ym icon-ym-nav-close card-extra"></i>
                    </template>
                    <div class="card-item">
                      <p>时间:2018-10-17 12:40</p>
                      <p>地点:上海市</p>
                      <p>IP:255.255.0.0</p>
                    </div>
                  </a-card>
                </a-form-item>
                <a-form-item label="白名单验证">
                  <jnpf-switch v-model:value="baseForm.whitelistSwitch" />
                </a-form-item>
                <a-form-item label="白名单设置" v-if="baseForm.whitelistSwitch">
                  <a-textarea v-model:value="baseForm.whiteListIp" :auto-size="{ minRows: 3, maxRows: 10 }" placeholder="允许访问IP" />
                  <div class="common-tip mt-[10px]">多个IP设置,用英文符号隔开,如192.168.0.1,192.168.0.2</div>
                </a-form-item>
                <a-form-item label=" ">
                  <a-button type="primary" @click.prevent="handleSubmit" :loading="btnLoading">保存</a-button>
                </a-form-item>
              </a-col>
            </a-row>
          </a-tab-pane>
          <a-tab-pane :key="2" tab="密码策略" class="p-[30px]">
            <a-row>
              <a-col :span="10">
                <a-form-item label="密码定期更新">
                  <jnpf-switch v-model:value="baseForm.passwordIsUpdatedRegularly" />
                </a-form-item>
                <template v-if="baseForm.passwordIsUpdatedRegularly">
                  <a-form-item label="更新周期">
                    <a-input-number
                      v-model:value="baseForm.updateCycle"
                      :min="1"
                      :precision="0"
                      addon-after="天"
                      @change="onNumberChange($event, 'updateCycle')" />
                  </a-form-item>
                  <a-form-item label="提前">
                    <a-input-number
                      v-model:value="baseForm.updateInAdvance"
                      :min="1"
                      :precision="0"
                      addon-after="天提醒更新"
                      @change="onNumberChange($event, 'updateInAdvance')" />
                  </a-form-item>
                </template>
                <a-form-item label="密码强度限制">
                  <jnpf-switch v-model:value="baseForm.passwordStrengthLimit" />
                </a-form-item>
                <a-form-item label=" " v-if="baseForm.passwordStrengthLimit">
                  <div class="flex">
                    <JnpfCheckboxSingle class="checkbox mr-[20px]" label="最小长度" v-model:value="baseForm.passwordLengthMin" />
                    <a-input-number
                      v-model:value="baseForm.passwordLengthMinNumber"
                      :min="1"
                      :precision="0"
                      @change="onNumberChange($event, 'passwordLengthMinNumber')" /><br />
                  </div>
                  <JnpfCheckboxSingle class="checkbox" label="包含数字" v-model:value="baseForm.containsNumbers" /><br />
                  <JnpfCheckboxSingle class="checkbox" label="包含小写字母" v-model:value="baseForm.includeLowercaseLetters" /><br />
                  <JnpfCheckboxSingle class="checkbox" label="包含大写字母" v-model:value="baseForm.includeUppercaseLetters" /><br />
                  <JnpfCheckboxSingle class="checkbox" label="包含字符" v-model:value="baseForm.containsCharacters" />
                </a-form-item>
                <a-form-item label="禁用旧密码">
                  <jnpf-switch v-model:value="baseForm.disableOldPassword" />
                </a-form-item>
                <a-form-item label="禁用个数" v-if="baseForm.disableOldPassword">
                  <a-input-number
                    v-model:value="baseForm.disableTheNumberOfOldPasswords"
                    :min="1"
                    :precision="0"
                    addon-after="个"
                    @change="onNumberChange($event, 'disableTheNumberOfOldPasswords')" />
                </a-form-item>
                <a-form-item label="修改初始密码提醒">
                  <jnpf-switch v-model:value="baseForm.mandatoryModificationOfInitialPassword" />
                </a-form-item>
                <a-form-item required>
                  <template #label>新用户默认密码<BasicHelp text="修改后,新的默认密码仅针对后续新建的用户有效" /></template>
                  <a-input v-model:value="baseForm.newUserDefaultPassword" placeholder="请输入" />
                </a-form-item>
                <a-form-item label=" ">
                  <a-button type="primary" @click.prevent="handleSubmit" :loading="btnLoading">保存</a-button>
                </a-form-item>
              </a-col>
            </a-row>
          </a-tab-pane>
        </a-tabs>
      </a-form>
    </div>
  </div>
</template>
<style lang="scss" scoped>
.common-tip {
  font-size: 14px;
  line-height: 1;
  color: var(--text-color-secondary);
}
 
.card-extra {
  float: right;
  padding: 8px 0;
  font-size: 12px;
}
 
.card-item {
  p {
    line-height: 32px;
  }
}
 
.checkbox {
  flex-shrink: 0;
  line-height: 32px;
}
</style>