mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-09-06 14:44:42 +08:00
style: 样式调整
This commit is contained in:
parent
ade1e0cea2
commit
aceb043332
79 changed files with 705 additions and 514 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -14,3 +14,4 @@
|
|||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
/pkg/
|
||||
|
|
|
@ -101,7 +101,7 @@ func (f FileService) GetContent(op dto.FileOption) (dto.FileInfo, error) {
|
|||
if err != nil {
|
||||
return dto.FileInfo{}, err
|
||||
}
|
||||
return dto.FileInfo{*info}, nil
|
||||
return dto.FileInfo{FileInfo: *info}, nil
|
||||
}
|
||||
|
||||
func (f FileService) SaveContent(edit dto.FileEdit) error {
|
||||
|
@ -169,7 +169,7 @@ func (f FileService) FileDownload(d dto.FileDownload) (string, error) {
|
|||
|
||||
func getUuid() string {
|
||||
b := make([]byte, 16)
|
||||
io.ReadFull(rand.Reader, b)
|
||||
_, _ = io.ReadFull(rand.Reader, b)
|
||||
b[6] = (b[6] & 0x0f) | 0x40
|
||||
b[8] = (b[8] & 0x3f) | 0x80
|
||||
return fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
|
||||
|
|
2
backend/init/cache/badger_db/badger_db.go
vendored
2
backend/init/cache/badger_db/badger_db.go
vendored
|
@ -55,7 +55,7 @@ func (c *Cache) Get(key string) ([]byte, error) {
|
|||
result = append([]byte{}, val...)
|
||||
return nil
|
||||
})
|
||||
return nil
|
||||
return err
|
||||
})
|
||||
return result, err
|
||||
}
|
||||
|
|
22
backend/init/cache/cache.go
vendored
22
backend/init/cache/cache.go
vendored
|
@ -1,7 +1,6 @@
|
|||
package cache
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/1Panel-dev/1Panel/global"
|
||||
"github.com/1Panel-dev/1Panel/init/cache/badger_db"
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
|
@ -51,25 +50,4 @@ func Init() {
|
|||
}
|
||||
|
||||
global.CACHE = badger_db.NewCacheDB(cache)
|
||||
|
||||
err = cache.View(func(txn *badger.Txn) error {
|
||||
opts := badger.DefaultIteratorOptions
|
||||
opts.PrefetchValues = false
|
||||
it := txn.NewIterator(opts)
|
||||
defer it.Close()
|
||||
for it.Rewind(); it.Valid(); it.Next() {
|
||||
item := it.Item()
|
||||
k := item.Key()
|
||||
fmt.Printf("key=%s\n", k)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Printf("run gc")
|
||||
err = cache.RunValueLogGC(0.01)
|
||||
if err != nil {
|
||||
fmt.Printf(err.Error())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ func (p *PSession) Get(sessionID string) (SessionUser, error) {
|
|||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
json.Unmarshal(item, &result)
|
||||
_ = json.Unmarshal(item, &result)
|
||||
return result, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -50,10 +50,7 @@ func (f FileOp) DeleteDir(dst string) error {
|
|||
|
||||
func (f FileOp) Stat(dst string) bool {
|
||||
info, _ := f.Fs.Stat(dst)
|
||||
if info != nil {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
return info != nil
|
||||
}
|
||||
|
||||
func (f FileOp) DeleteFile(dst string) error {
|
||||
|
|
|
@ -22,6 +22,7 @@ type FileInfo struct {
|
|||
Size int64 `json:"size"`
|
||||
IsDir bool `json:"isDir"`
|
||||
IsSymlink bool `json:"isSymlink"`
|
||||
IsHidden bool `json:"isHidden"`
|
||||
LinkPath string `json:"linkPath"`
|
||||
Type string `json:"type"`
|
||||
Mode string `json:"mode"`
|
||||
|
@ -33,10 +34,11 @@ type FileInfo struct {
|
|||
}
|
||||
|
||||
type FileOption struct {
|
||||
Path string `json:"path"`
|
||||
Search string `json:"search"`
|
||||
Expand bool `json:"expand"`
|
||||
Dir bool `json:"dir"`
|
||||
Path string `json:"path"`
|
||||
Search string `json:"search"`
|
||||
Expand bool `json:"expand"`
|
||||
Dir bool `json:"dir"`
|
||||
ShowHidden bool `json:"showHidden"`
|
||||
}
|
||||
|
||||
func NewFileInfo(op FileOption) (*FileInfo, error) {
|
||||
|
@ -57,6 +59,7 @@ func NewFileInfo(op FileOption) (*FileInfo, error) {
|
|||
Size: info.Size(),
|
||||
IsSymlink: IsSymlink(info.Mode()),
|
||||
Extension: filepath.Ext(info.Name()),
|
||||
IsHidden: IsHidden(op.Path),
|
||||
Mode: fmt.Sprintf("%04o", info.Mode().Perm()),
|
||||
User: GetUsername(info.Sys().(*syscall.Stat_t).Uid),
|
||||
Group: GetGroup(info.Sys().(*syscall.Stat_t).Gid),
|
||||
|
@ -64,13 +67,10 @@ func NewFileInfo(op FileOption) (*FileInfo, error) {
|
|||
}
|
||||
if file.IsSymlink {
|
||||
file.LinkPath = GetSymlink(op.Path)
|
||||
}
|
||||
if op.Search != "" {
|
||||
|
||||
}
|
||||
if op.Expand {
|
||||
if file.IsDir {
|
||||
if err := file.listChildren(op.Dir); err != nil {
|
||||
if err := file.listChildren(op.Dir, op.ShowHidden); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return file, nil
|
||||
|
@ -83,7 +83,7 @@ func NewFileInfo(op FileOption) (*FileInfo, error) {
|
|||
return file, nil
|
||||
}
|
||||
|
||||
func (f *FileInfo) listChildren(dir bool) error {
|
||||
func (f *FileInfo) listChildren(dir, showHidden bool) error {
|
||||
afs := &afero.Afero{Fs: f.Fs}
|
||||
files, err := afs.ReadDir(f.Path)
|
||||
if err != nil {
|
||||
|
@ -98,6 +98,10 @@ func (f *FileInfo) listChildren(dir bool) error {
|
|||
name := df.Name()
|
||||
fPath := path.Join(f.Path, df.Name())
|
||||
|
||||
if !showHidden && IsHidden(name) {
|
||||
continue
|
||||
}
|
||||
|
||||
isSymlink, isInvalidLink := false, false
|
||||
if IsSymlink(df.Mode()) {
|
||||
isSymlink = true
|
||||
|
@ -117,6 +121,7 @@ func (f *FileInfo) listChildren(dir bool) error {
|
|||
FileMode: df.Mode(),
|
||||
IsDir: df.IsDir(),
|
||||
IsSymlink: isSymlink,
|
||||
IsHidden: IsHidden(fPath),
|
||||
Extension: filepath.Ext(name),
|
||||
Path: fPath,
|
||||
Mode: fmt.Sprintf("%04o", df.Mode().Perm()),
|
||||
|
|
|
@ -42,3 +42,9 @@ func GetSymlink(path string) string {
|
|||
}
|
||||
return linkPath
|
||||
}
|
||||
|
||||
const dotCharacter = 46
|
||||
|
||||
func IsHidden(path string) bool {
|
||||
return path[0] == dotCharacter
|
||||
}
|
||||
|
|
|
@ -29,9 +29,9 @@ module.exports = {
|
|||
// 不需要自动在文件开头插入 @prettier
|
||||
insertPragma: false,
|
||||
// 使用默认的折行标准
|
||||
proseWrap: 'preserve',
|
||||
proseWrap: 'never',
|
||||
// 根据显示样式决定 html 要不要折行
|
||||
htmlWhitespaceSensitivity: 'css',
|
||||
htmlWhitespaceSensitivity: 'ignore',
|
||||
// 换行符使用 lf
|
||||
endOfLine: 'auto',
|
||||
};
|
||||
|
|
|
@ -23,6 +23,7 @@ export namespace File {
|
|||
search?: string;
|
||||
expand: boolean;
|
||||
dir?: boolean;
|
||||
showHidden?: boolean;
|
||||
}
|
||||
|
||||
export interface FileTree {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
@font-face {
|
||||
font-family: "panel"; /* Project id 3575356 */
|
||||
src: url('iconfont.woff2?t=1661325242934') format('woff2'),
|
||||
url('iconfont.woff?t=1661325242934') format('woff'),
|
||||
url('iconfont.ttf?t=1661325242934') format('truetype'),
|
||||
url('iconfont.svg?t=1661325242934#panel') format('svg');
|
||||
src: url('iconfont.woff2?t=1662692062751') format('woff2'),
|
||||
url('iconfont.woff?t=1662692062751') format('woff'),
|
||||
url('iconfont.ttf?t=1662692062751') format('truetype'),
|
||||
url('iconfont.svg?t=1662692062751#panel') format('svg');
|
||||
}
|
||||
|
||||
.panel {
|
||||
|
@ -14,12 +14,72 @@
|
|||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.p-arrow-right:before {
|
||||
content: "\e665";
|
||||
.p-logout:before {
|
||||
content: "\e8fe";
|
||||
}
|
||||
|
||||
.p-terminal2:before {
|
||||
content: "\e82a";
|
||||
}
|
||||
|
||||
.p-yingwen:before {
|
||||
content: "\e6c3";
|
||||
}
|
||||
|
||||
.p-zhongwen:before {
|
||||
content: "\e6c8";
|
||||
}
|
||||
|
||||
.p-plan:before {
|
||||
content: "\e746";
|
||||
}
|
||||
|
||||
.p-database:before {
|
||||
content: "\e754";
|
||||
}
|
||||
|
||||
.p-rejected-order:before {
|
||||
content: "\e75e";
|
||||
}
|
||||
|
||||
.p-toolbox:before {
|
||||
content: "\e769";
|
||||
}
|
||||
|
||||
.p-website:before {
|
||||
content: "\e781";
|
||||
}
|
||||
|
||||
.p-config:before {
|
||||
content: "\e78e";
|
||||
}
|
||||
|
||||
.p-appstore1:before {
|
||||
content: "\e792";
|
||||
}
|
||||
|
||||
.p-log:before {
|
||||
content: "\e793";
|
||||
}
|
||||
|
||||
.p-host:before {
|
||||
content: "\e7b1";
|
||||
}
|
||||
|
||||
.p-home:before {
|
||||
content: "\e615";
|
||||
content: "\e7c6";
|
||||
}
|
||||
|
||||
.p-appstore:before {
|
||||
content: "\eb65";
|
||||
}
|
||||
|
||||
.p-docker:before {
|
||||
content: "\e659";
|
||||
}
|
||||
|
||||
.p-arrow-right:before {
|
||||
content: "\e665";
|
||||
}
|
||||
|
||||
.p-terminal:before {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -14,9 +14,39 @@
|
|||
/>
|
||||
<missing-glyph />
|
||||
|
||||
<glyph glyph-name="arrow-right" unicode="" d="M320 10.666667c-8.533333 0-17.066667 4.266667-23.466667 10.666666-12.8 12.8-10.666667 34.133333 2.133334 44.8L654.933333 384 298.666667 701.866667c-12.8 10.666667-14.933333 32-2.133334 44.8 10.666667 12.8 32 14.933333 44.8 2.133333l384-341.333333c6.4-6.4 10.666667-14.933333 10.666667-23.466667 0-8.533333-4.266667-17.066667-10.666667-23.466667l-384-341.333333c-6.4-6.4-12.8-8.533333-21.333333-8.533333z" horiz-adv-x="1024" />
|
||||
<glyph glyph-name="logout" unicode="" d="M610.87695313-11.5078125L149.45117213-11.5078125c-19.77539063 0-32.95898463 13.18359399-32.95898463 32.95898463L116.4921875 746.54882787c0 19.77539063 13.18359399 32.95898463 32.95898463 32.95898463l461.425781 0c19.77539063 0 32.95898463-13.18359399 32.95898462-32.95898463l0-230.71289088c0-19.77539063-13.18359399-32.95898463-32.95898462-32.95898464s-32.95898463 13.18359399-32.95898463 32.95898464L577.9179685 713.589844 182.410156 713.589844l0-659.17968724 395.5078125 0 0 197.75390625c0 19.77539063 13.18359399 32.95898463 32.95898463 32.95898464s32.95898463-13.18359399 32.95898462-32.95898464l0-230.71289088C643.83593775 1.675781499999971 630.65234375-11.5078125 610.87695313-11.5078125zM874.54882787 351.04101536999997L380.16406225 351.04101536999997c-19.77539063 0-32.95898463 13.18359399-32.95898464 32.95898463s13.18359399 32.95898463 32.95898464 32.95898463l494.38476562 0c19.77539063 0 32.95898463-13.18359399 32.95898463-32.95898463S894.3242185 351.04101536999997 874.54882787 351.04101536999997zM874.54882787 351.04101536999997c-9.88769531 0-16.47949193 3.29589869-23.07128931 9.88769531l-131.83593778 131.83593776c-13.18359399 13.18359399-13.18359399 32.95898463 0 46.14257787s32.95898463 13.18359399 46.14257788 0l131.83593775-131.83593774c13.18359399-13.18359399 13.18359399-32.95898463 0-46.14257789C891.02832057 354.33691406 884.43652318 351.04101536999997 874.54882787 351.04101536999997zM742.71289088 219.20507838000003c-9.88769531 0-16.47949193 3.29589869-23.07128932 9.88769531-13.18359399 13.18359399-13.18359399 32.95898463 0 46.14257787l131.83593776 131.83593776c13.18359399 13.18359399 32.95898463 13.18359399 46.14257787 0s13.18359399-32.95898463 0-46.14257787l-131.83593776-131.83593776C759.19238281 222.50097631000006 752.60058619 219.20507838000003 742.71289088 219.20507838000003z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="home" unicode="" d="M952.425495 660.2478590000001L536.893002 889.551637a51.586902 51.586902 0 0 1-49.781361 0L70.54741 660.2478590000001a51.586902 51.586902 0 0 1-25.793451-45.396474v-691.264483a51.586902 51.586902 0 0 1 51.586901-51.586902h210.216625a51.586902 51.586902 0 0 1 51.586902 51.586902V188.48564199999998a51.586902 51.586902 0 0 0 51.586902 51.586902h204.284131a51.586902 51.586902 0 0 0 51.586901-51.586902V-76.41309799999999a51.586902 51.586902 0 0 1 51.586902-51.586902h210.474559a51.586902 51.586902 0 0 1 51.586902 51.586902V614.8513849999999a51.586902 51.586902 0 0 1-26.825189 45.396474z" horiz-adv-x="1024" />
|
||||
<glyph glyph-name="terminal2" unicode="" d="M366.272 334.272l-266.272-266.272q-5.728-5.728-13.152-5.728t-13.152 5.728l-28.576 28.576q-5.728 5.728-5.728 13.152t5.728 13.152l224.576 224.576-224.576 224.576q-5.728 5.728-5.728 13.152t5.728 13.152l28.576 28.576q5.728 5.728 13.152 5.728t13.152-5.728l266.272-266.272q5.728-5.728 5.728-13.152t-5.728-13.152zM982.848 73.152l0-36.576q0-8-5.152-13.152t-13.152-5.152l-548.576 0q-8 0-13.152 5.152t-5.152 13.152l0 36.576q0 8 5.152 13.152t13.152 5.152l548.576 0q8 0 13.152-5.152t5.152-13.152z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="yingwen" unicode="" d="M827.446642 168.450665h-80.351338v155.002256c0 32.799081-1.717712 54.027541-5.13146 63.654674a44.548518 44.548518 0 0 1-16.758075 22.435012 47.68411 47.68411 0 0 1-27.895204 8.019601c-13.911478 0-26.358114-3.802085-37.448282-11.45683-11.057656-7.611395-18.672664-17.713563-22.742069-30.306503-4.096499-12.594746-6.142942-35.880486-6.142942-69.78136v-137.56685H550.625935V472.182188h74.640081v-44.620767c26.50803 34.334365 59.854395 51.468133 100.078832 51.468133 17.758718 0 33.938804-3.186166 48.614311-9.55669 14.686345-6.404843 25.812637-14.529204 33.319272-24.45075 7.542759-9.91974 12.811492-21.159824 15.73395-33.75457 2.935101-12.594746 4.436067-30.602722 4.436067-54.07089l-0.001806-188.745989zM197.680437 168.450665V587.720425h310.875109v-70.910245H282.319732v-92.980402h210.491026v-70.659181H282.319732v-114.062557h234.255414v-70.657375h-318.85136z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="zhongwen" unicode="" d="M555.231787 565.796571v107.997284h-68.202727v-108.038827H263.433935v-273.457531H487.02906v-210.976899h68.202727V292.29569h224.21827V565.796571H555.231787z m-68.202727-209.074952h-157.337694v144.605675h157.335888v-144.605675z m226.131053 0H555.195662v144.605675h157.962645v-144.605675z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="plan" unicode="" d="M234.666667 682.666667h57.706666v-63.978667L234.666667 618.666667v-106.666667h554.666666v106.666667h-55.232v64H789.333333a64 64 0 0 0 64-64v-512a64 64 0 0 0-64-64H234.666667a64 64 0 0 0-64 64V618.666667a64 64 0 0 0 64 64z m554.666666-234.666667H234.666667v-341.333333h554.666666V448z m-384-192v-64h-106.666666v64h106.666666z m160 0v-64h-106.666666v64h106.666666z m160 0v-64h-106.666666v64h106.666666z m-320 128v-64h-106.666666v64h106.666666z m160 0v-64h-106.666666v64h106.666666z m160 0v-64h-106.666666v64h106.666666zM697.728 725.333333v-106.666666h-64.021333V725.333333h64z m-104.170667-42.666666v-64l-160.618666 0.021333V682.666667h160.618666z m-197.013333 42.666666v-106.666666h-64V725.333333h64z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="database" unicode="" d="M94.64086164 251.18037332999995l146.54173153-70.34521008 270.97275142-131.24028917 261.3154951 126.60584297 156.27666015 74.85020205a77.6722963 77.6722963 0 0 0-36.35063467-103.12291791l-347.37639939-168.23819378a77.6722963 77.6722963 0 0 0-67.73024237 0L130.91382401 147.92800119000003A77.6722963 77.6722963 0 0 0 94.64086164 251.18037332999995z m834.77005866 162.54222578a77.6722963 77.6722963 0 0 0-36.01405513-103.82196978L545.99457541 141.66243555000005a77.6722963 77.6722963 0 0 0-67.73024236 0L130.91382401 309.90062933A77.6722963 77.6722963 0 0 0 93.08741571 409.63185778l384.73677392-181.46837451 34.33115496-16.62187141 347.3763994 168.23819378-0.18123496 0.0776723 70.06041127 33.83922961zM546.02046578 779.89569422l347.35050904-168.21230341a77.6722963 77.6722963 0 0 0 0-139.81013334l-347.35050904-168.23819378a77.6722963 77.6722963 0 0 0-67.73024237 0L130.91382401 471.87325747a77.6722963 77.6722963 0 0 0 0 139.81013334L478.29022341 779.86980386a77.6722963 77.6722963 0 0 0 67.73024237 0z m-33.86512119-69.90506667l-347.3763994-168.21230341 347.3763994-168.23819378 347.3763994 168.23819378-347.3763994 168.21230341z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="rejected-order" unicode="" d="M810.666667 256a64 64 0 0 0 64-64v-128a64 64 0 0 0-64-64h-149.333334a64 64 0 0 0-64 64v128a64 64 0 0 0 64 64h149.333334zM298.666667 704h42.666666v-63.978667L298.666667 640v-533.333333h256v-64H298.666667a64 64 0 0 0-64 64V640a64 64 0 0 0 64 64z m512-512h-149.333334v-128h149.333334v128z m-21.333334-32v-64h-105.898666v64H789.333333zM725.333333 704a64 64 0 0 0 64-64v-341.333333h-64V640h-42.666666V704h42.666666z m-170.666666-341.333333v-64h-192v64h192z m106.666666 128v-64H362.666667v64h298.666666zM576 768a64 64 0 0 0 64-64v-42.666667a64 64 0 0 0-64-64h-128a64 64 0 0 0-64 64V704a64 64 0 0 0 64 64h128z m0-64h-128v-42.666667h128V704z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="toolbox" unicode="" d="M261.68888853 611.5555552000001v-68.26666667h-68.26666666v-113.77777706h637.15555626v113.77777706h-68.26666666v68.26666667h68.26666666a68.26666667 68.26666667 0 0 0 68.26666667-68.26666667v-455.1111104a68.26666667 68.26666667 0 0 0-68.26666667-68.26666666H193.42222187a68.26666667 68.26666667 0 0 0-68.26666667 68.26666666V543.28888853a68.26666667 68.26666667 0 0 0 68.26666667 68.26666667h68.26666666z m568.8888896-250.3111104h-204.8v-136.53333333H398.22222187v136.53333333h-204.8v-273.06666667h637.15555626V361.2444448z m-273.06666666 0h-91.02222294v-68.26666667h91.02222294v68.26666667z m91.02222186 409.6a68.26666667 68.26666667 0 0 0 68.26666667-68.26666667v-159.2888896H307.2v159.2888896a68.26666667 68.26666667 0 0 0 68.26666667 68.26666667h273.06666666z m0-68.26666667H375.46666667v-91.02222293h273.06666666v91.02222293z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="website" unicode="" d="M854.4 95.10000000000002c0.2 0.3 0.5 0.6 0.7 0.9C920.6 173.89999999999998 960 274.29999999999995 960 384s-39.4 210.1-104.8 288c-0.2 0.3-0.5 0.5-0.7 0.8-1.1 1.3-2.1 2.5-3.2 3.7-0.4 0.5-0.8 0.9-1.2 1.4-1.4 1.6-2.7 3.1-4.1 4.7l-0.1 0.1c-1.5 1.7-3.1 3.4-4.6 5.1l-0.1 0.1c-3.2 3.4-6.4 6.8-9.7 10.1l-0.1 0.1-4.8 4.8-0.3 0.3c-1.5 1.5-3 2.9-4.5 4.3-0.5 0.5-1 1-1.6 1.5-1 1-2 1.9-3 2.8-0.3 0.3-0.7 0.6-1 1C736.4 786.8 629.5 832 512 832s-224.4-45.2-304.3-119.2c-0.3-0.3-0.7-0.6-1-1-1-0.9-2-1.9-3-2.9-0.5-0.5-1-1-1.6-1.5-1.5-1.4-3-2.9-4.5-4.3l-0.3-0.3-4.8-4.8-0.1-0.1c-3.3-3.3-6.5-6.7-9.7-10.1l-0.1-0.1c-1.6-1.7-3.1-3.4-4.6-5.1l-0.1-0.1c-1.4-1.5-2.8-3.1-4.1-4.7-0.4-0.5-0.8-0.9-1.2-1.4-1.1-1.2-2.1-2.5-3.2-3.7-0.2-0.3-0.5-0.5-0.7-0.8C103.4 594.1 64 493.7 64 384s39.4-210.1 104.8-288c0.2-0.3 0.5-0.6 0.7-0.9 1-1.2 2.1-2.5 3.1-3.7 0.4-0.5 0.8-0.9 1.2-1.4 1.4-1.6 2.7-3.1 4.1-4.7 0-0.1 0.1-0.1 0.1-0.2 1.5-1.7 3-3.4 4.6-5l0.1-0.1c3.2-3.4 6.4-6.8 9.6-10.1l0.1-0.1c1.6-1.6 3.1-3.2 4.7-4.7l0.3-0.3c3.3-3.3 6.7-6.5 10.1-9.6 80.1-74 187-119.2 304.5-119.2s224.4 45.2 304.3 119.2c3.4 3.1 6.7 6.3 10 9.6l0.3 0.3c1.6 1.6 3.2 3.1 4.7 4.7l0.1 0.1c3.3 3.3 6.5 6.7 9.6 10.1l0.1 0.1c1.5 1.7 3.1 3.3 4.6 5 0 0.1 0.1 0.1 0.1 0.2 1.4 1.5 2.8 3.1 4.1 4.7 0.4 0.5 0.8 0.9 1.2 1.4 1.2 1.3 2.3 2.5 3.3 3.7z m4.1 142.6c-13.8-32.6-32-62.8-54.2-90.2-24.9 21.5-52.2 40.3-81.5 55.9 11.6 46.9 18.8 98.4 20.7 152.6H887c-3-40.9-12.6-80.6-28.5-118.3zM887 412H743.5c-1.9 54.2-9.1 105.7-20.7 152.6 29.3 15.6 56.6 34.4 81.5 55.9 22.2-27.4 40.4-57.6 54.2-90.2C874.4 492.6 884 452.9 887 412zM658.3 730.5c39.7-16.8 75.8-40 107.6-69.2-18.5-15.8-38.4-29.7-59.4-41.8-15.7 45-35.8 84.1-59.2 115.4 3.7-1.4 7.4-2.9 11-4.4z m-90.6-700.6c-9.2-7.2-18.4-12.7-27.7-16.4V199c39.9-2.8 78.6-11.6 115.7-26.2-8.3-24.6-17.9-47.3-29-67.8-17.4-32.4-37.8-58.3-59-75.1z m59 633.1c11-20.6 20.7-43.3 29-67.8-37.1-14.6-75.8-23.4-115.7-26.2V754.4c9.2-3.7 18.5-9.1 27.7-16.4 21.2-16.7 41.6-42.6 59-75zM540 255.10000000000002V356h147.5c-1.6-44.2-7.1-87.1-16.3-127.8l-0.3-1.2c-41.1 15.6-85.1 25.3-130.9 28.1z m0 156.9V512.9c45.8 2.8 89.8 12.5 130.9 28.1l0.3-1.2c9.2-40.7 14.7-83.5 16.3-127.8H540z m-56-56v-100.9c-45.8-2.8-89.8-12.5-130.9-28.1l-0.3 1.2c-9.2 40.7-14.7 83.5-16.3 127.8H484z m-147.5 56c1.6 44.2 7.1 87.1 16.3 127.8l0.3 1.2c41.1-15.6 85-25.3 130.9-28.1V412H336.5zM484 199v-185.4c-9.2 3.7-18.5 9.1-27.7 16.4-21.2 16.7-41.7 42.7-59.1 75.1-11 20.6-20.7 43.3-29 67.8 37.2 14.6 75.9 23.3 115.8 26.1z m0 370c-39.9 2.8-78.6 11.6-115.7 26.2 8.3 24.6 17.9 47.3 29 67.8 17.4 32.4 37.8 58.4 59.1 75.1 9.2 7.2 18.4 12.7 27.7 16.4V569zM365.7 730.5c3.7 1.5 7.3 3 11 4.4-23.4-31.3-43.5-70.4-59.2-115.4-21 12-40.9 26-59.4 41.8 31.8 29.2 67.9 52.4 107.6 69.2zM165.5 530.3c13.8 32.6 32 62.8 54.2 90.2 24.9-21.5 52.2-40.3 81.5-55.9-11.6-46.9-18.8-98.4-20.7-152.6H137c3 40.9 12.6 80.6 28.5 118.3zM137 356h143.5c1.9-54.2 9.1-105.7 20.7-152.6-29.3-15.6-56.6-34.4-81.5-55.9-22.2 27.4-40.4 57.6-54.2 90.2C149.6 275.4 140 315.1 137 356z m228.7-318.5c-39.7 16.8-75.8 40-107.6 69.2 18.5 15.8 38.4 29.7 59.4 41.8 15.7-45 35.8-84.1 59.2-115.4-3.7 1.4-7.4 2.9-11 4.4z m292.6 0c-3.7-1.5-7.3-3-11-4.4 23.4 31.3 43.5 70.4 59.2 115.4 21-12 40.9-26 59.4-41.8-31.8-29.2-67.9-52.4-107.6-69.2z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="config" unicode="" d="M924.8 270.29999999999995l-65.5 56c3.1 19 4.7 38.4 4.7 57.8s-1.6 38.8-4.7 57.8l65.5 56c10.1 8.6 13.8 22.6 9.3 35.2l-0.9 2.6c-18.1 50.5-44.9 96.9-79.7 137.9l-1.8 2.1c-8.6 10.1-22.5 13.9-35.1 9.5l-81.3-28.9c-30 24.6-63.5 44-99.7 57.6l-15.7 85c-2.4 13.1-12.7 23.3-25.8 25.7l-2.7 0.5c-52.1 9.4-106.9 9.4-159 0l-2.7-0.5c-13.1-2.4-23.4-12.6-25.8-25.7l-15.8-85.4c-35.9-13.6-69.2-32.9-99-57.4l-81.9 29.1c-12.5 4.4-26.5 0.7-35.1-9.5l-1.8-2.1c-34.8-41.1-61.6-87.5-79.7-137.9l-0.9-2.6c-4.5-12.5-0.8-26.5 9.3-35.2l66.3-56.6c-3.1-18.8-4.6-38-4.6-57.1 0-19.2 1.5-38.4 4.6-57.1L99 270.5c-10.1-8.6-13.8-22.6-9.3-35.2l0.9-2.6c18.1-50.4 44.9-96.9 79.7-137.9l1.8-2.1c8.6-10.1 22.5-13.9 35.1-9.5l81.9 29.1c29.8-24.5 63.1-43.9 99-57.4l15.8-85.4c2.4-13.1 12.7-23.3 25.8-25.7l2.7-0.5c26.1-4.7 52.8-7.1 79.5-7.1 26.7 0 53.5 2.4 79.5 7.1l2.7 0.5c13.1 2.4 23.4 12.6 25.8 25.7l15.7 85c36.2 13.6 69.7 32.9 99.7 57.6l81.3-28.9c12.5-4.4 26.5-0.7 35.1 9.5l1.8 2.1c34.8 41.1 61.6 87.5 79.7 137.9l0.9 2.6c4.5 12.3 0.8 26.3-9.3 35zM788.3 430.1c2.5-15.1 3.8-30.6 3.8-46.1s-1.3-31-3.8-46.1l-6.6-40.1 74.7-63.9c-11.3-26.1-25.6-50.7-42.6-73.6L721 193.20000000000005l-31.4-25.8c-23.9-19.6-50.5-35-79.3-45.8l-38.1-14.3-17.9-97c-28.1-3.2-56.8-3.2-85 0l-17.9 97.2-37.8 14.5c-28.5 10.8-55 26.2-78.7 45.7l-31.4 25.9-93.4-33.2c-17 22.9-31.2 47.6-42.6 73.6l75.5 64.5-6.5 40c-2.4 14.9-3.7 30.3-3.7 45.5 0 15.3 1.2 30.6 3.7 45.5l6.5 40-75.5 64.5c11.3 26.1 25.6 50.7 42.6 73.6l93.4-33.2 31.4 25.9c23.7 19.5 50.2 34.9 78.7 45.7l37.9 14.3 17.9 97.2c28.1 3.2 56.8 3.2 85 0l17.9-97 38.1-14.3c28.7-10.8 55.4-26.2 79.3-45.8l31.4-25.8 92.8 32.9c17-22.9 31.2-47.6 42.6-73.6L781.8 470l6.5-39.9zM512 570c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z m79.2-255.2C570 293.70000000000005 541.9 282 512 282c-29.9 0-58 11.7-79.2 32.8C411.7 336 400 364.1 400 394c0 29.9 11.7 58 32.8 79.2C454 494.4 482.1 506 512 506c29.9 0 58-11.6 79.2-32.8C612.3 452 624 423.9 624 394c0-29.9-11.7-58-32.8-79.2z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="appstore1" unicode="" d="M464 752H160c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V736c0 8.8-7.2 16-16 16z m-52-268H212V684h200v-200zM864 752H560c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V736c0 8.8-7.2 16-16 16z m-52-268H612V684h200v-200zM464 352H160c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V336c0 8.8-7.2 16-16 16z m-52-268H212V284h200v-200zM864 352H560c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V336c0 8.8-7.2 16-16 16z m-52-268H612V284h200v-200z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="log" unicode="" d="M857 759H167c-16.59375 0-30-13.40625-30-30v-690c0-16.59375 13.40625-30 30-30h690c16.59375 0 30 13.40625 30 30V729c0 16.59375-13.40625 30-30 30z m-37.5-682.5H204.5V691.5h615v-615zM493.25 489h172.5c4.125 0 7.5 3.375 7.5 7.5v45c0 4.125-3.375 7.5-7.5 7.5H493.25c-4.125 0-7.5-3.375-7.5-7.5v-45c0-4.125 3.375-7.5 7.5-7.5zM493.25 354h172.5c4.125 0 7.5 3.375 7.5 7.5v45c0 4.125-3.375 7.5-7.5 7.5H493.25c-4.125 0-7.5-3.375-7.5-7.5v-45c0-4.125 3.375-7.5 7.5-7.5zM493.25 219h172.5c4.125 0 7.5 3.375 7.5 7.5v45c0 4.125-3.375 7.5-7.5 7.5H493.25c-4.125 0-7.5-3.375-7.5-7.5v-45c0-4.125 3.375-7.5 7.5-7.5zM388.25 519m-37.5 0a37.5 37.5 0 1 1 75 0 37.5 37.5 0 1 1-75 0ZM388.25 384m-37.5 0a37.5 37.5 0 1 1 75 0 37.5 37.5 0 1 1-75 0ZM388.25 249m-37.5 0a37.5 37.5 0 1 1 75 0 37.5 37.5 0 1 1-75 0Z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="host" unicode="" d="M832 832H192c-17.7 0-32-14.3-32-32v-832c0-17.7 14.3-32 32-32h640c17.7 0 32 14.3 32 32V800c0 17.7-14.3 32-32 32z m-600-72h560v-208H232V760z m560-480H232V488h560v-208z m0-272H232V216h560v-208zM496 688H312c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8zM312 352h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H312c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8zM680 108m-40 0a40 40 0 1 1 80 0 40 40 0 1 1-80 0Z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="home" unicode="" d="M946.5 391L560.1 777.2l-25.9 25.9c-12.3 12.2-32.1 12.2-44.4 0L77.5 391c-12.3-12.3-18.9-28.6-18.8-46 0.4-35.2 29.7-63.3 64.9-63.3h42.5V-44h691.8V281.70000000000005h43.4c17.1 0 33.2 6.7 45.3 18.8 12.1 12.1 18.7 28.2 18.7 45.3 0 17-6.7 33.1-18.8 45.2zM568 28H456V232h112v-204z m217.9 325.7V28H632V256c0 22.1-17.9 40-40 40H432c-22.1 0-40-17.9-40-40v-228H238.1V353.70000000000005h-96l370 369.7 23.1-23.1L882 353.70000000000005h-96.1z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="appstore" unicode="" d="M464 752H160c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V736c0 8.8-7.2 16-16 16z m-52-268H212V684h200v-200z m452 268H560c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V736c0 8.8-7.2 16-16 16z m-52-268H612V684h200v-200zM464 352H160c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V336c0 8.8-7.2 16-16 16z m-52-268H212V284h200v-200z m452 268H560c-8.8 0-16-7.2-16-16v-304c0-8.8 7.2-16 16-16h304c8.8 0 16 7.2 16 16V336c0 8.8-7.2 16-16 16z m-52-268H612V284h200v-200z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="docker" unicode="" d="M205.653333 158.933333c-29.184 0-55.637333 23.893333-55.637333 52.906667s23.893333 53.034667 55.68 53.034667c31.914667 0 55.893333-23.893333 55.893333-52.992s-26.538667-52.906667-55.68-52.906667z m683.178667 288.554667c-5.76 42.325333-32 76.8-66.56 103.253333l-13.44 10.666667-10.837333-13.226667c-21.077333-23.893333-29.44-66.261333-26.88-97.92 2.56-23.978667 10.24-47.786667 23.637333-66.304-10.837333-5.546667-24.234667-10.666667-34.56-16.085333a225.706667 225.706667 0 0 0-71.68-10.666667H4.138667l-2.56-15.786666a297.813333 297.813333 0 0 1 23.978666-151.04l10.410667-18.56v-2.56c64-105.941333 177.92-153.6 301.994667-153.6 238.677333 0 434.432 103.253333 527.232 325.674666 60.8-2.645333 122.197333 13.226667 151.04 71.509334l7.68 13.226666-12.8 7.978667c-34.56 21.077333-81.92 23.893333-121.6 13.226667l-0.768-0.085334z m-341.674667 42.325333h-103.594666v-103.253333h103.68V489.898667l-0.085334-0.128z m0 129.834667h-103.594666v-103.253333h103.68V619.52l-0.085334 0.128z m0 132.437333h-103.594666v-103.253333h103.68v103.253333h-0.085334z m126.72-262.272H570.88v-103.253333h103.253333V489.898667l-0.298666-0.128z m-383.914666 0H187.008v-103.253333h103.338667V489.898667l-0.426667-0.128z m129.28 0h-102.4v-103.253333H419.84V489.898667l-0.64-0.128z m-257.28 0H59.733333v-103.253333h103.594667V489.898667l-1.28-0.128z m257.28 129.834667h-102.4v-103.253333H419.84V619.52l-0.64 0.128z m-129.92 0H187.178667v-103.253333H290.133333V619.52l-0.682666 0.128z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="arrow-right" unicode="" d="M320 10.666667c-8.533333 0-17.066667 4.266667-23.466667 10.666666-12.8 12.8-10.666667 34.133333 2.133334 44.8L654.933333 384 298.666667 701.866667c-12.8 10.666667-14.933333 32-2.133334 44.8 10.666667 12.8 32 14.933333 44.8 2.133333l384-341.333333c6.4-6.4 10.666667-14.933333 10.666667-23.466667 0-8.533333-4.266667-17.066667-10.666667-23.466667l-384-341.333333c-6.4-6.4-12.8-8.533333-21.333333-8.533333z" horiz-adv-x="1024" />
|
||||
|
||||
<glyph glyph-name="terminal" unicode="" d="M89.6 89.6h844.8V678.4H89.6v-588.8zM0 768h1024v-768H0V768z m242.816-577.536L192 241.28l154.304 154.368L192 549.952l50.816 50.816L448 395.648l-205.184-205.184z m584.32-13.248H512V256h315.072v-78.72z" horiz-adv-x="1024" />
|
||||
|
||||
|
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 32 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 6.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 723 B |
BIN
frontend/src/assets/images/user.png
Normal file
BIN
frontend/src/assets/images/user.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5 KiB |
|
@ -3,7 +3,7 @@
|
|||
<slot></slot>
|
||||
</div>
|
||||
<div class="footer flx-center">
|
||||
<a href="http://www.spicyboy.cn/" target="_blank"> 2022 © 1Panel By 飞致云. </a>
|
||||
<a href="http://www.spicyboy.cn/" target="_blank">2022 © 1Panel By 飞致云.</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -1,69 +0,0 @@
|
|||
<template>
|
||||
<el-dropdown trigger="click">
|
||||
<div class="avatar">
|
||||
<img src="@/assets/images/avatar.gif" alt="avatar" />
|
||||
</div>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="openDialog('infoRef')">{{
|
||||
$t('commons.header.personalData')
|
||||
}}</el-dropdown-item>
|
||||
<el-dropdown-item @click="openDialog('passwordRef')">{{
|
||||
$t('commons.header.changePassword')
|
||||
}}</el-dropdown-item>
|
||||
<el-dropdown-item @click="logout" divided>{{ $t('commons.header.logout') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
<InfoDialog ref="infoRef"></InfoDialog>
|
||||
<PasswordDialog ref="passwordRef"></PasswordDialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import InfoDialog from './info-dialog.vue';
|
||||
import PasswordDialog from './password-dialog.vue';
|
||||
import { ElMessageBox, ElMessage } from 'element-plus';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { GlobalStore } from '@/store';
|
||||
import { logOutApi } from '@/api/modules/login';
|
||||
import i18n from '@/lang';
|
||||
|
||||
const router = useRouter();
|
||||
const globalStore = GlobalStore();
|
||||
|
||||
const logout = () => {
|
||||
ElMessageBox.confirm(i18n.global.t('commons.msg.sureLogOut'), i18n.global.t('commons.msg.infoTitle'), {
|
||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
systemLogOut();
|
||||
router.push({ name: 'login' });
|
||||
globalStore.setLogStatus(false);
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: i18n.global.t('commons.msg.operationSuccess'),
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const systemLogOut = async () => {
|
||||
await logOutApi();
|
||||
};
|
||||
|
||||
interface DialogExpose {
|
||||
openDialog: () => void;
|
||||
}
|
||||
const infoRef = ref<null | DialogExpose>(null);
|
||||
const passwordRef = ref<null | DialogExpose>(null);
|
||||
|
||||
const openDialog = (refName: string) => {
|
||||
if (refName == 'infoRef') return infoRef.value?.openDialog();
|
||||
passwordRef.value?.openDialog();
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '../index.scss';
|
||||
</style>
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<el-icon class="collapse-icon" @click="menuStore.setCollapse()">
|
||||
<el-icon :size="25" class="collapse-icon" @click="menuStore.setCollapse()">
|
||||
<component :is="isCollapse ? 'expand' : 'fold'"></component>
|
||||
</el-icon>
|
||||
</template>
|
||||
|
@ -12,5 +12,9 @@ const isCollapse = computed((): boolean => menuStore.isCollapse);
|
|||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '../index.scss';
|
||||
// @import '../index.scss';
|
||||
|
||||
.collapse-icon {
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
<template>
|
||||
<el-dialog v-model="dialogVisible" :title="$t('commons.header.personalData')" width="500px" draggable>
|
||||
<span>This is userInfo</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
const dialogVisible = ref(false);
|
||||
|
||||
// openDialog
|
||||
const openDialog = () => {
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
defineExpose({
|
||||
openDialog,
|
||||
});
|
||||
</script>
|
|
@ -1,44 +0,0 @@
|
|||
<template>
|
||||
<el-dropdown trigger="click" @command="handleSetLanguage">
|
||||
<span>
|
||||
<el-tooltip effect="dark" :content="$t('commons.header.language')" placement="bottom">
|
||||
<i :class="'panel p-language'" class="icon-style"></i>
|
||||
</el-tooltip>
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item :disabled="language && language === 'zh'" command="zh">{{
|
||||
$t('commons.header.zh')
|
||||
}}</el-dropdown-item>
|
||||
<el-dropdown-item :disabled="language === 'en'" command="en">{{
|
||||
$t('commons.header.en')
|
||||
}}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { GlobalStore } from '@/store';
|
||||
import { getBrowserLang } from '@/utils/util';
|
||||
|
||||
const i18n = useI18n();
|
||||
const globalStore = GlobalStore();
|
||||
const language = computed((): string => globalStore.language);
|
||||
|
||||
// 切换语言
|
||||
const handleSetLanguage = (lang: string) => {
|
||||
i18n.locale.value = lang;
|
||||
globalStore.updateLanguage(lang);
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
handleSetLanguage(language.value || getBrowserLang());
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '../index.scss';
|
||||
</style>
|
|
@ -10,8 +10,11 @@
|
|||
</el-divider>
|
||||
<div class="theme-item">
|
||||
<span>{{ $t('commons.header.themeColor') }}</span>
|
||||
<el-color-picker v-model="themeConfig.primary" :predefine="colorList" @change="changePrimary">
|
||||
</el-color-picker>
|
||||
<el-color-picker
|
||||
v-model="themeConfig.primary"
|
||||
:predefine="colorList"
|
||||
@change="changePrimary"
|
||||
></el-color-picker>
|
||||
</div>
|
||||
<div class="theme-item">
|
||||
<span>{{ $t('commons.header.darkTheme') }}</span>
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
<template>
|
||||
<el-dialog v-model="dialogVisible" :title="$t('commons.header.changePassword')" width="500px" draggable>
|
||||
<span>This is Password</span>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = false">{{ $t('commons.button.confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
const dialogVisible = ref(false);
|
||||
|
||||
// openDialog
|
||||
const openDialog = () => {
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
defineExpose({
|
||||
openDialog,
|
||||
});
|
||||
</script>
|
|
@ -4,27 +4,12 @@
|
|||
<CollapseIcon id="collapseIcon"></CollapseIcon>
|
||||
<Breadcrumb id="breadcrumb" v-if="themeConfig.breadcrumb"></Breadcrumb>
|
||||
</div>
|
||||
<div class="header-ri flx-center">
|
||||
<div class="header-icon">
|
||||
<!-- Language -->
|
||||
<Language id="language"></Language>
|
||||
<!-- Theme -->
|
||||
<Theme id="theme"></Theme>
|
||||
</div>
|
||||
<!-- User name -->
|
||||
<span class="username">1Panel</span>
|
||||
<!-- Avatar -->
|
||||
<Avatar></Avatar>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
import CollapseIcon from './components/collapseicon.vue';
|
||||
import Breadcrumb from './components/breadcrumb.vue';
|
||||
import Language from './components/language.vue';
|
||||
import Theme from './components/theme.vue';
|
||||
import Avatar from './components/avatar.vue';
|
||||
import { GlobalStore } from '@/store';
|
||||
|
||||
const globalStore = GlobalStore();
|
||||
|
|
|
@ -3,29 +3,23 @@
|
|||
<el-sub-menu v-if="subItem.children && subItem.children.length > 1" :index="subItem.path">
|
||||
<template #title>
|
||||
<el-icon>
|
||||
<component :is="subItem.meta?.icon"></component>
|
||||
<SvgIcon :iconName="(subItem.meta?.icon as string)" :className="'svg-icon'"></SvgIcon>
|
||||
</el-icon>
|
||||
<span>{{ subItem.meta?.title }}</span>
|
||||
<span>{{ $t(subItem.meta?.title as string) }}</span>
|
||||
</template>
|
||||
<SubItem :menuList="subItem.children" />
|
||||
</el-sub-menu>
|
||||
<el-menu-item v-else-if="subItem.children && subItem.children.length === 1" :index="subItem.children[0].path">
|
||||
<el-icon>
|
||||
<component :is="subItem.meta?.icon"></component>
|
||||
<SvgIcon :iconName="(subItem.meta?.icon as string)" :className="'svg-icon'"></SvgIcon>
|
||||
</el-icon>
|
||||
<template v-if="!subItem.meta?.isLink" #title>
|
||||
<template #title>
|
||||
<span>{{ $t(subItem.meta?.title as string) }}</span>
|
||||
</template>
|
||||
</el-menu-item>
|
||||
<el-menu-item v-else :index="subItem.path">
|
||||
<el-icon>
|
||||
<component :is="subItem.meta?.icon"></component>
|
||||
</el-icon>
|
||||
<template v-if="!subItem.meta?.isLink" #title>
|
||||
<span>{{ subItem.meta?.title }}</span>
|
||||
</template>
|
||||
<template v-else #title>
|
||||
<a class="menu-href" :href="subItem.isLink" target="_blank">{{ subItem.meta?.title }}</a>
|
||||
<template #title>
|
||||
<span style="margin-left: 10px">{{ $t(subItem.meta?.title as string) }}</span>
|
||||
</template>
|
||||
</el-menu-item>
|
||||
</template>
|
||||
|
@ -33,6 +27,7 @@
|
|||
|
||||
<script setup lang="ts">
|
||||
import { RouteRecordRaw } from 'vue-router';
|
||||
import SvgIcon from '@/components/svg-icon/svg-icon.vue';
|
||||
|
||||
defineProps<{ menuList: RouteRecordRaw[] }>();
|
||||
</script>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<template>
|
||||
<div
|
||||
class="menu"
|
||||
:style="{ width: isCollapse ? '65px' : '220px' }"
|
||||
:style="{ width: isCollapse ? '65px' : '180px' }"
|
||||
element-loading-text="Loading..."
|
||||
:element-loading-spinner="loadingSvg"
|
||||
element-loading-svg-view-box="-10, -10, 50, 50"
|
||||
|
@ -20,6 +20,14 @@
|
|||
active-text-color="#fff"
|
||||
>
|
||||
<SubItem :menuList="routerMenus"></SubItem>
|
||||
<el-menu-item>
|
||||
<el-icon>
|
||||
<SvgIcon :iconName="'p-logout'" :className="'svg-icon'"></SvgIcon>
|
||||
</el-icon>
|
||||
<template #title>
|
||||
<span @click="logout">{{ $t('commons.header.logout') }}</span>
|
||||
</template>
|
||||
</el-menu-item>
|
||||
</el-menu>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
|
@ -32,9 +40,14 @@ import { MenuStore } from '@/store/modules/menu';
|
|||
import { loadingSvg } from '@/utils/svg';
|
||||
import Logo from './components/logo.vue';
|
||||
import SubItem from './components/sub-item.vue';
|
||||
import { menuList } from '@/routers/router';
|
||||
import router, { menuList } from '@/routers/router';
|
||||
import { logOutApi } from '@/api/modules/login';
|
||||
import i18n from '@/lang';
|
||||
import { ElMessageBox, ElMessage } from 'element-plus';
|
||||
import { GlobalStore } from '@/store';
|
||||
const route = useRoute();
|
||||
const menuStore = MenuStore();
|
||||
const globalStore = GlobalStore();
|
||||
|
||||
onMounted(async () => {
|
||||
menuStore.setMenuList(menuList);
|
||||
|
@ -62,6 +75,26 @@ const listeningWindow = () => {
|
|||
};
|
||||
};
|
||||
listeningWindow();
|
||||
|
||||
const logout = () => {
|
||||
ElMessageBox.confirm(i18n.global.t('commons.msg.sureLogOut'), i18n.global.t('commons.msg.infoTitle'), {
|
||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
systemLogOut();
|
||||
router.push({ name: 'login' });
|
||||
globalStore.setLogStatus(false);
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: i18n.global.t('commons.msg.operationSuccess'),
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const systemLogOut = async () => {
|
||||
await logOutApi();
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<template>
|
||||
<div class="bread-crumbs-item">
|
||||
<el-link><slot></slot></el-link> <i v-if="!props.right" :class="'panel p-arrow-right'"></i>
|
||||
<el-link><slot></slot></el-link>
|
||||
<i v-if="!props.right" :class="'panel p-arrow-right'"></i>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -11,12 +11,13 @@
|
|||
:key="key"
|
||||
@click="jump(key)"
|
||||
:right="key == paths.length - 1"
|
||||
>{{ item }}</BreadCrumbItem
|
||||
>
|
||||
{{ item }}
|
||||
</BreadCrumbItem>
|
||||
</BreadCrumbs>
|
||||
</div>
|
||||
<div>
|
||||
<el-input :prefix-icon="Search"> </el-input>
|
||||
<el-input :prefix-icon="Search"></el-input>
|
||||
<el-table :data="data" highlight-current-row height="40vh">
|
||||
<el-table-column width="40" fix>
|
||||
<template #default="{ row }">
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<svg :class="svgClass" aria-hidden="true">
|
||||
<use :xlink:href="iconClassName" :fill="color" />
|
||||
<use :xlink:href="iconClassName" />
|
||||
</svg>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
|
@ -33,15 +33,15 @@ const svgClass = computed(() => {
|
|||
</script>
|
||||
<style scoped>
|
||||
.svg-icon {
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
width: 2.5em;
|
||||
height: 2.5em;
|
||||
position: relative;
|
||||
fill: currentColor;
|
||||
vertical-align: -2px;
|
||||
padding-top: 0.3em;
|
||||
padding-bottom: 0.3em;
|
||||
padding-left: 0.3em;
|
||||
padding-right: 0.3em;
|
||||
padding-top: 0.1em;
|
||||
padding-bottom: 0.1em;
|
||||
padding-left: 0.1em;
|
||||
padding-right: 0.1em;
|
||||
}
|
||||
.table-icon {
|
||||
width: 1.5em;
|
||||
|
|
|
@ -82,11 +82,23 @@ export default {
|
|||
},
|
||||
},
|
||||
menu: {
|
||||
home: 'Dashboard',
|
||||
demo: 'Demo',
|
||||
monitor: 'Monitor',
|
||||
home: 'Overview',
|
||||
demo: 'Example',
|
||||
terminal: 'Terminal',
|
||||
operations: 'Operation logs',
|
||||
apps: 'App Store',
|
||||
website: 'Website',
|
||||
project: 'Project',
|
||||
config: 'Config',
|
||||
firewall: 'Firewall',
|
||||
database: 'Database',
|
||||
container: 'Container',
|
||||
plan: 'Planned Task',
|
||||
host: 'Host',
|
||||
security: 'Security',
|
||||
systemConfig: 'Panel Settings',
|
||||
toolbox: 'Toolbox',
|
||||
monitor: 'Monitor',
|
||||
operations: 'Operation Records',
|
||||
files: 'File Management',
|
||||
},
|
||||
home: {
|
||||
|
|
|
@ -32,7 +32,7 @@ export default {
|
|||
delete: '此操作不可回滚,是否继续',
|
||||
deleteTitle: '删除',
|
||||
deleteSuccess: '删除成功',
|
||||
loginSuccess: '登陆成功',
|
||||
loginSuccess: '登录成功',
|
||||
operationSuccess: '操作成功',
|
||||
requestTimeout: '请求超时,请稍后重试',
|
||||
infoTitle: '提示',
|
||||
|
@ -84,7 +84,19 @@ export default {
|
|||
menu: {
|
||||
home: '概览',
|
||||
demo: '样例',
|
||||
terminal: '终端管理',
|
||||
terminal: '终端',
|
||||
apps: '应用商店',
|
||||
website: '网站',
|
||||
project: '项目',
|
||||
config: '配置',
|
||||
firewall: '防火墙',
|
||||
database: '数据库',
|
||||
container: '容器',
|
||||
plan: '计划任务',
|
||||
host: '主机',
|
||||
security: '安全',
|
||||
systemConfig: '面板设置',
|
||||
toolbox: '工具箱',
|
||||
monitor: '监控',
|
||||
operations: '操作记录',
|
||||
files: '文件管理',
|
||||
|
|
|
@ -16,25 +16,25 @@
|
|||
<View></View>
|
||||
</Content>
|
||||
</el-main>
|
||||
<el-footer v-if="themeConfig.footer">
|
||||
<!-- <el-footer v-if="themeConfig.footer">
|
||||
<Footer>
|
||||
<slot name="footer"></slot>
|
||||
</Footer>
|
||||
</el-footer>
|
||||
</el-footer> -->
|
||||
</el-container>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
// import { computed } from 'vue';
|
||||
import Menu from './layout-menu.vue';
|
||||
import Header from './layout-header.vue';
|
||||
import Footer from './layout-footer.vue';
|
||||
// import Footer from './layout-footer.vue';
|
||||
import View from './layout-view.vue';
|
||||
import Content from './layout-content.vue';
|
||||
import { GlobalStore } from '@/store';
|
||||
const globalStore = GlobalStore();
|
||||
const themeConfig = computed(() => globalStore.themeConfig);
|
||||
// import { GlobalStore } from '@/store';
|
||||
// const globalStore = GlobalStore();
|
||||
// const themeConfig = computed(() => globalStore.themeConfig);
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
:header="header"
|
||||
v-if="showBack"
|
||||
></back-button>
|
||||
<span v-else> {{ header }}</span>
|
||||
<span v-else>{{ header }}</span>
|
||||
</slot>
|
||||
</div>
|
||||
<div class="content-container__toolbar" v-if="slots.toolbar">
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
// demo
|
||||
const demoRouter = {
|
||||
sort: 3,
|
||||
path: '/files',
|
||||
component: Layout,
|
||||
redirect: '/files',
|
||||
meta: {
|
||||
icon: 'files',
|
||||
title: 'menu.files',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/files',
|
||||
name: 'File',
|
||||
component: () => import('@/views/file-management/index.vue'),
|
||||
meta: {
|
||||
keepAlive: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default demoRouter;
|
23
frontend/src/routers/modules/app-store.ts
Normal file
23
frontend/src/routers/modules/app-store.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
// demo
|
||||
const appStoreRouter = {
|
||||
sort: 2,
|
||||
path: '/apps',
|
||||
component: Layout,
|
||||
redirect: '/apps',
|
||||
meta: {
|
||||
icon: 'p-appstore',
|
||||
title: 'menu.apps',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/apps',
|
||||
name: 'App',
|
||||
component: () => import('@/views/app-store/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default appStoreRouter;
|
22
frontend/src/routers/modules/config.ts
Normal file
22
frontend/src/routers/modules/config.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const systemConfigRouter = {
|
||||
sort: 8,
|
||||
path: '/configs',
|
||||
component: Layout,
|
||||
redirect: '/configs',
|
||||
meta: {
|
||||
icon: 'p-config',
|
||||
title: 'menu.systemConfig',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/configs',
|
||||
name: 'SystemConfig',
|
||||
component: () => import('@/views/system-config/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default systemConfigRouter;
|
22
frontend/src/routers/modules/container.ts
Normal file
22
frontend/src/routers/modules/container.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const containerRouter = {
|
||||
sort: 5,
|
||||
path: '/containers',
|
||||
component: Layout,
|
||||
redirect: '/containers',
|
||||
meta: {
|
||||
icon: 'p-docker',
|
||||
title: 'menu.container',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/containers',
|
||||
name: 'Container',
|
||||
component: () => import('@/views/container/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default containerRouter;
|
22
frontend/src/routers/modules/database.ts
Normal file
22
frontend/src/routers/modules/database.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const databaseRouter = {
|
||||
sort: 4,
|
||||
path: '/database',
|
||||
component: Layout,
|
||||
redirect: '/database',
|
||||
meta: {
|
||||
icon: 'p-database',
|
||||
title: 'menu.database',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/database',
|
||||
name: 'Database',
|
||||
component: () => import('@/views/database/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default databaseRouter;
|
49
frontend/src/routers/modules/host.ts
Normal file
49
frontend/src/routers/modules/host.ts
Normal file
|
@ -0,0 +1,49 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const hostRouter = {
|
||||
sort: 7,
|
||||
path: '/hosts',
|
||||
component: Layout,
|
||||
redirect: '/hosts/security',
|
||||
meta: {
|
||||
icon: 'p-host',
|
||||
title: 'menu.host',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/hosts/security',
|
||||
name: 'Security',
|
||||
component: () => import('@/views/host/security/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.security',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/hosts/files',
|
||||
name: 'File',
|
||||
component: () => import('@/views/host/file-management/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.files',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/hosts/monitor',
|
||||
name: 'Monitor',
|
||||
component: () => import('@/views/monitor/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.monitor',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/host/terminal',
|
||||
name: 'Terminal',
|
||||
component: () => import('@/views/host/terminal/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.terminal',
|
||||
keepAlive: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default hostRouter;
|
|
@ -1,28 +0,0 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const monitorRouter = {
|
||||
sort: 2,
|
||||
path: '/monitors',
|
||||
component: Layout,
|
||||
redirect: '/monitor',
|
||||
meta: {
|
||||
title: 'menu.monitor',
|
||||
icon: 'monitor',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/monitors/monitor',
|
||||
name: 'Monitor',
|
||||
component: () => import('@/views/monitor/index.vue'),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
key: 'Monitor',
|
||||
title: 'menu.monitor',
|
||||
icon: 'Connection',
|
||||
activeMenu: '/monitors',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default monitorRouter;
|
|
@ -1,23 +1,20 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const operationRouter = {
|
||||
sort: 3,
|
||||
sort: 10,
|
||||
path: '/operations',
|
||||
component: Layout,
|
||||
redirect: '/operation',
|
||||
meta: {
|
||||
title: 'menu.operations',
|
||||
icon: 'notebook',
|
||||
icon: 'p-log',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/operation',
|
||||
name: 'OperationLog',
|
||||
component: () => import('@/views/operation-log/index.vue'),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
key: 'OperationLog',
|
||||
},
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
|
22
frontend/src/routers/modules/plan.ts
Normal file
22
frontend/src/routers/modules/plan.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const planRouter = {
|
||||
sort: 6,
|
||||
path: '/plans',
|
||||
component: Layout,
|
||||
redirect: '/plans',
|
||||
meta: {
|
||||
icon: 'p-plan',
|
||||
title: 'menu.plan',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/plans',
|
||||
name: 'Plan',
|
||||
component: () => import('@/views/plan/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default planRouter;
|
|
@ -1,28 +0,0 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const terminalRouter = {
|
||||
sort: 2,
|
||||
path: '/terminals',
|
||||
component: Layout,
|
||||
redirect: '/terminal',
|
||||
meta: {
|
||||
title: 'menu.terminal',
|
||||
icon: 'monitor',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/terminals/terminal',
|
||||
name: 'Terminal',
|
||||
component: () => import('@/views/terminal/index.vue'),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
key: 'Terminal',
|
||||
title: 'terminal.conn',
|
||||
icon: 'Connection',
|
||||
activeMenu: '/terminals',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default terminalRouter;
|
22
frontend/src/routers/modules/toolbox.ts
Normal file
22
frontend/src/routers/modules/toolbox.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const toolBoxRouter = {
|
||||
sort: 9,
|
||||
path: '/toolbox',
|
||||
component: Layout,
|
||||
redirect: '/toolbox',
|
||||
meta: {
|
||||
icon: 'p-toolbox',
|
||||
title: 'menu.toolbox',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/toolbox',
|
||||
name: 'ToolBox',
|
||||
component: () => import('@/views/toolbox/index.vue'),
|
||||
meta: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default toolBoxRouter;
|
40
frontend/src/routers/modules/website.ts
Normal file
40
frontend/src/routers/modules/website.ts
Normal file
|
@ -0,0 +1,40 @@
|
|||
import { Layout } from '@/routers/constant';
|
||||
|
||||
const webSiteRouter = {
|
||||
sort: 3,
|
||||
path: '/websites',
|
||||
component: Layout,
|
||||
redirect: '/websites',
|
||||
meta: {
|
||||
icon: 'p-website',
|
||||
title: 'menu.website',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/websites',
|
||||
name: 'Website',
|
||||
component: () => import('@/views/website/project/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.project',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/websites/config',
|
||||
name: 'Config',
|
||||
component: () => import('@/views/website/config/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.config',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/websites/firewall',
|
||||
name: 'Firewall',
|
||||
component: () => import('@/views/website/project/index.vue'),
|
||||
meta: {
|
||||
title: 'menu.firewall',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default webSiteRouter;
|
|
@ -10,7 +10,7 @@ const homeRouter: RouteRecordRaw = {
|
|||
meta: {
|
||||
keepAlive: true,
|
||||
title: 'menu.home',
|
||||
icon: 'home-filled',
|
||||
icon: 'p-home',
|
||||
},
|
||||
children: [
|
||||
{
|
||||
|
|
|
@ -182,11 +182,11 @@
|
|||
.row-box {
|
||||
display: flex;
|
||||
flex-flow: wrap;
|
||||
}
|
||||
.row-box .el-card {
|
||||
min-width: 100%;
|
||||
height: 100%;
|
||||
margin-right: 20px;
|
||||
border: 0;
|
||||
// box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
|
||||
}
|
||||
.row-box .el-card {
|
||||
min-width: 100%;
|
||||
height: 100%;
|
||||
margin-right: 20px;
|
||||
border: 0;
|
||||
// box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
|
||||
}
|
||||
|
|
7
frontend/src/views/app-store/index.vue
Normal file
7
frontend/src/views/app-store/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/container/index.vue
Normal file
7
frontend/src/views/container/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/database/index.vue
Normal file
7
frontend/src/views/database/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
|
@ -4,9 +4,9 @@
|
|||
<template #toolbar>
|
||||
<el-button type="primary" @click="openOperate(null)">{{ $t('commons.button.create') }}</el-button>
|
||||
<el-button type="primary" plain>{{ '其他操作' }}</el-button>
|
||||
<el-button type="danger" plain :disabled="selects.length === 0" @click="batchDelete(null)">{{
|
||||
$t('commons.button.delete')
|
||||
}}</el-button>
|
||||
<el-button type="danger" plain :disabled="selects.length === 0" @click="batchDelete(null)">
|
||||
{{ $t('commons.button.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
<el-table-column type="selection" fix />
|
||||
<el-table-column label="ID" min-width="100" prop="id" fix />
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
</el-form>
|
||||
<div class="form-button">
|
||||
<el-button @click="router.back()">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submitForm(ruleFormRef)">{{
|
||||
$t('commons.button.confirm')
|
||||
}}</el-button>
|
||||
<el-button type="primary" @click="submitForm(ruleFormRef)">
|
||||
{{ $t('commons.button.confirm') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</LayoutContent>
|
||||
|
|
|
@ -1,14 +1,6 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="open"
|
||||
:before-close="handleClose"
|
||||
:title="$t('file.setRole')"
|
||||
width="30%"
|
||||
@open="onOpen"
|
||||
v-loading="loading"
|
||||
destory-on-close
|
||||
>
|
||||
<FileRole :mode="mode" @get-mode="getMode"></FileRole>
|
||||
<el-dialog v-model="open" :before-close="handleClose" :title="$t('file.setRole')" width="30%" @open="onOpen">
|
||||
<FileRole v-loading="loading" :mode="mode" @get-mode="getMode"></FileRole>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
|
@ -1,6 +1,13 @@
|
|||
<template>
|
||||
<el-dialog v-model="open" :title="title" :before-close="handleClose" width="30%" @open="onOpen" v-loading="loading">
|
||||
<el-form ref="fileForm" label-position="left" :model="form" label-width="100px" :rules="rules">
|
||||
<el-dialog v-model="open" :title="title" :before-close="handleClose" width="30%" @open="onOpen">
|
||||
<el-form
|
||||
ref="fileForm"
|
||||
label-position="left"
|
||||
:model="form"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form-item :label="$t('file.compressType')" prop="type">
|
||||
<el-select v-model="form.type">
|
||||
<el-option v-for="item in options" :key="item" :label="item" :value="item" />
|
||||
|
@ -8,13 +15,13 @@
|
|||
</el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name">
|
||||
<el-input v-model="form.name">
|
||||
<template #append>{{ extension }}</template></el-input
|
||||
>
|
||||
<template #append>{{ extension }}</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.compressDst')" prop="dst">
|
||||
<el-input v-model="form.dst">
|
||||
<template #append> <FileList :path="props.dst" @choose="getLinkPath"></FileList> </template
|
||||
></el-input>
|
||||
<template #append><FileList :path="props.dst" @choose="getLinkPath"></FileList></template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-checkbox v-model="form.replace" :label="$t('file.replace')"></el-checkbox>
|
|
@ -5,14 +5,20 @@
|
|||
:title="$t('commons.button.create')"
|
||||
width="30%"
|
||||
@open="onOpen"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form ref="fileForm" label-position="left" :model="addForm" label-width="100px" :rules="rules">
|
||||
<el-form-item :label="$t('file.path')" prop="path"> <el-input v-model="getPath" disabled /></el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name"> <el-input v-model="addForm.name" /></el-form-item>
|
||||
<el-form
|
||||
ref="fileForm"
|
||||
label-position="left"
|
||||
:model="addForm"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form-item :label="$t('file.path')" prop="path"><el-input v-model="getPath" disabled /></el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name"><el-input v-model="addForm.name" /></el-form-item>
|
||||
<el-form-item v-if="!addForm.isDir">
|
||||
<el-checkbox v-model="addForm.isLink" :label="$t('file.link')"></el-checkbox
|
||||
></el-form-item>
|
||||
<el-checkbox v-model="addForm.isLink" :label="$t('file.link')"></el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.linkType')" v-if="addForm.isLink" prop="linkType">
|
||||
<el-radio-group v-model="addForm.isSymlink">
|
||||
<el-radio :label="true">{{ $t('file.softLink') }}</el-radio>
|
|
@ -1,29 +1,31 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="open"
|
||||
:title="$t('file.deCompress')"
|
||||
:before-close="handleClose"
|
||||
width="30%"
|
||||
@open="onOpen"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form ref="fileForm" label-position="left" :model="form" label-width="100px" :rules="rules">
|
||||
<el-form-item :label="$t('file.name')">
|
||||
<el-input v-model="name" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.deCompressDst')" prop="dst">
|
||||
<el-input v-model="form.dst">
|
||||
<template #append> <FileList :path="props.dst" @choose="getLinkPath"></FileList> </template
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)">{{ $t('commons.button.confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<div>
|
||||
<el-dialog v-model="open" :title="$t('file.deCompress')" :before-close="handleClose" width="30%" @open="onOpen">
|
||||
<el-form
|
||||
ref="fileForm"
|
||||
label-position="left"
|
||||
:model="form"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form-item :label="$t('file.name')">
|
||||
<el-input v-model="name" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.deCompressDst')" prop="dst">
|
||||
<el-input v-model="form.dst">
|
||||
<template #append><FileList :path="props.dst" @choose="getLinkPath"></FileList></template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)">{{ $t('commons.button.confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
|
@ -1,31 +1,33 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="open"
|
||||
:title="$t('file.download')"
|
||||
:before-close="handleClose"
|
||||
width="30%"
|
||||
@open="onOpen"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form ref="fileForm" label-position="left" :model="addForm" label-width="100px" :rules="rules">
|
||||
<el-form-item :label="$t('file.compressType')" prop="type">
|
||||
<el-select v-model="addForm.type">
|
||||
<el-option v-for="item in options" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name">
|
||||
<el-input v-model="addForm.name">
|
||||
<template #append>{{ extension }}</template></el-input
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)">{{ $t('commons.button.confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<div>
|
||||
<el-dialog v-model="open" :title="$t('file.download')" :before-close="handleClose" width="30%" @open="onOpen">
|
||||
<el-form
|
||||
ref="fileForm"
|
||||
label-position="left"
|
||||
:model="addForm"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form-item :label="$t('file.compressType')" prop="type">
|
||||
<el-select v-model="addForm.type">
|
||||
<el-option v-for="item in options" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name">
|
||||
<el-input v-model="addForm.name">
|
||||
<template #append>{{ extension }}</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)">{{ $t('commons.button.confirm') }}</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
|
@ -33,8 +33,9 @@
|
|||
:key="key"
|
||||
@click="jump(key)"
|
||||
:right="key == paths.length - 1"
|
||||
>{{ item }}</BreadCrumbItem
|
||||
>
|
||||
{{ item }}
|
||||
</BreadCrumbItem>
|
||||
</BreadCrumbs>
|
||||
</div>
|
||||
<ComplexTable
|
||||
|
@ -44,34 +45,46 @@
|
|||
v-loading="loading"
|
||||
>
|
||||
<template #toolbar>
|
||||
<el-dropdown split-button type="primary" @command="handleCreate">
|
||||
{{ $t('commons.button.create') }}
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="dir">
|
||||
<svg-icon iconName="p-file-folder"></svg-icon>{{ $t('file.dir') }}
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item command="file">
|
||||
<svg-icon iconName="p-file-normal"></svg-icon>{{ $t('file.file') }}
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
<el-button type="primary" plain @click="openUpload"> {{ $t('file.upload') }}</el-button>
|
||||
<!-- <el-button type="primary" plain> {{ $t('file.search') }}</el-button> -->
|
||||
<el-button type="primary" plain @click="openWget"> {{ $t('file.remoteFile') }}</el-button>
|
||||
<el-button type="primary" plain @click="openMove('copy')" :disabled="selects.length === 0">
|
||||
{{ $t('file.copy') }}</el-button
|
||||
>
|
||||
<el-button type="primary" plain @click="openMove('cut')" :disabled="selects.length === 0">
|
||||
{{ $t('file.move') }}</el-button
|
||||
>
|
||||
<el-button type="primary" plain @click="openCompress(selects)" :disabled="selects.length === 0">
|
||||
{{ $t('file.compress') }}</el-button
|
||||
>
|
||||
<el-button type="primary" plain @click="openDownload" :disabled="selects.length === 0">
|
||||
{{ $t('file.download') }}</el-button
|
||||
>
|
||||
<el-button-group>
|
||||
<el-dropdown split-button type="primary" @command="handleCreate">
|
||||
{{ $t('commons.button.create') }}
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="dir">
|
||||
<svg-icon iconName="p-file-folder"></svg-icon>
|
||||
{{ $t('file.dir') }}
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item command="file">
|
||||
<svg-icon iconName="p-file-normal"></svg-icon>
|
||||
{{ $t('file.file') }}
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin-left: 5px">
|
||||
<el-button type="primary" plain @click="openUpload">{{ $t('file.upload') }}</el-button>
|
||||
<!-- <el-button type="primary" plain> {{ $t('file.search') }}</el-button> -->
|
||||
<el-button type="primary" plain @click="openWget">{{ $t('file.remoteFile') }}</el-button>
|
||||
<el-button type="primary" plain @click="openMove('copy')" :disabled="selects.length === 0">
|
||||
{{ $t('file.copy') }}
|
||||
</el-button>
|
||||
<el-button type="primary" plain @click="openMove('cut')" :disabled="selects.length === 0">
|
||||
{{ $t('file.move') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
@click="openCompress(selects)"
|
||||
:disabled="selects.length === 0"
|
||||
>
|
||||
{{ $t('file.compress') }}
|
||||
</el-button>
|
||||
<el-button type="primary" plain @click="openDownload" :disabled="selects.length === 0">
|
||||
{{ $t('file.download') }}
|
||||
</el-button>
|
||||
</el-button-group>
|
||||
|
||||
<!-- <el-button type="primary" plain> {{ $t('file.sync') }}</el-button>
|
||||
<el-button type="primary" plain> {{ $t('file.terminal') }}</el-button>
|
||||
<el-button type="primary" plain> {{ $t('file.shareList') }}</el-button> -->
|
||||
|
@ -82,7 +95,7 @@
|
|||
<svg-icon v-if="row.isDir" className="table-icon" iconName="p-file-folder"></svg-icon>
|
||||
<svg-icon v-else className="table-icon" iconName="p-file-normal"></svg-icon>
|
||||
<el-link :underline="false" @click="open(row)">{{ row.name }}</el-link>
|
||||
<span v-if="row.isSymlink"> -> {{ row.linkPath }}</span>
|
||||
<span v-if="row.isSymlink">-> {{ row.linkPath }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column :label="$t('file.mode')" prop="mode">
|
||||
|
@ -90,17 +103,16 @@
|
|||
<el-link :underline="false" @click="openMode(row)">{{ row.mode }}</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column :label="$t('file.user')" prop="user"> </el-table-column>
|
||||
<el-table-column :label="$t('file.group')" prop="group"> </el-table-column>
|
||||
<el-table-column :label="$t('file.size')" prop="size"> </el-table-column>
|
||||
<el-table-column :label="$t('file.user')" prop="user"></el-table-column>
|
||||
<el-table-column :label="$t('file.group')" prop="group"></el-table-column>
|
||||
<el-table-column :label="$t('file.size')" prop="size"></el-table-column>
|
||||
<el-table-column
|
||||
:label="$t('file.updateTime')"
|
||||
prop="modTime"
|
||||
:formatter="dateFromat"
|
||||
min-width="100"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
</el-table-column>
|
||||
></el-table-column>
|
||||
|
||||
<fu-table-operations
|
||||
:ellipsis="1"
|
||||
|
@ -181,7 +193,7 @@ import Download from './download/index.vue';
|
|||
|
||||
const data = ref();
|
||||
const selects = ref<any>([]);
|
||||
const req = reactive({ path: '/', expand: true });
|
||||
const req = reactive({ path: '/', expand: true, showHidden: false });
|
||||
const loading = ref(false);
|
||||
const treeLoading = ref(false);
|
||||
const paths = ref<string[]>([]);
|
|
@ -10,16 +10,16 @@
|
|||
>
|
||||
<el-form-item :label="$t('file.path')" prop="newPath">
|
||||
<el-input v-model="addForm.newPath">
|
||||
<template #append> <FileList @choose="getPath" :dir="true"></FileList> </template>
|
||||
<template #append><FileList @choose="getPath" :dir="true"></FileList></template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose" :disabled="loading">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)" :disabled="loading">{{
|
||||
$t('commons.button.confirm')
|
||||
}}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)" :disabled="loading">
|
||||
{{ $t('commons.button.confirm') }}
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
|
@ -1,18 +1,18 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="open"
|
||||
:before-close="handleClose"
|
||||
:title="$t('file.setRole')"
|
||||
width="30%"
|
||||
@open="onOpen"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form ref="fileForm" label-position="left" :model="addForm" label-width="100px" :rules="rules">
|
||||
<el-dialog v-model="open" :before-close="handleClose" :title="$t('file.setRole')" width="30%" @open="onOpen">
|
||||
<el-form
|
||||
ref="fileForm"
|
||||
label-position="left"
|
||||
:model="addForm"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
v-loading="loading"
|
||||
>
|
||||
<el-form-item :label="$t('file.path')" prop="path">
|
||||
<el-input v-model="props.path" disabled
|
||||
/></el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="newName"> <el-input v-model="addForm.newName" /></el-form-item
|
||||
></el-form>
|
||||
<el-input v-model="props.path" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="newName"><el-input v-model="addForm.newName" /></el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
|
@ -5,7 +5,6 @@
|
|||
<el-button type="primary">{{ $t('file.selectFile') }}</el-button>
|
||||
</template>
|
||||
</el-upload>
|
||||
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">{{ $t('commons.button.cancel') }}</el-button>
|
|
@ -13,8 +13,8 @@
|
|||
</el-form-item>
|
||||
<el-form-item :label="$t('file.path')" prop="path">
|
||||
<el-input v-model="addForm.path">
|
||||
<template #append> <FileList :path="path" @choose="getPath"></FileList> </template
|
||||
></el-input>
|
||||
<template #append><FileList :path="path" @choose="getPath"></FileList></template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('file.name')" prop="name">
|
||||
<el-input v-model="addForm.name"></el-input>
|
||||
|
@ -23,9 +23,9 @@
|
|||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose" :disabled="loading">{{ $t('commons.button.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)" :disabled="loading">{{
|
||||
$t('commons.button.confirm')
|
||||
}}</el-button>
|
||||
<el-button type="primary" @click="submit(fileForm)" :disabled="loading">
|
||||
{{ $t('commons.button.confirm') }}
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
@ -37,6 +37,7 @@ import { Rules } from '@/global/form-rues';
|
|||
import i18n from '@/lang';
|
||||
import { ElMessage, FormInstance, FormRules } from 'element-plus';
|
||||
import { reactive, ref, toRefs } from 'vue';
|
||||
import FileList from '@/components/file-list/index.vue';
|
||||
|
||||
const props = defineProps({
|
||||
open: {
|
7
frontend/src/views/host/security/index.vue
Normal file
7
frontend/src/views/host/security/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
|
@ -3,9 +3,9 @@
|
|||
<ComplexTable :pagination-config="paginationConfig" v-model:selects="selects" :data="data" @search="search">
|
||||
<template #toolbar>
|
||||
<el-button @click="onCreate()">{{ $t('commons.button.create') }}</el-button>
|
||||
<el-button type="danger" plain :disabled="selects.length === 0" @click="batchDelete(null)">{{
|
||||
$t('commons.button.delete')
|
||||
}}</el-button>
|
||||
<el-button type="danger" plain :disabled="selects.length === 0" @click="batchDelete(null)">
|
||||
{{ $t('commons.button.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
<el-table-column type="selection" fix />
|
||||
<el-table-column :label="$t('commons.table.name')" min-width="100" prop="name" fix />
|
|
@ -30,7 +30,7 @@
|
|||
<el-icon style="margin-top: 1px" color="#F56C6C" v-if="item.status === 'closed'">
|
||||
<circleClose />
|
||||
</el-icon>
|
||||
<span> {{ item.title }} </span>
|
||||
<span> {{ item.title }} </span>
|
||||
</span>
|
||||
</template>
|
||||
<Terminal
|
|
@ -15,8 +15,7 @@
|
|||
:end-placeholder="$t('commons.search.timeEnd')"
|
||||
:shortcuts="shortcuts"
|
||||
style="float: right; right: 20px"
|
||||
>
|
||||
</el-date-picker>
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<div id="loadLoadChart" style="width: 100%; height: 400px"></div>
|
||||
</el-card>
|
||||
|
@ -37,8 +36,7 @@
|
|||
:end-placeholder="$t('commons.search.timeEnd')"
|
||||
:shortcuts="shortcuts"
|
||||
style="float: right; right: 20px"
|
||||
>
|
||||
</el-date-picker>
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<div id="loadCPUChart" style="width: 100%; height: 400px"></div>
|
||||
</el-card>
|
||||
|
@ -57,8 +55,7 @@
|
|||
:end-placeholder="$t('commons.search.timeEnd')"
|
||||
:shortcuts="shortcuts"
|
||||
style="float: right; right: 20px"
|
||||
>
|
||||
</el-date-picker>
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<div id="loadMemoryChart" style="width: 100%; height: 400px"></div>
|
||||
</el-card>
|
||||
|
@ -79,8 +76,7 @@
|
|||
:end-placeholder="$t('commons.search.timeEnd')"
|
||||
:shortcuts="shortcuts"
|
||||
style="float: right; right: 20px"
|
||||
>
|
||||
</el-date-picker>
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<div id="loadIOChart" style="width: 100%; height: 400px"></div>
|
||||
</el-card>
|
||||
|
@ -110,8 +106,7 @@
|
|||
:end-placeholder="$t('commons.search.timeEnd')"
|
||||
:shortcuts="shortcuts"
|
||||
style="float: right; right: 20px"
|
||||
>
|
||||
</el-date-picker>
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<div id="loadNetworkChart" style="width: 100%; height: 400px"></div>
|
||||
</el-card>
|
||||
|
|
7
frontend/src/views/plan/index.vue
Normal file
7
frontend/src/views/plan/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/system-config/index.vue
Normal file
7
frontend/src/views/system-config/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/toolbox/index.vue
Normal file
7
frontend/src/views/toolbox/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/website/config/index.vue
Normal file
7
frontend/src/views/website/config/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/website/firewall/index.vue
Normal file
7
frontend/src/views/website/firewall/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
7
frontend/src/views/website/project/index.vue
Normal file
7
frontend/src/views/website/project/index.vue
Normal file
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<LayoutContent></LayoutContent>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LayoutContent from '@/layout/layout-content.vue';
|
||||
</script>
|
Loading…
Add table
Reference in a new issue