mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-17 16:56:38 +08:00
feat: import iconfont styles, change password function is ready
This commit is contained in:
parent
111572e3f2
commit
7fd0b1fa08
@ -318,3 +318,43 @@ func (h *UserHandler) Profile(c *gin.Context) {
|
|||||||
userVo.UpdatedAt = user.UpdatedAt.Unix()
|
userVo.UpdatedAt = user.UpdatedAt.Unix()
|
||||||
resp.SUCCESS(c, userVo)
|
resp.SUCCESS(c, userVo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Password 更新密码
|
||||||
|
func (h *UserHandler) Password(c *gin.Context) {
|
||||||
|
var data struct {
|
||||||
|
OldPass string `json:"old_pass"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
}
|
||||||
|
if err := c.ShouldBindJSON(&data); err != nil {
|
||||||
|
resp.ERROR(c, types.InvalidArgs)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(data.Password) < 8 {
|
||||||
|
resp.ERROR(c, "密码长度不能少于8个字符")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
user, err := utils.GetLoginUser(c, h.db)
|
||||||
|
if err != nil {
|
||||||
|
resp.NotAuth(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
password := utils.GenPassword(data.OldPass, user.Salt)
|
||||||
|
logger.Info(user.Salt, ",", user.Password, ",", password, ",", data.OldPass)
|
||||||
|
if password != user.Password {
|
||||||
|
resp.ERROR(c, "原密码错误")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newPass := utils.GenPassword(data.Password, user.Salt)
|
||||||
|
res := h.db.Model(&user).UpdateColumn("password", newPass)
|
||||||
|
if res.Error != nil {
|
||||||
|
logger.Error("更新数据库失败: ", res.Error)
|
||||||
|
resp.ERROR(c, "更新数据库失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.SUCCESS(c)
|
||||||
|
}
|
||||||
|
@ -106,6 +106,7 @@ func main() {
|
|||||||
group.GET("session", h.Session)
|
group.GET("session", h.Session)
|
||||||
group.GET("profile", h.Profile)
|
group.GET("profile", h.Profile)
|
||||||
group.POST("profile/update", h.ProfileUpdate)
|
group.POST("profile/update", h.ProfileUpdate)
|
||||||
|
group.POST("password", h.Password)
|
||||||
}),
|
}),
|
||||||
fx.Invoke(func(s *core.AppServer, h *handler.ChatHandler) {
|
fx.Invoke(func(s *core.AppServer, h *handler.ChatHandler) {
|
||||||
group := s.Engine.Group("/api/chat/")
|
group := s.Engine.Group("/api/chat/")
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 66 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 30 KiB |
31
web/src/assets/iconfont/iconfont.css
Normal file
31
web/src/assets/iconfont/iconfont.css
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "iconfont"; /* Project id 4125778 */
|
||||||
|
src: url('iconfont.woff2?t=1686901862117') format('woff2'),
|
||||||
|
url('iconfont.woff?t=1686901862117') format('woff'),
|
||||||
|
url('iconfont.ttf?t=1686901862117') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
font-family: "iconfont" !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-password:before {
|
||||||
|
content: "\e62a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-send:before {
|
||||||
|
content: "\e604";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-logout:before {
|
||||||
|
content: "\e62e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-github:before {
|
||||||
|
content: "\e66f";
|
||||||
|
}
|
||||||
|
|
1
web/src/assets/iconfont/iconfont.js
Normal file
1
web/src/assets/iconfont/iconfont.js
Normal file
File diff suppressed because one or more lines are too long
4
web/src/assets/iconfont/iconfont.js:Zone.Identifier
Normal file
4
web/src/assets/iconfont/iconfont.js:Zone.Identifier
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[ZoneTransfer]
|
||||||
|
ZoneId=3
|
||||||
|
ReferrerUrl=https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4125778
|
||||||
|
HostUrl=https://www.iconfont.cn/api/project/download.zip?spm=a313x.7781069.1998910419.d7543c303&pid=4125778&ctoken=SHhMU2NkC6BavrZsXJmrL-LS
|
37
web/src/assets/iconfont/iconfont.json
Normal file
37
web/src/assets/iconfont/iconfont.json
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"id": "4125778",
|
||||||
|
"name": "chatgpt",
|
||||||
|
"font_family": "iconfont",
|
||||||
|
"css_prefix_text": "icon-",
|
||||||
|
"description": "",
|
||||||
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "611345",
|
||||||
|
"name": "密码",
|
||||||
|
"font_class": "password",
|
||||||
|
"unicode": "e62a",
|
||||||
|
"unicode_decimal": 58922
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1418205",
|
||||||
|
"name": "发送",
|
||||||
|
"font_class": "send",
|
||||||
|
"unicode": "e604",
|
||||||
|
"unicode_decimal": 58884
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1048893",
|
||||||
|
"name": "注销",
|
||||||
|
"font_class": "logout",
|
||||||
|
"unicode": "e62e",
|
||||||
|
"unicode_decimal": 58926
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14401714",
|
||||||
|
"name": "github",
|
||||||
|
"font_class": "github",
|
||||||
|
"unicode": "e66f",
|
||||||
|
"unicode_decimal": 58991
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
web/src/assets/iconfont/iconfont.ttf
Normal file
BIN
web/src/assets/iconfont/iconfont.ttf
Normal file
Binary file not shown.
BIN
web/src/assets/iconfont/iconfont.woff
Normal file
BIN
web/src/assets/iconfont/iconfont.woff
Normal file
Binary file not shown.
BIN
web/src/assets/iconfont/iconfont.woff2
Normal file
BIN
web/src/assets/iconfont/iconfont.woff2
Normal file
Binary file not shown.
96
web/src/components/PasswordDialog.vue
Normal file
96
web/src/components/PasswordDialog.vue
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="show"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:show-close="true"
|
||||||
|
:before-close="close"
|
||||||
|
title="修改密码"
|
||||||
|
>
|
||||||
|
<div class="form" id="password-form">
|
||||||
|
<el-form :model="form" label-width="120px">
|
||||||
|
<el-form-item label="原始密码">
|
||||||
|
<el-input v-model="form['old_pass']" type="password"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="新密码">
|
||||||
|
<el-input v-model="form['password']" type="password"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="确认密码">
|
||||||
|
<el-input v-model="form['repass']" type="password"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="close">关闭</el-button>
|
||||||
|
<el-button type="primary" @click="save">
|
||||||
|
保存
|
||||||
|
</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
|
||||||
|
|
||||||
|
import {defineEmits, defineProps, onMounted, ref} from "vue"
|
||||||
|
import {httpGet, httpPost} from "@/utils/http";
|
||||||
|
import {ElMessage} from "element-plus";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
show: Boolean,
|
||||||
|
});
|
||||||
|
|
||||||
|
const form = ref({})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
const emits = defineEmits(['hide']);
|
||||||
|
const save = function () {
|
||||||
|
if (form.value['password'].length < 8) {
|
||||||
|
return ElMessage.error('密码的长度为8-16个字符');
|
||||||
|
}
|
||||||
|
if (form.value['repass'] !== form.value['password']) {
|
||||||
|
return ElMessage.error('两次输入密码不一致');
|
||||||
|
}
|
||||||
|
httpPost('/api/user/password', form.value).then(() => {
|
||||||
|
ElMessage.success({
|
||||||
|
message: '更新成功',
|
||||||
|
appendTo: document.getElementById('password-form'),
|
||||||
|
onClose: () => emits('logout', false)
|
||||||
|
})
|
||||||
|
}).catch((e) => {
|
||||||
|
ElMessage.error({
|
||||||
|
message: '更新失败,'+e.message,
|
||||||
|
appendTo: document.getElementById('password-form')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const close = function () {
|
||||||
|
emits('hide', false);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus">
|
||||||
|
.el-dialog {
|
||||||
|
--el-dialog-width 90%;
|
||||||
|
max-width 500px;
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
padding-top 10px;
|
||||||
|
max-height 600px;
|
||||||
|
overflow-y auto;
|
||||||
|
|
||||||
|
.form {
|
||||||
|
position relative;
|
||||||
|
|
||||||
|
.el-message {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -55,6 +55,11 @@
|
|||||||
<span>聊天设置</span>
|
<span>聊天设置</span>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
|
|
||||||
|
<el-dropdown-item @click="showPasswordDialog=true">
|
||||||
|
<i class="iconfont icon-password"></i>
|
||||||
|
<span>修改密码</span>
|
||||||
|
</el-dropdown-item>
|
||||||
|
|
||||||
<el-dropdown-item @click="clearAllChats">
|
<el-dropdown-item @click="clearAllChats">
|
||||||
<el-icon>
|
<el-icon>
|
||||||
<Delete/>
|
<Delete/>
|
||||||
@ -63,18 +68,17 @@
|
|||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
|
|
||||||
<el-dropdown-item @click="logout">
|
<el-dropdown-item @click="logout">
|
||||||
<el-icon>
|
<i class="iconfont icon-logout"></i>
|
||||||
<Monitor/>
|
|
||||||
</el-icon>
|
|
||||||
<span>注销</span>
|
<span>注销</span>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
|
|
||||||
<!-- <el-dropdown-item>-->
|
<el-dropdown-item>
|
||||||
<!-- <i class="icon-font icon-github"></i>-->
|
<i class="iconfont icon-github"></i>
|
||||||
<!-- <span>-->
|
<span>
|
||||||
<!-- <el-link type="primary" href="https://github.com/yangjian102621/chatgpt-plus" target="_blank">ChatGPT-Plus-V3</el-link>-->
|
powered by
|
||||||
<!-- </span>-->
|
<el-link type="primary" href="https://github.com/yangjian102621/chatgpt-plus" target="_blank">chatgpt-plus-v3</el-link>
|
||||||
<!-- </el-dropdown-item>-->
|
</span>
|
||||||
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
@ -180,6 +184,7 @@
|
|||||||
</el-container>
|
</el-container>
|
||||||
|
|
||||||
<config-dialog :show="showConfigDialog" :models="models" @hide="showConfigDialog = false" @update-user="updateUser" />
|
<config-dialog :show="showConfigDialog" :models="models" @hide="showConfigDialog = false" @update-user="updateUser" />
|
||||||
|
<password-dialog :show="showPasswordDialog" @hide="showPasswordDialog = false" @logout="logout" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@ -210,6 +215,7 @@ import {httpGet, httpPost} from "@/utils/http";
|
|||||||
import {useRouter} from "vue-router";
|
import {useRouter} from "vue-router";
|
||||||
import Clipboard from "clipboard";
|
import Clipboard from "clipboard";
|
||||||
import ConfigDialog from "@/components/ConfigDialog.vue";
|
import ConfigDialog from "@/components/ConfigDialog.vue";
|
||||||
|
import PasswordDialog from "@/components/PasswordDialog.vue";
|
||||||
|
|
||||||
const title = ref('ChatGPT-智能助手');
|
const title = ref('ChatGPT-智能助手');
|
||||||
const logo = 'images/logo.png';
|
const logo = 'images/logo.png';
|
||||||
@ -229,6 +235,7 @@ const roleId = ref(0)
|
|||||||
const newChatItem = ref(null);
|
const newChatItem = ref(null);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const showConfigDialog = ref(false);
|
const showConfigDialog = ref(false);
|
||||||
|
const showPasswordDialog = ref(false);
|
||||||
|
|
||||||
if (!user.value) {
|
if (!user.value) {
|
||||||
router.push("login");
|
router.push("login");
|
||||||
@ -712,6 +719,7 @@ const updateUser = function (data) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus">
|
<style lang="stylus">
|
||||||
|
@import '@/assets/iconfont/iconfont.css';
|
||||||
#app {
|
#app {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
@ -729,13 +737,13 @@ const updateUser = function (data) {
|
|||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
background-color: #ffffff
|
background-color: #ffffff
|
||||||
border-radius: 50%;
|
border-radius: 8px;
|
||||||
width: 40px;
|
width: 35px;
|
||||||
height: 40px;
|
height: 35px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
span {
|
||||||
padding-top: 8px;
|
padding-top: 5px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user