[系统用户]增加OTP动态密码二次认证

This commit is contained in:
GoEdgeLab
2020-12-24 17:15:53 +08:00
parent 89506a15c0
commit bf61b2a170
35 changed files with 532 additions and 137 deletions

View File

@@ -0,0 +1,6 @@
<first-menu>
<menu-item href="/admins">系统用户</menu-item>
<span class="item">|</span>
<menu-item :href="'/admins/admin?adminId=' + admin.id" code="index">"{{admin.fullname}}" 详情</menu-item>
<menu-item :href="'/admins/update?adminId=' + admin.id" code="update">修改</menu-item>
</first-menu>

View File

@@ -0,0 +1,7 @@
.modules-box .module-box {
float: left;
width: 9em;
margin-top: 0.3em;
margin-bottom: 0.3em;
}
/*# sourceMappingURL=admin.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sources":["admin.less"],"names":[],"mappings":"AAAA,YACC;EACC,WAAA;EACA,UAAA;EACA,iBAAA;EACA,oBAAA","file":"admin.css"}

View File

@@ -0,0 +1,66 @@
{$layout}
{$template "admin_menu"}
<table class="ui table definition selectable">
<tr>
<td class="title">全名</td>
<td>
{{admin.fullname}}
</td>
</tr>
<tr>
<td>状态</td>
<td>
<label-on :v-is-on="admin.isOn"></label-on>
</td>
</tr>
<tr>
<td>登录用户名</td>
<td>
{{admin.username}}
</td>
</tr>
<tr>
<td>是否为超级管理员</td>
<td>
<span v-if="admin.isSuper" class="green">Y</span>
<span v-else class="disabled">N</span>
</td>
</tr>
<tr v-show="!admin.isSuper">
<td>权限</td>
<td>
<div class="modules-box" v-if="modules.length > 0">
<div class="module-box" v-for="module in modules">
<i class="icon circle small grey"></i> {{module.name}}
</div>
</div>
<span v-else class="disabled">暂时还没有可以管理的模块。</span>
</td>
</tr>
</table>
<h3>OTP认证</h3>
<table class="ui table definition selectable">
<tr>
<td class="title">状态</td>
<td>
<span v-if="otp != null && otp.isOn" class="green">已启用</span>
<span v-else class="disabled">未启用</span>
</td>
</tr>
<tr v-if="otp != null && otp.isOn">
<td colspan="2"><more-options-indicator>更多信息</more-options-indicator></td>
</tr>
<tr v-if="otp != null && otp.isOn && moreOptionsVisible">
<td>认证二维码</td>
<td>
<img :src="'/admins/otpQrcode?adminId=' + admin.id"/>
<p class="comment">可以通过二维码快速添加OTP认证信息到App中。</p>
</td>
</tr>
<tr v-if="otp != null && otp.isOn && moreOptionsVisible">
<td>密钥</td>
<td>{{otp.params.secret}}</td>
</tr>
</table>

View File

@@ -0,0 +1,8 @@
.modules-box {
.module-box {
float: left;
width: 9em;
margin-top: 0.3em;
margin-bottom: 0.3em;
}
}

View File

@@ -49,6 +49,13 @@
</div>
</td>
</tr>
<tr>
<td>OTP认证</td>
<td>
<checkbox name="otpOn">启用OTP</checkbox>
<p class="comment">启用OTP认证后在用户登录的时候需要同时填写OTP动态密码。</p>
</td>
</tr>
</table>
<submit-btn></submit-btn>

View File

@@ -6,7 +6,7 @@
<tr>
<th>用户名</th>
<th>全名</th>
<th>创建时间</th>
<th>OTP认证</th>
<th class="center width10">状态</th>
<th class="two op">操作</th>
</tr>
@@ -18,12 +18,15 @@
</div>
</td>
<td :class="{disabled:!admin.isOn}">{{admin.fullname}}</td>
<td :class="{disabled:!admin.isOn}">{{admin.createdTime}}</td>
<td>
<span v-if="admin.otpLoginIsOn" class="green">Y</span>
<span v-else class="disabled">N</span>
</td>
<td class="center">
<label-on :v-is-on="admin.isOn"></label-on>
</td>
<td>
<a href="" @click.prevent="updateAdmin(admin.id)">修改</a> &nbsp; <a href="" @click.prevent="deleteAdmin(admin.id)">删除</a>
<a :href="'/admins/admin?adminId=' + admin.id">详情</a> &nbsp; <a href="" @click.prevent="deleteAdmin(admin.id)">删除</a>
</td>
</tr>
</table>

View File

@@ -21,15 +21,4 @@ Tea.context(function () {
.refresh()
})
}
this.updateAdmin = function (adminId) {
teaweb.popup("/admins/updatePopup?adminId=" + adminId, {
height: "22em",
callback: function () {
teaweb.success("保存成功", function () {
teaweb.reload()
})
}
})
}
})

View File

@@ -4,4 +4,4 @@
margin-top: 0.3em;
margin-bottom: 0.3em;
}
/*# sourceMappingURL=updatePopup.css.map */
/*# sourceMappingURL=update.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sources":["update.less"],"names":[],"mappings":"AAAA,YACC;EACC,WAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA","file":"update.css"}

View File

@@ -0,0 +1,68 @@
{$layout}
{$template "admin_menu"}
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<input type="hidden" name="adminId" :value="admin.id"/>
<table class="ui table definition selectable">
<tr>
<td class="title">全名 *</td>
<td>
<input type="text" name="fullname" maxlength="100" ref="focus" v-model="admin.fullname"/>
<p class="comment">可以输入姓名、公司名等容易识别的名称。</p>
</td>
</tr>
<tr>
<td>登录用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" v-model="admin.username"/>
<p class="comment">用户名只能英文、数字、下划线的组合。</p>
</td>
</tr>
<tr>
<td>登录密码</td>
<td>
<input type="password" name="pass1" maxlength="100"/>
<p class="comment">留空表示不修改。</p>
</td>
</tr>
<tr>
<td>确认登录密码</td>
<td>
<input type="password" name="pass2" maxlength="100"/>
</td>
</tr>
<tr>
<td>是否为超级管理员</td>
<td>
<checkbox name="isSuper" v-model="admin.isSuper"></checkbox>
<p class="comment">超级管理员自动拥有所有的管理权限。</p>
</td>
</tr>
<tr v-show="!admin.isSuper">
<td>权限</td>
<td>
<div class="modules-box">
<div class="module-box" v-for="module in modules">
<checkbox name="moduleCodes" :v-value="module.code" v-model="module.isChecked">{{module.name}}</checkbox>
</div>
</div>
</td>
</tr>
<tr>
<td>OTP认证</td>
<td>
<checkbox name="otpOn" v-model="admin.otpLoginIsOn">启用OTP</checkbox>
<p class="comment">启用OTP认证后在用户登录的时候需要同时填写OTP动态密码。</p>
</td>
</tr>
<tr>
<td>是否启用</td>
<td>
<checkbox name="isOn" v-model="admin.isOn"></checkbox>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifySuccess("保存成功", "/admins/admin?adminId=" + this.admin.id)
})

View File

@@ -1 +0,0 @@
{"version":3,"sources":["updatePopup.less"],"names":[],"mappings":"AAAA,YACC;EACC,WAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA","file":"updatePopup.css"}

View File

@@ -1,64 +0,0 @@
{$layout "layout_popup"}
<h3>修改系统用户</h3>
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<input type="hidden" name="adminId" :value="admin.id"/>
<table class="ui table definition selectable">
<tr>
<td class="title">全名 *</td>
<td>
<input type="text" name="fullname" maxlength="100" ref="focus" v-model="admin.fullname"/>
<p class="comment">可以输入姓名、公司名等容易识别的名称。</p>
</td>
</tr>
<tr>
<td>登录用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" v-model="admin.username"/>
<p class="comment">用户名只能英文、数字、下划线的组合。</p>
</td>
</tr>
<tr>
<td>登录密码</td>
<td>
<input type="password" name="pass1" maxlength="100"/>
<p class="comment">留空表示不修改。</p>
</td>
</tr>
<tr>
<td>确认登录密码</td>
<td>
<input type="password" name="pass2" maxlength="100"/>
</td>
</tr>
<tr>
<td>是否为超级管理员</td>
<td>
<checkbox name="isSuper" v-model="admin.isSuper"></checkbox>
<p class="comment">超级管理员自动拥有所有的管理权限。</p>
</td>
</tr>
<tr v-show="!admin.isSuper">
<td>权限</td>
<td>
<div class="modules-box">
<div class="module-box" v-for="module in modules">
<checkbox name="moduleCodes" :v-value="module.code" v-model="module.isChecked">{{module.name}}</checkbox>
</div>
</div>
</td>
</tr>
<tr>
<td>是否启用</td>
<td>
<checkbox name="isOn" v-model="admin.isOn"></checkbox>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>