From bb711fb40645513e02e4e5762e99faafdda25a64 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 9 Aug 2021 16:01:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0ak,sk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/base/domain/UserKey.java | 21 + .../dataease/base/domain/UserKeyExample.java | 590 ++++++++++++++++++ .../dataease/base/mapper/UserKeyMapper.java | 30 + .../io/dataease/base/mapper/UserKeyMapper.xml | 228 +++++++ .../plugins/server/XUserKeysServer.java | 61 ++ frontend/src/lang/en.js | 3 +- frontend/src/lang/tw.js | 3 +- frontend/src/lang/zh.js | 3 +- frontend/src/layout/components/Topbar.vue | 5 + 9 files changed, 941 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/io/dataease/base/domain/UserKey.java create mode 100644 backend/src/main/java/io/dataease/base/domain/UserKeyExample.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml create mode 100644 backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java diff --git a/backend/src/main/java/io/dataease/base/domain/UserKey.java b/backend/src/main/java/io/dataease/base/domain/UserKey.java new file mode 100644 index 0000000000..bd9aaab7c6 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/UserKey.java @@ -0,0 +1,21 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class UserKey implements Serializable { + private Long id; + + private Long userId; + + private String accessKey; + + private String secretKey; + + private Long createTime; + + private String status; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/UserKeyExample.java b/backend/src/main/java/io/dataease/base/domain/UserKeyExample.java new file mode 100644 index 0000000000..eca0701de4 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/UserKeyExample.java @@ -0,0 +1,590 @@ +package io.dataease.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class UserKeyExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public UserKeyExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andUserIdIsNull() { + addCriterion("user_id is null"); + return (Criteria) this; + } + + public Criteria andUserIdIsNotNull() { + addCriterion("user_id is not null"); + return (Criteria) this; + } + + public Criteria andUserIdEqualTo(Long value) { + addCriterion("user_id =", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotEqualTo(Long value) { + addCriterion("user_id <>", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdGreaterThan(Long value) { + addCriterion("user_id >", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdGreaterThanOrEqualTo(Long value) { + addCriterion("user_id >=", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdLessThan(Long value) { + addCriterion("user_id <", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdLessThanOrEqualTo(Long value) { + addCriterion("user_id <=", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdIn(List values) { + addCriterion("user_id in", values, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotIn(List values) { + addCriterion("user_id not in", values, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdBetween(Long value1, Long value2) { + addCriterion("user_id between", value1, value2, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotBetween(Long value1, Long value2) { + addCriterion("user_id not between", value1, value2, "userId"); + return (Criteria) this; + } + + public Criteria andAccessKeyIsNull() { + addCriterion("access_key is null"); + return (Criteria) this; + } + + public Criteria andAccessKeyIsNotNull() { + addCriterion("access_key is not null"); + return (Criteria) this; + } + + public Criteria andAccessKeyEqualTo(String value) { + addCriterion("access_key =", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyNotEqualTo(String value) { + addCriterion("access_key <>", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyGreaterThan(String value) { + addCriterion("access_key >", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyGreaterThanOrEqualTo(String value) { + addCriterion("access_key >=", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyLessThan(String value) { + addCriterion("access_key <", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyLessThanOrEqualTo(String value) { + addCriterion("access_key <=", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyLike(String value) { + addCriterion("access_key like", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyNotLike(String value) { + addCriterion("access_key not like", value, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyIn(List values) { + addCriterion("access_key in", values, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyNotIn(List values) { + addCriterion("access_key not in", values, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyBetween(String value1, String value2) { + addCriterion("access_key between", value1, value2, "accessKey"); + return (Criteria) this; + } + + public Criteria andAccessKeyNotBetween(String value1, String value2) { + addCriterion("access_key not between", value1, value2, "accessKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyIsNull() { + addCriterion("secret_key is null"); + return (Criteria) this; + } + + public Criteria andSecretKeyIsNotNull() { + addCriterion("secret_key is not null"); + return (Criteria) this; + } + + public Criteria andSecretKeyEqualTo(String value) { + addCriterion("secret_key =", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyNotEqualTo(String value) { + addCriterion("secret_key <>", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyGreaterThan(String value) { + addCriterion("secret_key >", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyGreaterThanOrEqualTo(String value) { + addCriterion("secret_key >=", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyLessThan(String value) { + addCriterion("secret_key <", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyLessThanOrEqualTo(String value) { + addCriterion("secret_key <=", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyLike(String value) { + addCriterion("secret_key like", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyNotLike(String value) { + addCriterion("secret_key not like", value, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyIn(List values) { + addCriterion("secret_key in", values, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyNotIn(List values) { + addCriterion("secret_key not in", values, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyBetween(String value1, String value2) { + addCriterion("secret_key between", value1, value2, "secretKey"); + return (Criteria) this; + } + + public Criteria andSecretKeyNotBetween(String value1, String value2) { + addCriterion("secret_key not between", value1, value2, "secretKey"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Long value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Long value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Long value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Long value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Long value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Long value1, Long value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Long value1, Long value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("`status` is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("`status` is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(String value) { + addCriterion("`status` =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(String value) { + addCriterion("`status` <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(String value) { + addCriterion("`status` >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(String value) { + addCriterion("`status` >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(String value) { + addCriterion("`status` <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(String value) { + addCriterion("`status` <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLike(String value) { + addCriterion("`status` like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotLike(String value) { + addCriterion("`status` not like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("`status` in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("`status` not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(String value1, String value2) { + addCriterion("`status` between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(String value1, String value2) { + addCriterion("`status` not between", value1, value2, "status"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.java b/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.java new file mode 100644 index 0000000000..0103fd1305 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.java @@ -0,0 +1,30 @@ +package io.dataease.base.mapper; + +import io.dataease.base.domain.UserKey; +import io.dataease.base.domain.UserKeyExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface UserKeyMapper { + long countByExample(UserKeyExample example); + + int deleteByExample(UserKeyExample example); + + int deleteByPrimaryKey(Long id); + + int insert(UserKey record); + + int insertSelective(UserKey record); + + List selectByExample(UserKeyExample example); + + UserKey selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") UserKey record, @Param("example") UserKeyExample example); + + int updateByExample(@Param("record") UserKey record, @Param("example") UserKeyExample example); + + int updateByPrimaryKeySelective(UserKey record); + + int updateByPrimaryKey(UserKey record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml b/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml new file mode 100644 index 0000000000..c10a33dc45 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, user_id, access_key, secret_key, create_time, `status` + + + + + delete from user_key + where id = #{id,jdbcType=BIGINT} + + + delete from user_key + + + + + + insert into user_key (id, user_id, access_key, + secret_key, create_time, `status` + ) + values (#{id,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{accessKey,jdbcType=VARCHAR}, + #{secretKey,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{status,jdbcType=VARCHAR} + ) + + + insert into user_key + + + id, + + + user_id, + + + access_key, + + + secret_key, + + + create_time, + + + `status`, + + + + + #{id,jdbcType=BIGINT}, + + + #{userId,jdbcType=BIGINT}, + + + #{accessKey,jdbcType=VARCHAR}, + + + #{secretKey,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=BIGINT}, + + + #{status,jdbcType=VARCHAR}, + + + + + + update user_key + + + id = #{record.id,jdbcType=BIGINT}, + + + user_id = #{record.userId,jdbcType=BIGINT}, + + + access_key = #{record.accessKey,jdbcType=VARCHAR}, + + + secret_key = #{record.secretKey,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=BIGINT}, + + + `status` = #{record.status,jdbcType=VARCHAR}, + + + + + + + + update user_key + set id = #{record.id,jdbcType=BIGINT}, + user_id = #{record.userId,jdbcType=BIGINT}, + access_key = #{record.accessKey,jdbcType=VARCHAR}, + secret_key = #{record.secretKey,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=BIGINT}, + `status` = #{record.status,jdbcType=VARCHAR} + + + + + + update user_key + + + user_id = #{userId,jdbcType=BIGINT}, + + + access_key = #{accessKey,jdbcType=VARCHAR}, + + + secret_key = #{secretKey,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=BIGINT}, + + + `status` = #{status,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update user_key + set user_id = #{userId,jdbcType=BIGINT}, + access_key = #{accessKey,jdbcType=VARCHAR}, + secret_key = #{secretKey,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=BIGINT}, + `status` = #{status,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java new file mode 100644 index 0000000000..e3fb1e4ea6 --- /dev/null +++ b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java @@ -0,0 +1,61 @@ +package io.dataease.plugins.server; + +import io.dataease.commons.utils.AuthUtils; +import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.xpack.ukey.dto.request.XpackUkeyDto; +import io.dataease.plugins.xpack.ukey.service.UkeyXpackService; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.ServletRequest; +import java.util.List; + +@RequestMapping("/plugin/ukey") +@RestController +public class XUserKeysServer { + + + @PostMapping("info") + public List getUserKeysInfo() { + + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + Long userId = AuthUtils.getUser().getUserId(); + return ukeyXpackService.getUserKeysInfo(userId); + } + + @PostMapping("validate") + public String validate(ServletRequest request) { + // return ApiKeyHandler.getUser(WebUtils.toHttp(request)); + return null; + } + + @PostMapping("generate") + public void generateUserKey() { + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + Long userId = AuthUtils.getUser().getUserId(); + ukeyXpackService.generateUserKey(userId); + } + + @PostMapping("delete/{id}") + public void deleteUserKey(@PathVariable Long id) { + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + ukeyXpackService.deleteUserKey(id); + } + + @PostMapping("changeStatus/{id}") + public void changeStatus(@PathVariable Long id) { + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + ukeyXpackService.switchStatus(id); + } + + /*@GetMapping("active/{id}") + public void activeUserKey(@PathVariable Long id) { + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + ukeyXpackService.activeUserKey(id); + } + + @GetMapping("disable/{id}") + public void disabledUserKey(@PathVariable Long id) { + UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); + ukeyXpackService.disableUserKey(id); + }*/ +} diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 954a4248ff..cee7d5cd93 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -337,7 +337,8 @@ export default { confirm: 'Confirm', ok: 'Confirm', cancel: 'Cancel' - } + }, + ukey_title: 'API Keys' }, documentation: { documentation: 'Documentation', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index e9461d3571..521eea1bc6 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -337,7 +337,8 @@ export default { confirm: '確認', ok: '確認', cancel: '取消' - } + }, + ukey_title: 'API Keys' }, documentation: { documentation: '文檔', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 8e2f3c2f25..025f3f854c 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -337,7 +337,8 @@ export default { confirm: '确认', ok: '确认', cancel: '取消' - } + }, + ukey_title: 'API Keys' }, documentation: { documentation: '文档', diff --git a/frontend/src/layout/components/Topbar.vue b/frontend/src/layout/components/Topbar.vue index d74a84cdb6..29d097c2ee 100644 --- a/frontend/src/layout/components/Topbar.vue +++ b/frontend/src/layout/components/Topbar.vue @@ -53,6 +53,11 @@ {{ $t('commons.personal_info') }} + + + {{ $t('commons.ukey_title') }} + + {{ $t('user.change_password') }}