mirror of
https://github.com/fumiama/paper-manager.git
synced 2026-06-13 13:16:55 +08:00
funish dynamic info
This commit is contained in:
@@ -268,6 +268,20 @@ func init() {
|
|||||||
}
|
}
|
||||||
writeresult(w, codeSuccess, "成功", messageOk, typeSuccess)
|
writeresult(w, codeSuccess, "成功", messageOk, typeSuccess)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
apimap["/api/delMessage"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id, err := strconv.Atoi(r.URL.Query().Get("id"))
|
||||||
|
if err != nil {
|
||||||
|
writeresult(w, codeError, nil, err.Error(), typeError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = delMessage(r.Header.Get("Authorization"), id)
|
||||||
|
if err != nil {
|
||||||
|
writeresult(w, codeError, nil, err.Error(), typeError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
writeresult(w, codeSuccess, "成功", messageOk, typeSuccess)
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// APIHandler serves all backend /api call
|
// APIHandler serves all backend /api call
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ const (
|
|||||||
MessageContactChange
|
MessageContactChange
|
||||||
MessagePasswordChange
|
MessagePasswordChange
|
||||||
MessageResetPassword
|
MessageResetPassword
|
||||||
|
MessageOperator
|
||||||
)
|
)
|
||||||
|
|
||||||
type MessageType uint8
|
type MessageType uint8
|
||||||
@@ -63,6 +64,7 @@ var (
|
|||||||
ErrEmptyPassword = errors.New("empty password")
|
ErrEmptyPassword = errors.New("empty password")
|
||||||
ErrEmptyName = errors.New("empty name")
|
ErrEmptyName = errors.New("empty name")
|
||||||
ErrInvalidUsersCount = errors.New("invalid users count")
|
ErrInvalidUsersCount = errors.New("invalid users count")
|
||||||
|
ErrInvalidUserID = errors.New("invalid user ID")
|
||||||
ErrEmptyUserID = errors.New("empty user ID")
|
ErrEmptyUserID = errors.New("empty user ID")
|
||||||
ErrEmptyContact = errors.New("empty contact")
|
ErrEmptyContact = errors.New("empty contact")
|
||||||
ErrUsernameExists = errors.New("username exists")
|
ErrUsernameExists = errors.New("username exists")
|
||||||
@@ -140,10 +142,21 @@ func (u *UserDatabase) AddUser(user *User, opname string) error {
|
|||||||
}
|
}
|
||||||
user.Date = time.Now().Unix()
|
user.Date = time.Now().Unix()
|
||||||
user.Last = user.Date
|
user.Last = user.Date
|
||||||
_ = u.notifyUserAdded(opname, user.Name)
|
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
err := u.db.InsertUnique(UserTableUser, user)
|
||||||
return u.db.InsertUnique(UserTableUser, user)
|
u.mu.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = u.notifyUserAdded(opname, user.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
nu, err := u.GetUserByName(user.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.SendMessage("创建了账号", opname, *nu.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateUserInfo ...
|
// UpdateUserInfo ...
|
||||||
@@ -162,12 +175,16 @@ func (u *UserDatabase) UpdateUserInfo(id int, nick, avtr, desc string) error {
|
|||||||
user.Desc = desc
|
user.Desc = desc
|
||||||
}
|
}
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
err = u.db.Insert(UserTableUser, &user)
|
||||||
return u.db.Insert(UserTableUser, &user)
|
u.mu.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.SendMessage("更新了个人信息", user.Name, *user.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateUserRole ...
|
// UpdateUserRole ...
|
||||||
func (u *UserDatabase) UpdateUserRole(id int, nr UserRole) error {
|
func (u *UserDatabase) UpdateUserRole(id int, nr UserRole, opname string) error {
|
||||||
if nr == RoleNil || nr > RoleUser {
|
if nr == RoleNil || nr > RoleUser {
|
||||||
return ErrInvalidRole
|
return ErrInvalidRole
|
||||||
}
|
}
|
||||||
@@ -177,8 +194,12 @@ func (u *UserDatabase) UpdateUserRole(id int, nr UserRole) error {
|
|||||||
}
|
}
|
||||||
user.Role = nr
|
user.Role = nr
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
err = u.db.Insert(UserTableUser, &user)
|
||||||
return u.db.Insert(UserTableUser, &user)
|
u.mu.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.SendMessage("您的权限被变更为"+user.Role.Nick(), opname, *user.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateUserPassword ...
|
// UpdateUserPassword ...
|
||||||
@@ -194,8 +215,12 @@ func (u *UserDatabase) UpdateUserPassword(id int, npwd string) error {
|
|||||||
user.Pswd = npwd
|
user.Pswd = npwd
|
||||||
_ = u.notifyPasswordChange(user.Name, npwd)
|
_ = u.notifyPasswordChange(user.Name, npwd)
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
err = u.db.Insert(UserTableUser, &user)
|
||||||
return u.db.Insert(UserTableUser, &user)
|
u.mu.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.SendMessage("更新了密码", user.Name, *user.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateUserContact ...
|
// UpdateUserContact ...
|
||||||
@@ -210,8 +235,12 @@ func (u *UserDatabase) UpdateUserContact(id int, ncont string) error {
|
|||||||
user.Cont = ncont
|
user.Cont = ncont
|
||||||
_ = u.notifyContactChange(user.Name, ncont)
|
_ = u.notifyContactChange(user.Name, ncont)
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
err = u.db.Insert(UserTableUser, &user)
|
||||||
return u.db.Insert(UserTableUser, &user)
|
u.mu.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.SendMessage("更新了联系方式", user.Name, *user.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserByName avoids sql injection by limiting username to 0-9A-Za-z
|
// GetUserByName avoids sql injection by limiting username to 0-9A-Za-z
|
||||||
@@ -228,6 +257,13 @@ func (u *UserDatabase) GetUserByName(username string) (user User, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsIDExists ...
|
||||||
|
func (u *UserDatabase) IsIDExists(id int) bool {
|
||||||
|
u.mu.RLock()
|
||||||
|
defer u.mu.RUnlock()
|
||||||
|
return u.db.CanFind(UserTableUser, "WHERE ID="+strconv.Itoa(id))
|
||||||
|
}
|
||||||
|
|
||||||
// IsNameExists avoids sql injection by limiting username to 0-9A-Za-z
|
// IsNameExists avoids sql injection by limiting username to 0-9A-Za-z
|
||||||
func (u *UserDatabase) IsNameExists(username string) bool {
|
func (u *UserDatabase) IsNameExists(username string) bool {
|
||||||
for _, c := range username {
|
for _, c := range username {
|
||||||
@@ -337,15 +373,19 @@ func (m *Message) Type() MessageType {
|
|||||||
return MessagePasswordChange
|
return MessagePasswordChange
|
||||||
case m.Name != "" && m.Cont == "" && m.Pswd == "":
|
case m.Name != "" && m.Cont == "" && m.Pswd == "":
|
||||||
return MessageResetPassword
|
return MessageResetPassword
|
||||||
|
case m.Name == "" && m.Cont != "" && m.Pswd != "":
|
||||||
|
return MessageOperator
|
||||||
default:
|
default:
|
||||||
return MessageNormal
|
return MessageNormal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage will send a message
|
// SendMessage will send a normal message to id
|
||||||
func (u *UserDatabase) SendMessage(m *Message) error {
|
func (u *UserDatabase) SendMessage(text, opname string, to int) error {
|
||||||
m.ID = nil
|
if !u.IsIDExists(to) {
|
||||||
m.Date = time.Now().Unix()
|
return ErrInvalidUserID
|
||||||
|
}
|
||||||
|
m := Message{ToID: to, Date: time.Now().Unix(), Text: text, Cont: opname, Pswd: "opname"}
|
||||||
u.mu.Lock()
|
u.mu.Lock()
|
||||||
defer u.mu.Unlock()
|
defer u.mu.Unlock()
|
||||||
return u.db.InsertUnique(UserTableMessage, m)
|
return u.db.InsertUnique(UserTableMessage, m)
|
||||||
@@ -423,6 +463,11 @@ func (u *UserDatabase) NotifyResetPassword(ip, name, cont string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = u.SendMessage("发送重置密码请求", user.Name, *user.ID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
m := Message{
|
m := Message{
|
||||||
Date: time.Now().Unix(),
|
Date: time.Now().Unix(),
|
||||||
Text: "收到来自 " + ip + ", 用户名 " + user.Name + " 的重置密码请求, 联系方式: " + user.Cont,
|
Text: "收到来自 " + ip + ", 用户名 " + user.Name + " 的重置密码请求, 联系方式: " + user.Cont,
|
||||||
|
|||||||
@@ -8,8 +8,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errInvalidMessageID = errors.New("invalid message id")
|
errInvalidMessageID = errors.New("invalid message id")
|
||||||
errNothingToDo = errors.New("nothing to do")
|
errNoAcceptPermission = errors.New("no accept permission")
|
||||||
|
errNothingToDo = errors.New("nothing to do")
|
||||||
)
|
)
|
||||||
|
|
||||||
type messageList struct {
|
type messageList struct {
|
||||||
@@ -39,7 +40,12 @@ func getMessageList(token string) ([]messageList, error) {
|
|||||||
if a, ok := am[m.Name]; ok {
|
if a, ok := am[m.Name]; ok {
|
||||||
avtr = a
|
avtr = a
|
||||||
} else {
|
} else {
|
||||||
u, err := global.UserDB.GetUserByName(m.Name)
|
var u global.User
|
||||||
|
if m.Name != "" {
|
||||||
|
u, err = global.UserDB.GetUserByName(m.Name)
|
||||||
|
} else if m.Cont != "" {
|
||||||
|
u, err = global.UserDB.GetUserByName(m.Cont)
|
||||||
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
avtr = u.Avtr
|
avtr = u.Avtr
|
||||||
am[m.Name] = u.Avtr
|
am[m.Name] = u.Avtr
|
||||||
@@ -59,6 +65,9 @@ func acceptMessage(token string, id int) error {
|
|||||||
if user == nil {
|
if user == nil {
|
||||||
return errInvalidToken
|
return errInvalidToken
|
||||||
}
|
}
|
||||||
|
if !user.IsSuper() {
|
||||||
|
return errNoAcceptPermission
|
||||||
|
}
|
||||||
m, err := global.UserDB.GetMessageByID(id)
|
m, err := global.UserDB.GetMessageByID(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -84,3 +93,18 @@ func acceptMessage(token string, id int) error {
|
|||||||
return errNothingToDo
|
return errNothingToDo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func delMessage(token string, id int) error {
|
||||||
|
user := usertokens.Get(token)
|
||||||
|
if user == nil {
|
||||||
|
return errInvalidToken
|
||||||
|
}
|
||||||
|
m, err := global.UserDB.GetMessageByID(id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if m.ToID != *user.ID {
|
||||||
|
return errInvalidMessageID
|
||||||
|
}
|
||||||
|
return global.UserDB.DelMessageByID(id)
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { MessageItem } from './model/workbenchModel'
|
|||||||
enum Api {
|
enum Api {
|
||||||
GetMessageList = '/getMessageList',
|
GetMessageList = '/getMessageList',
|
||||||
AcceptMessage = '/acceptMessage',
|
AcceptMessage = '/acceptMessage',
|
||||||
|
DeleteMessage = '/delMessage',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMessageList = () => {
|
export const getMessageList = () => {
|
||||||
@@ -13,3 +14,7 @@ export const getMessageList = () => {
|
|||||||
export const acceptMessage = (id: number) => {
|
export const acceptMessage = (id: number) => {
|
||||||
return defHttp.get<string>({ url: Api.AcceptMessage, params: { id } })
|
return defHttp.get<string>({ url: Api.AcceptMessage, params: { id } })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const deleteMessage = (id: number) => {
|
||||||
|
return defHttp.get<string>({ url: Api.DeleteMessage, params: { id } })
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ export enum MessageTypeEnum {
|
|||||||
MessageContactChange = 3,
|
MessageContactChange = 3,
|
||||||
MessagePasswordChange = 4,
|
MessagePasswordChange = 4,
|
||||||
MessageResetPassword = 5,
|
MessageResetPassword = 5,
|
||||||
|
MessageOperator = 6,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MessageItem {
|
export interface MessageItem {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
>接受</a-button
|
>接受</a-button
|
||||||
>
|
>
|
||||||
|
|
||||||
<a-button ghost color="error">删除</a-button>
|
<a-button ghost color="error" @click="del(item.id)">删除</a-button>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
</template>
|
</template>
|
||||||
</List>
|
</List>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import { Card, List } from 'ant-design-vue'
|
import { Card, List } from 'ant-design-vue'
|
||||||
import { getMessageList, acceptMessage } from '/@/api/dashboard/index'
|
import { getMessageList, acceptMessage, deleteMessage } from '/@/api/dashboard/index'
|
||||||
import { useMessage } from '/@/hooks/web/useMessage'
|
import { useMessage } from '/@/hooks/web/useMessage'
|
||||||
import { MessageTypeEnum, MessageItem } from '/@/api/dashboard/model/workbenchModel'
|
import { MessageTypeEnum, MessageItem } from '/@/api/dashboard/model/workbenchModel'
|
||||||
import { Avatar } from 'ant-design-vue'
|
import { Avatar } from 'ant-design-vue'
|
||||||
@@ -45,12 +45,24 @@
|
|||||||
const dynamicInfoItemsRef = ref([] as MessageItem[])
|
const dynamicInfoItemsRef = ref([] as MessageItem[])
|
||||||
const { createMessage } = useMessage()
|
const { createMessage } = useMessage()
|
||||||
getMessageList().then((value) => {
|
getMessageList().then((value) => {
|
||||||
dynamicInfoItemsRef.value = value
|
if (value) dynamicInfoItemsRef.value = value
|
||||||
})
|
})
|
||||||
async function accept(id: number) {
|
async function accept(id: number) {
|
||||||
try {
|
try {
|
||||||
const msg = await acceptMessage(id)
|
const msg = await acceptMessage(id)
|
||||||
createMessage.success(msg)
|
createMessage.success(msg)
|
||||||
|
getMessageList().then((value) => {
|
||||||
|
dynamicInfoItemsRef.value = value
|
||||||
|
})
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
async function del(id: number) {
|
||||||
|
try {
|
||||||
|
const msg = await deleteMessage(id)
|
||||||
|
createMessage.success(msg)
|
||||||
|
getMessageList().then((value) => {
|
||||||
|
dynamicInfoItemsRef.value = value
|
||||||
|
})
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user