mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	feat: import iconfont styles, change password function is ready
This commit is contained in:
		@@ -318,3 +318,43 @@ func (h *UserHandler) Profile(c *gin.Context) {
 | 
			
		||||
	userVo.UpdatedAt = user.UpdatedAt.Unix()
 | 
			
		||||
	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("profile", h.Profile)
 | 
			
		||||
			group.POST("profile/update", h.ProfileUpdate)
 | 
			
		||||
			group.POST("password", h.Password)
 | 
			
		||||
		}),
 | 
			
		||||
		fx.Invoke(func(s *core.AppServer, h *handler.ChatHandler) {
 | 
			
		||||
			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>
 | 
			
		||||
                </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-icon>
 | 
			
		||||
                    <Delete/>
 | 
			
		||||
@@ -63,18 +68,17 @@
 | 
			
		||||
                </el-dropdown-item>
 | 
			
		||||
 | 
			
		||||
                <el-dropdown-item @click="logout">
 | 
			
		||||
                  <el-icon>
 | 
			
		||||
                    <Monitor/>
 | 
			
		||||
                  </el-icon>
 | 
			
		||||
                  <i class="iconfont icon-logout"></i>
 | 
			
		||||
                  <span>注销</span>
 | 
			
		||||
                </el-dropdown-item>
 | 
			
		||||
 | 
			
		||||
<!--                <el-dropdown-item>-->
 | 
			
		||||
<!--                  <i class="icon-font icon-github"></i>-->
 | 
			
		||||
<!--                 <span>-->
 | 
			
		||||
<!--                    <el-link type="primary" href="https://github.com/yangjian102621/chatgpt-plus" target="_blank">ChatGPT-Plus-V3</el-link>-->
 | 
			
		||||
<!--                 </span>-->
 | 
			
		||||
<!--                </el-dropdown-item>-->
 | 
			
		||||
                <el-dropdown-item>
 | 
			
		||||
                  <i class="iconfont icon-github"></i>
 | 
			
		||||
                 <span>
 | 
			
		||||
                    powered by
 | 
			
		||||
                    <el-link type="primary" href="https://github.com/yangjian102621/chatgpt-plus" target="_blank">chatgpt-plus-v3</el-link>
 | 
			
		||||
                 </span>
 | 
			
		||||
                </el-dropdown-item>
 | 
			
		||||
              </el-dropdown-menu>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-dropdown>
 | 
			
		||||
@@ -180,6 +184,7 @@
 | 
			
		||||
    </el-container>
 | 
			
		||||
 | 
			
		||||
    <config-dialog :show="showConfigDialog" :models="models" @hide="showConfigDialog = false" @update-user="updateUser" />
 | 
			
		||||
    <password-dialog :show="showPasswordDialog" @hide="showPasswordDialog = false" @logout="logout" />
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -210,6 +215,7 @@ import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import ConfigDialog from "@/components/ConfigDialog.vue";
 | 
			
		||||
import PasswordDialog from "@/components/PasswordDialog.vue";
 | 
			
		||||
 | 
			
		||||
const title = ref('ChatGPT-智能助手');
 | 
			
		||||
const logo = 'images/logo.png';
 | 
			
		||||
@@ -229,6 +235,7 @@ const roleId = ref(0)
 | 
			
		||||
const newChatItem = ref(null);
 | 
			
		||||
const router = useRouter();
 | 
			
		||||
const showConfigDialog = ref(false);
 | 
			
		||||
const showPasswordDialog = ref(false);
 | 
			
		||||
 | 
			
		||||
if (!user.value) {
 | 
			
		||||
  router.push("login");
 | 
			
		||||
@@ -712,6 +719,7 @@ const updateUser = function (data) {
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus">
 | 
			
		||||
@import '@/assets/iconfont/iconfont.css';
 | 
			
		||||
#app {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
 | 
			
		||||
@@ -729,13 +737,13 @@ const updateUser = function (data) {
 | 
			
		||||
 | 
			
		||||
        .logo {
 | 
			
		||||
          background-color: #ffffff
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          width: 40px;
 | 
			
		||||
          height: 40px;
 | 
			
		||||
          border-radius: 8px;
 | 
			
		||||
          width: 35px;
 | 
			
		||||
          height: 35px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        span {
 | 
			
		||||
          padding-top: 8px;
 | 
			
		||||
          padding-top: 5px;
 | 
			
		||||
          padding-left: 10px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user