增加多租户隔离初版

This commit is contained in:
dushixiang 2021-01-13 20:09:48 +08:00
parent e00453cbad
commit 499dd3ab85
7 changed files with 96 additions and 10 deletions

13
main.go
View File

@ -28,6 +28,16 @@ func main() {
func Run() error { func Run() error {
fmt.Printf(`
_______ __ ___________ .__ .__
\ \ ____ ___ ____/ |_ \__ ___/__________ _____ |__| ____ _____ | |
/ | \_/ __ \\ \/ /\ __\ | |_/ __ \_ __ \/ \| |/ \\__ \ | |
/ | \ ___/ > < | | | |\ ___/| | \/ Y Y \ | | \/ __ \| |__
\____|__ /\___ >__/\_ \ |__| |____| \___ >__| |__|_| /__|___| (____ /____/
\/ \/ \/ \/ \/ \/ \/
`)
var err error var err error
//logrus.SetReportCaller(true) //logrus.SetReportCaller(true)
logrus.SetFormatter(&nested.Formatter{ logrus.SetFormatter(&nested.Formatter{
@ -49,7 +59,7 @@ func Run() error {
return err return err
} }
logrus.Infof("当前数据库模式为:%v", global.Config.DB) fmt.Printf("当前数据库模式为:%v\n", global.Config.DB)
if global.Config.DB == "mysql" { if global.Config.DB == "mysql" {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
global.Config.Mysql.Username, global.Config.Mysql.Username,
@ -123,6 +133,7 @@ func Run() error {
global.Cache = cache.New(5*time.Minute, 10*time.Minute) global.Cache = cache.New(5*time.Minute, 10*time.Minute)
global.Store = global.NewStore() global.Store = global.NewStore()
e := api.SetupRoutes() e := api.SetupRoutes()
if err := handle.InitProperties(); err != nil { if err := handle.InitProperties(); err != nil {
return err return err

View File

@ -14,6 +14,7 @@ const Token = "X-Auth-Token"
func SetupRoutes() *echo.Echo { func SetupRoutes() *echo.Echo {
e := echo.New() e := echo.New()
e.HideBanner = true
e.File("/", "web/build/index.html") e.File("/", "web/build/index.html")
e.File("/logo.svg", "web/build/logo.svg") e.File("/logo.svg", "web/build/logo.svg")

View File

@ -22,6 +22,7 @@ type Asset struct {
Active bool `json:"active"` Active bool `json:"active"`
Created utils.JsonTime `json:"created"` Created utils.JsonTime `json:"created"`
Tags string `json:"tags"` Tags string `json:"tags"`
Creator string `json:"creator"`
} }
func (r *Asset) TableName() string { func (r *Asset) TableName() string {

View File

@ -10,6 +10,7 @@ type Command struct {
Name string `json:"name"` Name string `json:"name"`
Content string `json:"content"` Content string `json:"content"`
Created utils.JsonTime `json:"created"` Created utils.JsonTime `json:"created"`
Creator string `json:"creator"`
} }
func (r *Command) TableName() string { func (r *Command) TableName() string {

View File

@ -20,6 +20,7 @@ type Credential struct {
PrivateKey string `json:"privateKey"` PrivateKey string `json:"privateKey"`
Passphrase string `json:"passphrase"` Passphrase string `json:"passphrase"`
Created utils.JsonTime `json:"created"` Created utils.JsonTime `json:"created"`
Creator string `json:"creator"`
} }
func (r *Credential) TableName() string { func (r *Credential) TableName() string {

View File

@ -15,6 +15,7 @@ type User struct {
Online bool `json:"online"` Online bool `json:"online"`
Enabled bool `json:"enabled"` Enabled bool `json:"enabled"`
Created utils.JsonTime `json:"created"` Created utils.JsonTime `json:"created"`
Role string `json:"role"`
} }
func (r *User) TableName() string { func (r *User) TableName() string {

View File

@ -5,9 +5,10 @@ import {
Badge, Badge,
Button, Button,
Col, Col,
Divider, Divider, Dropdown,
Input, Input,
Layout, Layout,
Menu,
Modal, Modal,
PageHeader, PageHeader,
Row, Row,
@ -21,10 +22,10 @@ import UserModal from "./UserModal";
import request from "../../common/request"; import request from "../../common/request";
import {message} from "antd/es"; import {message} from "antd/es";
import { import {
DeleteOutlined, DeleteTwoTone, DeleteOutlined, DownOutlined,
EditTwoTone, ExclamationCircleOutlined, IssuesCloseOutlined,
ExclamationCircleOutlined, PlusOutlined, SmileOutlined,
PlusOutlined, StopOutlined,
SyncOutlined, SyncOutlined,
UndoOutlined UndoOutlined
} from '@ant-design/icons'; } from '@ant-design/icons';
@ -127,7 +128,8 @@ class User extends Component {
queryParams: queryParams queryParams: queryParams
}); });
this.loadTableData(queryParams).then(r => {}) this.loadTableData(queryParams).then(r => {
})
}; };
showDeleteConfirm(id, content) { showDeleteConfirm(id, content) {
@ -279,12 +281,34 @@ class User extends Component {
title: '操作', title: '操作',
key: 'action', key: 'action',
render: (text, record) => { render: (text, record) => {
const menu = (
<Menu>
<Menu.Item key="1">
<Button type="text" size='small'
onClick={() => this.showDeleteConfirm(record.id, record.name)}>禁用</Button>
</Menu.Item>
<Menu.Item key="2">
<Button type="text" size='small'
onClick={() => this.showDeleteConfirm(record.id, record.name)}>启用</Button>
</Menu.Item>
<Menu.Divider />
<Menu.Item key="3">
<Button type="text" size='small'
onClick={() => this.showDeleteConfirm(record.id, record.name)}>删除</Button>
</Menu.Item>
</Menu>
);
return ( return (
<div> <div>
<Button type="link" size='small' icon={<EditTwoTone/>} <Button type="link" size='small'
onClick={() => this.showModal('更新用户', record)}>编辑</Button> onClick={() => this.showModal('更新用户', record)}>编辑</Button>
<Button type="link" size='small' icon={<DeleteTwoTone/>} <Dropdown overlay={menu}>
onClick={() => this.showDeleteConfirm(record.id, record.name)}>删除</Button> <Button type="link" size='small'>
更多 <DownOutlined />
</Button>
</Dropdown>
</div> </div>
) )
}, },
@ -367,6 +391,52 @@ class User extends Component {
</Button> </Button>
</Tooltip> </Tooltip>
<Tooltip title="批量启用">
<Button type="dashed" danger disabled={!hasSelected} icon={<IssuesCloseOutlined />}
loading={this.state.delBtnLoading}
onClick={() => {
const content = <div>
您确定要启用选中的<Text style={{color: '#1890FF'}}
strong>{this.state.selectedRowKeys.length}</Text>
</div>;
confirm({
icon: <ExclamationCircleOutlined/>,
content: content,
onOk: () => {
},
onCancel() {
},
});
}}>
</Button>
</Tooltip>
<Tooltip title="批量禁用">
<Button type="default" danger disabled={!hasSelected} icon={<StopOutlined/>}
loading={this.state.delBtnLoading}
onClick={() => {
const content = <div>
您确定要禁用选中的<Text style={{color: '#1890FF'}}
strong>{this.state.selectedRowKeys.length}</Text>
</div>;
confirm({
icon: <ExclamationCircleOutlined/>,
content: content,
onOk: () => {
},
onCancel() {
},
});
}}>
</Button>
</Tooltip>
<Tooltip title="批量删除"> <Tooltip title="批量删除">
<Button type="primary" danger disabled={!hasSelected} icon={<DeleteOutlined/>} <Button type="primary" danger disabled={!hasSelected} icon={<DeleteOutlined/>}
loading={this.state.delBtnLoading} loading={this.state.delBtnLoading}