mirror of
https://github.com/IceWhaleTech/CasaOS.git
synced 2025-12-23 13:04:42 +00:00
Compare commits
296 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
752134942a | ||
|
|
faf683a02c | ||
|
|
f99f49dd7e | ||
|
|
b0dc30277b | ||
|
|
d91fef0a19 | ||
|
|
6bb044ab04 | ||
|
|
78479f9604 | ||
|
|
8fe893847f | ||
|
|
f506d6ce49 | ||
|
|
5d7c5ba120 | ||
|
|
eedffd7c19 | ||
|
|
0885c1386d | ||
|
|
0297fe67af | ||
|
|
3f53e6f33b | ||
|
|
94d0efdb12 | ||
|
|
1e821d1c10 | ||
|
|
2c80b53ee8 | ||
|
|
c33af66c6e | ||
|
|
9d47874ae3 | ||
|
|
c7b7a30210 | ||
|
|
fde665cd4d | ||
|
|
eaf2341a2a | ||
|
|
d4bed3e5c7 | ||
|
|
fcb2b3f5a5 | ||
|
|
60349c941a | ||
|
|
11bc70a710 | ||
|
|
665766019f | ||
|
|
57cef9624c | ||
|
|
6bd41ad016 | ||
|
|
05425d638f | ||
|
|
bd5a2e35d4 | ||
|
|
123e7e8758 | ||
|
|
1ec3e2e9fb | ||
|
|
0719c3cc0c | ||
|
|
0a4ceb7c4c | ||
|
|
655f59f00a | ||
|
|
5289f471d6 | ||
|
|
59597befb6 | ||
|
|
df2477a12f | ||
|
|
b709abe682 | ||
|
|
d0f3dc806e | ||
|
|
92d085acf9 | ||
|
|
20dbae21c8 | ||
|
|
9258cb4b9e | ||
|
|
d9794851f9 | ||
|
|
1fcb530ff2 | ||
|
|
364d411438 | ||
|
|
0dacc5db12 | ||
|
|
fcbff194d2 | ||
|
|
04e93b0e3c | ||
|
|
2eff7fa8bc | ||
|
|
dd0645ee0f | ||
|
|
c93aa6286e | ||
|
|
bf7b32309f | ||
|
|
cd779448ce | ||
|
|
c3b2c1d599 | ||
|
|
b7949e100f | ||
|
|
80d24570d6 | ||
|
|
539b72a388 | ||
|
|
a7d15a896e | ||
|
|
9796c5aad7 | ||
|
|
892cd99eb3 | ||
|
|
02cb4cd392 | ||
|
|
9213f9e379 | ||
|
|
4473056d5c | ||
|
|
07e96511cd | ||
|
|
ce1dc52bc2 | ||
|
|
d890b16644 | ||
|
|
5737936318 | ||
|
|
33acfababd | ||
|
|
28c1a52171 | ||
|
|
892eef424c | ||
|
|
f3c73ba79b | ||
|
|
c6928c333d | ||
|
|
63c6c2cebb | ||
|
|
6cba025679 | ||
|
|
d25b93c972 | ||
|
|
b14861703c | ||
|
|
32604225ce | ||
|
|
f623b29c38 | ||
|
|
94ae6ee8ec | ||
|
|
5115bf72e1 | ||
|
|
e1a928cd78 | ||
|
|
3977519c43 | ||
|
|
2f87834ac9 | ||
|
|
53335012d8 | ||
|
|
9d6302f7e3 | ||
|
|
20950e2a60 | ||
|
|
0e0e507f8f | ||
|
|
46e14617b6 | ||
|
|
903c73fafb | ||
|
|
42a56df4a5 | ||
|
|
493dc5c032 | ||
|
|
9a73bc2a18 | ||
|
|
55a9acd9f6 | ||
|
|
d060968b7a | ||
|
|
88a7f53130 | ||
|
|
26e5b18a5d | ||
|
|
011ace96f6 | ||
|
|
5c00655d14 | ||
|
|
eb36c262db | ||
|
|
29d1861545 | ||
|
|
3c9b410693 | ||
|
|
4c3b41433b | ||
|
|
1fd13668c0 | ||
|
|
d1ab7261a6 | ||
|
|
0fc65bcb3a | ||
|
|
f1ce8bfd99 | ||
|
|
3f472f1864 | ||
|
|
229d94cae7 | ||
|
|
c28e1bbf93 | ||
|
|
a840029000 | ||
|
|
aad2646cf2 | ||
|
|
ca1f8ad73e | ||
|
|
dea02763a2 | ||
|
|
ea67385a64 | ||
|
|
fa2daa2767 | ||
|
|
fcb906aa85 | ||
|
|
489a617126 | ||
|
|
601e7ce10b | ||
|
|
4a6fc9a945 | ||
|
|
b377af1d24 | ||
|
|
3fc00f8da7 | ||
|
|
6e39fe5f8c | ||
|
|
20c240a123 | ||
|
|
3ea9fc0de0 | ||
|
|
b80b08ef07 | ||
|
|
505af8d101 | ||
|
|
ae35a6d291 | ||
|
|
2b95c07a47 | ||
|
|
27a011e715 | ||
|
|
476831a12f | ||
|
|
9675eff69e | ||
|
|
85a044246e | ||
|
|
5c41fbcf3d | ||
|
|
6baab7a525 | ||
|
|
ab3b5a9077 | ||
|
|
5811c271b2 | ||
|
|
cf5387346d | ||
|
|
8df63c6c5c | ||
|
|
1d17d27c96 | ||
|
|
bdcbae69a5 | ||
|
|
cdbc3437be | ||
|
|
8940b520e0 | ||
|
|
1d62fbd670 | ||
|
|
a0b56d809e | ||
|
|
f1f6d33e26 | ||
|
|
f292edd2ba | ||
|
|
caa9b50b65 | ||
|
|
61b824065b | ||
|
|
9a900b2ca0 | ||
|
|
4c1cbc98a4 | ||
|
|
8660b95756 | ||
|
|
e7ebdc040f | ||
|
|
6c235d3f2a | ||
|
|
997d912f4d | ||
|
|
2508a4e07d | ||
|
|
90b997337c | ||
|
|
0bb3c92335 | ||
|
|
7fd539c57e | ||
|
|
52bd22ab2b | ||
|
|
46e9458e82 | ||
|
|
3f5595e794 | ||
|
|
d22cc7d3f6 | ||
|
|
eb03a3e6c7 | ||
|
|
65cc1f4752 | ||
|
|
99db197a39 | ||
|
|
7e2a5d553c | ||
|
|
f02337b83b | ||
|
|
f66b67b0c9 | ||
|
|
91087b5341 | ||
|
|
c67191d8c2 | ||
|
|
0fac461783 | ||
|
|
ec5bc922e7 | ||
|
|
7194792c3f | ||
|
|
76c8bade7f | ||
|
|
126857fab0 | ||
|
|
9ca57e105e | ||
|
|
2651140095 | ||
|
|
14175bc438 | ||
|
|
956328da86 | ||
|
|
cc46a96a75 | ||
|
|
049090444e | ||
|
|
796c25b7a5 | ||
|
|
9057290188 | ||
|
|
fcc57bb734 | ||
|
|
a98f5e087c | ||
|
|
403d563869 | ||
|
|
88c15104b4 | ||
|
|
6176289b88 | ||
|
|
5cfd44da79 | ||
|
|
2437da33a6 | ||
|
|
49ca0af746 | ||
|
|
9440b89fab | ||
|
|
f020c1162d | ||
|
|
120fb2cea2 | ||
|
|
37130966cf | ||
|
|
795b82c42c | ||
|
|
57ad33d53a | ||
|
|
a6ceee7bc0 | ||
|
|
44bb05fad0 | ||
|
|
a5fee0ee97 | ||
|
|
da99b2d01a | ||
|
|
1433e3297b | ||
|
|
cad7af13af | ||
|
|
39cb8904a3 | ||
|
|
2ed372b3cd | ||
|
|
8bca76b78b | ||
|
|
595e0f28af | ||
|
|
4939fe10aa | ||
|
|
d2962a8e70 | ||
|
|
d7d53d639b | ||
|
|
d2ff1b0506 | ||
|
|
7191735737 | ||
|
|
21f3fd85d9 | ||
|
|
ba77e07e36 | ||
|
|
0d6e7ca339 | ||
|
|
b1d5d9858b | ||
|
|
4f06be0e45 | ||
|
|
812ffd56a8 | ||
|
|
6ba845eec5 | ||
|
|
4fa72289ed | ||
|
|
5cdd842a3e | ||
|
|
cc5504c0a9 | ||
|
|
b3aa22605d | ||
|
|
32e00b17b1 | ||
|
|
16108f03ac | ||
|
|
e7f990b224 | ||
|
|
c5d824c4ba | ||
|
|
39ccbe251f | ||
|
|
e69d2e587b | ||
|
|
8a28d3c589 | ||
|
|
8fe0e4aa73 | ||
|
|
30a23a93a2 | ||
|
|
53157fbb1f | ||
|
|
fb15695dab | ||
|
|
5f5091f1e2 | ||
|
|
df92766c74 | ||
|
|
cc8b3e8f06 | ||
|
|
a116db8dbd | ||
|
|
d697547cb7 | ||
|
|
01960c0391 | ||
|
|
953c393e71 | ||
|
|
0873f7dd46 | ||
|
|
8d93a7f320 | ||
|
|
801eca0a14 | ||
|
|
a3ec7b70c9 | ||
|
|
4a77548b23 | ||
|
|
15ccade3d3 | ||
|
|
587fb6fb8a | ||
|
|
5bcb663ac8 | ||
|
|
cbd945536d | ||
|
|
081e9213c2 | ||
|
|
966fae2d4c | ||
|
|
dc4f9ea990 | ||
|
|
05b9c75714 | ||
|
|
4aeeea2325 | ||
|
|
72531cf6c2 | ||
|
|
9ad9be8c61 | ||
|
|
1aa15932a0 | ||
|
|
dbc6a4265a | ||
|
|
edea1f144a | ||
|
|
85c59c03cf | ||
|
|
a1f57bf1d1 | ||
|
|
e6f2c46c28 | ||
|
|
55c6c21aa3 | ||
|
|
40617185e9 | ||
|
|
c3dba45e17 | ||
|
|
83f58366a6 | ||
|
|
3fa09dad8e | ||
|
|
f0f0eb2ef0 | ||
|
|
436b87f8a8 | ||
|
|
f0888ef2ac | ||
|
|
03e23ec203 | ||
|
|
3e1d24624a | ||
|
|
1e3585d47c | ||
|
|
db7fe3781e | ||
|
|
c2ad576cd9 | ||
|
|
5c8d4b4b94 | ||
|
|
88f0cdf738 | ||
|
|
b759585d20 | ||
|
|
183bc211cd | ||
|
|
9bce06d171 | ||
|
|
2491a03d4b | ||
|
|
4b02ad914d | ||
|
|
a1b876d088 | ||
|
|
2cb16144ca | ||
|
|
93b1b618d2 | ||
|
|
97e88f595a | ||
|
|
2448173f44 | ||
|
|
191aaff575 | ||
|
|
1e6393f502 | ||
|
|
bf86654579 | ||
|
|
285462c571 | ||
|
|
92753dbfd7 | ||
|
|
2c1ca2b095 |
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
- Browser [e.g. chrome, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Questions, Ideas, Discussions
|
||||||
|
url: https://github.com/IceWhaleTech/CasaOS/discussions
|
||||||
|
about: Ask questions, propose ideas, or discuss anything related to CasaOS
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
15
.github/ISSUE_TEMPLATE/submit-application.md
vendored
Normal file
15
.github/ISSUE_TEMPLATE/submit-application.md
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
name: Submit application
|
||||||
|
about: Add an app to this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: LinkLeong
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Tested platform
|
||||||
|
e.g. linux/amd64,linux/arm-v7,linux-arm64
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Please export and upload the configuration file of this application
|
||||||
148
.github/workflows/casa.yml
vendored
Normal file
148
.github/workflows/casa.yml
vendored
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: Build CasaOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
repository_dispatch:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
ssh:
|
||||||
|
description: 'SSH connection to Actions'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
|
||||||
|
#on:
|
||||||
|
# push:
|
||||||
|
# branches:
|
||||||
|
# - 'main'
|
||||||
|
# tags:
|
||||||
|
# - 'v*'
|
||||||
|
env:
|
||||||
|
REPO_URL: https://github.com/IceWhaleTech/CasaOS.git
|
||||||
|
REPO_BRANCH: main
|
||||||
|
PACK_SH_URL: https://raw.githubusercontent.com/jerrykuku/actions-casa/main/pack.sh
|
||||||
|
PACK_SH: pack.sh
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
xgo:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
go_version:
|
||||||
|
- 1.17.1
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# - name: Get release
|
||||||
|
# id: get_release
|
||||||
|
# uses: bruceadams/get-release@v1.2.3
|
||||||
|
# env:
|
||||||
|
# GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: true
|
||||||
|
# - name: Initialization environment
|
||||||
|
# env:
|
||||||
|
# DEBIAN_FRONTEND: noninteractive
|
||||||
|
# run: |
|
||||||
|
# sudo timedatectl set-timezone "$TZ"
|
||||||
|
# sudo mkdir -p /workdir
|
||||||
|
# sudo chown $USER:$GROUPS /workdir
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# - name: Clone source code
|
||||||
|
# working-directory: /workdir
|
||||||
|
# run: |
|
||||||
|
# df -hT $PWD
|
||||||
|
# git clone $REPO_URL -b $REPO_BRANCH --recursive casa
|
||||||
|
# ln -sf /workdir/casa $GITHUB_WORKSPACE/casa
|
||||||
|
# ls
|
||||||
|
|
||||||
|
|
||||||
|
- name: Set enviroment for github-release
|
||||||
|
run: |
|
||||||
|
echo "VERSION=$(cat types/system.go | grep CURRENTVERSION | awk '$2 == "CURRENTVERSION"{print $4}' | sed 's/"//g')" >>$GITHUB_ENV
|
||||||
|
echo "BODY=$(cat types/system.go | grep BODY | awk -F= '{print $2}' | sed 's/"//g')" >>$GITHUB_ENV
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
|
||||||
|
- name: Build frontend with nodejs and yarn
|
||||||
|
run: |
|
||||||
|
cd UI
|
||||||
|
ls
|
||||||
|
yarn install
|
||||||
|
yarn build
|
||||||
|
|
||||||
|
- name: list work
|
||||||
|
run: pwd
|
||||||
|
|
||||||
|
- name: Build with xgo
|
||||||
|
uses: crazy-max/ghaction-xgo@v1
|
||||||
|
with:
|
||||||
|
xgo_version: v0.7.5
|
||||||
|
go_version: ${{ matrix.go_version }}
|
||||||
|
dest: build
|
||||||
|
prefix: casa
|
||||||
|
targets: linux/amd64,linux/arm64,linux/arm-7
|
||||||
|
v: true
|
||||||
|
x: false
|
||||||
|
race: false
|
||||||
|
ldflags: -s -w
|
||||||
|
buildmode: default
|
||||||
|
#
|
||||||
|
# - name: List Files
|
||||||
|
# run: |
|
||||||
|
# ls
|
||||||
|
# mkdir build
|
||||||
|
# ls
|
||||||
|
# echo "::set-output name=status::success"
|
||||||
|
|
||||||
|
- name: Pack builds
|
||||||
|
run: |
|
||||||
|
wget $PACK_SH_URL
|
||||||
|
chmod +x $PACK_SH
|
||||||
|
./$PACK_SH
|
||||||
|
echo "::set-output name=status::success"
|
||||||
|
- name: list work
|
||||||
|
run: ls
|
||||||
|
|
||||||
|
|
||||||
|
- name: Update release
|
||||||
|
uses: meeDamian/github-release@2.0
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: >
|
||||||
|
linux-amd64-casaos.tar.gz
|
||||||
|
linux-arm64-casaos.tar.gz
|
||||||
|
linux-arm-7-casaos.tar.gz
|
||||||
|
tag: v${{ env.VERSION }}
|
||||||
|
body: >
|
||||||
|
${{ env.BODY }}
|
||||||
|
name: v${{ env.VERSION }}
|
||||||
|
gzip: false
|
||||||
|
allow_override: false
|
||||||
|
prerelease: true
|
||||||
|
# - name: Upload linux-amd64-casaos.tar.gz
|
||||||
|
# id: upload_assets_amd64
|
||||||
|
# uses: shogo82148/actions-upload-release-asset@v1
|
||||||
|
# with:
|
||||||
|
# upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||||
|
# asset_path: /workdir/casa/upload/linux-amd64-casaos.tar.gz
|
||||||
|
#
|
||||||
|
# - name: Upload linux-arm64-casaos.tar.gz
|
||||||
|
# id: upload_assets_arm64
|
||||||
|
# uses: shogo82148/actions-upload-release-asset@v1
|
||||||
|
# with:
|
||||||
|
# upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||||
|
# asset_path: /workdir/casa/upload/linux-arm64-casaos.tar.gz
|
||||||
79
.github/workflows/demo.yml
vendored
Normal file
79
.github/workflows/demo.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
name: Demo Reset
|
||||||
|
|
||||||
|
# Controls when the workflow will run
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 * * * *"
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# OLD_INSTANCE_SNAPSHOT_NAME=$(aws lightsail get-instance-snapshots | grep '"name": "CasaOS-Demo-Snapshot-[0-9]' | sed 's/ //g' | sed 's/"//g' | sed 's/,//g' | sed 's/name://g')
|
||||||
|
# OLD_INSTANCE_NAME=$(aws lightsail get-instances | grep '"name": "CasaOS-Demo-[0-9]' | sed 's/ //g' | sed 's/"//g' | sed 's/,//g' | sed 's/name://g')
|
||||||
|
# NEW_INSTANCE_NAME=CasaOS-Demo-$(date +%s)
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
reset:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure AWS credentials from Test account
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws-region: us-west-2
|
||||||
|
|
||||||
|
- name: Get old instance and snapshot name, create new instance name
|
||||||
|
run: |
|
||||||
|
echo "OLD_INSTANCE_SNAPSHOT_NAME=$(aws lightsail get-instance-snapshots | grep '"name": "CasaOS-Demo-Snapshot-1652856810' | sed 's/ //g' | sed 's/"//g' | sed 's/,//g' | sed 's/name://g')" >> $GITHUB_ENV
|
||||||
|
echo "OLD_INSTANCE_NAME=$(aws lightsail get-instances | grep '"name": "CasaOS-Demo-[0-9]' | sed 's/ //g' | sed 's/"//g' | sed 's/,//g' | sed 's/name://g')" >> $GITHUB_ENV
|
||||||
|
echo "NEW_INSTANCE_NAME=CasaOS-Demo-$(date +%s)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Create instances from snapshot
|
||||||
|
run: |
|
||||||
|
aws lightsail create-instances-from-snapshot \
|
||||||
|
--instance-snapshot-name ${{ env.OLD_INSTANCE_SNAPSHOT_NAME }} \
|
||||||
|
--instance-names ${{ env.NEW_INSTANCE_NAME }} \
|
||||||
|
--availability-zone us-west-2a \
|
||||||
|
--bundle-id medium_2_0
|
||||||
|
|
||||||
|
- name: Wait for new instance running
|
||||||
|
run: |
|
||||||
|
TIMEOUT=$(($(date +%s)+600))
|
||||||
|
while [ $TIMEOUT -gt $(date +%s) ]
|
||||||
|
do
|
||||||
|
NEW_INSTANCE_STATE=$(aws lightsail get-instance-state --instance-name ${{ env.NEW_INSTANCE_NAME }} | grep '"name":' | sed 's/ //g' | sed 's/"//g' | sed 's/name://g')
|
||||||
|
if [ $NEW_INSTANCE_STATE == running ]
|
||||||
|
then
|
||||||
|
echo "New instance is running now"
|
||||||
|
sleep 10s
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Put instance public ports
|
||||||
|
run: |
|
||||||
|
aws lightsail put-instance-public-ports \
|
||||||
|
--port-infos fromPort=0,toPort=65535,protocol=all \
|
||||||
|
--instance-name ${{ env.NEW_INSTANCE_NAME }}
|
||||||
|
|
||||||
|
- name: Attach static ip
|
||||||
|
run: |
|
||||||
|
aws lightsail attach-static-ip \
|
||||||
|
--static-ip-name CasaOS-Demo-IP \
|
||||||
|
--instance-name ${{ env.NEW_INSTANCE_NAME }}
|
||||||
|
|
||||||
|
- name: Delete old instance
|
||||||
|
run: |
|
||||||
|
aws lightsail delete-instance \
|
||||||
|
--instance-name ${{ env.OLD_INSTANCE_NAME }}
|
||||||
|
|
||||||
|
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
# IntelliJ project files
|
# IntelliJ project files
|
||||||
.idea
|
.idea
|
||||||
|
.vscode
|
||||||
*.iml
|
*.iml
|
||||||
out
|
out
|
||||||
gen
|
gen
|
||||||
@@ -27,3 +28,11 @@ gen
|
|||||||
/sql/
|
/sql/
|
||||||
/out/
|
/out/
|
||||||
/db/
|
/db/
|
||||||
|
/docs/
|
||||||
|
/web/
|
||||||
|
/conf/conf.ini
|
||||||
|
/conf/conf.json
|
||||||
|
__debug_bin
|
||||||
|
main
|
||||||
|
CasaOS
|
||||||
|
github.com
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,4 @@
|
|||||||
[submodule "UI"]
|
[submodule "UI"]
|
||||||
path = UI
|
path = UI
|
||||||
url = https://github.com/ZimaBoard/CasaOS-UI.git
|
url = https://github.com/IceWhaleTech/CasaOS-UI.git
|
||||||
|
branch = main
|
||||||
441
CHANGELOG.md
Normal file
441
CHANGELOG.md
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
## [0.3.3-pre] - 2022-07-01(UTC)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [System]Add interface call log
|
||||||
|
- Adding Developing file ([#311](https://github.com/IceWhaleTech/CasaOS/pull/311))
|
||||||
|
- [App] add new tips for app section.
|
||||||
|
- [System] UI Configurable function modules: support turning off the search bar and recommended apps module in the settings.
|
||||||
|
- [System] Custom wallpapers: two new preset wallpapers, support for custom uploads, support for setting images from Files as wallpapers, Also support right click on dashboard to change wallpaper.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- [App] Cache app store index and category data
|
||||||
|
- [System] casaos master program adapted to FHS standards
|
||||||
|
- [App] Update casaos icons.
|
||||||
|
- [System] Update translation.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- [System] Remove upnp function module
|
||||||
|
- [System] Remove ddns function module
|
||||||
|
- [System] Remove search function module
|
||||||
|
- [System] Remove zerotier function module
|
||||||
|
- [System] Remove task function module
|
||||||
|
- [System] Remove file share function module
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Disk] Fixed hard drive won't hibernate problem ([#202](https://github.com/IceWhaleTech/CasaOS/issues/202))
|
||||||
|
- [File] Fixed the backspace key that causes the folder to rewind ([#252](https://github.com/IceWhaleTech/CasaOS/issues/252))
|
||||||
|
- [App] Fixed app logo is not loading when imported. ([#320](https://github.com/IceWhaleTech/CasaOS/issues/320))
|
||||||
|
|
||||||
|
## [0.3.2.1] - 2022-06-16(UTC)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- [System] Adjusted the display style.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [System] Fixed the issue of widgets displaying wrongly on mobile devices.
|
||||||
|
- [App] Fix the problem of application opening failure on non-80 ports ([#283](https://github.com/IceWhaleTech/CasaOS/issues/283) [#280](https://github.com/IceWhaleTech/CasaOS/issues/280))
|
||||||
|
- [System] Modify port failure problem ([#282](https://github.com/IceWhaleTech/CasaOS/issues/282))
|
||||||
|
- [App]Modify environment variables disappearing problem([#284](https://github.com/IceWhaleTech/CasaOS/issues/284))
|
||||||
|
- [System]Fix no update alert([#278](https://github.com/IceWhaleTech/CasaOS/issues/278))
|
||||||
|
- [System] Fixed some bugs of application cpu usage and memory staging([#272](https://github.com/IceWhaleTech/CasaOS/issues/272))
|
||||||
|
- [App] Fixed plex and HA network mode error issues ([#299](https://github.com/IceWhaleTech/CasaOS/issues/299))
|
||||||
|
- [App] Fix application terminal not working ([#266](https://github.com/IceWhaleTech/CasaOS/issues/266))
|
||||||
|
|
||||||
|
## [0.3.2] - 2022-06-10
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [Files] Files can now be selected multiple files and downloaded, deleted, moved, etc.
|
||||||
|
- [Apps] Support to modify the application opening address.([#204](https://github.com/IceWhaleTech/CasaOS/issues/204))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- [Apps] Hide the display of non-essential environment variables in the application.([#196](https://github.com/IceWhaleTech/CasaOS/issues/196))
|
||||||
|
- [System] Network, disk, cpu, memory, etc. information is modified to be pushed via socket.
|
||||||
|
- [System] Optimize opening speed.([#214](https://github.com/IceWhaleTech/CasaOS/issues/214))
|
||||||
|
- [Language] Update language pack [zarevskaya](https://github.com/zarevskaya) [patrickhilker](https://github.com/patrickhilker)
|
||||||
|
- [System] Interface path adjustment
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- [Files] Remove the online preview function of PDF files
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [System] Fixed the problem that sync data cannot submit the device ID ([#68](https://github.com/IceWhaleTech/CasaOS/issues/68))
|
||||||
|
- [Files] Fixed the code editor center alignment display problem.([#210](https://github.com/IceWhaleTech/CasaOS/issues/210))
|
||||||
|
- [Files] Fixed the problem of wrong name when downloading files.([#240](https://github.com/IceWhaleTech/CasaOS/issues/240))
|
||||||
|
- [System] Fixed the network display as a negative number problem.([#224](https://github.com/IceWhaleTech/CasaOS/issues/224))
|
||||||
|
- [System] Fixed the problem of wireless network card traffic display.([#222](https://github.com/IceWhaleTech/CasaOS/issues/222))
|
||||||
|
|
||||||
|
|
||||||
|
## [0.3.1.1] - 2022-05-17
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the data loss problem when importing local applications
|
||||||
|
|
||||||
|
## [0.3.1] - 2022-05-16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- CasaConnect and file add image thumbnail function
|
||||||
|
- Import of docker applications
|
||||||
|
- List support custom sorting function
|
||||||
|
- CasaConnect gives priority to LAN connections
|
||||||
|
- USB auto-mount switch (Raspberry Pi is off by default)
|
||||||
|
- Application custom installation supports Docker Compose configuration import in YAML format
|
||||||
|
- You will see the new version changelog from the next version
|
||||||
|
- Added live preview for icons in custom installed applications
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Application data is no longer saved to the database
|
||||||
|
- Optimize app store speed issues
|
||||||
|
- Optimize the way WebUI is filled in
|
||||||
|
- Image preview has been completely upgraded and now supports switching between all images in the same folder, as well as dragging, zooming, rotating and resetting.
|
||||||
|
- Added color levels to the CPU and RAM charts
|
||||||
|
- Optimized the display of the Connect friends list right-click menu
|
||||||
|
- Change the initial display directory to /DATA
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Historical Application Data
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed the problem that some Docker CLI commands failed to import
|
||||||
|
- Fix the problem that the application is not easily recognized in /DATA/AppData directory and docker command line after installation, it will be shown as application name
|
||||||
|
- Fix Pi-hole installation failure
|
||||||
|
- Fixed the issue that the app could not be updated using WatchTower
|
||||||
|
- Fixed the problem that the task status was lost after closing Files when there was an upload task
|
||||||
|
|
||||||
|
## [0.3.0] - 2022-04-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add CasaConnect function, now you can share private files peer-to-peer with your friends.
|
||||||
|
- Add a widget for network traffic monitoring.
|
||||||
|
- 12 new popular apps added to App Center
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Updated the sidebar of Files.
|
||||||
|
- Updated the initial directory of Files to the Root directory.
|
||||||
|
- Armbian 22.02 armhf/arm64/amd64 platform tests passed [@igorpecovnik ](https://github.com/igorpecovnik)
|
||||||
|
- Elementary OS 6.1 Jólnir amd64 platform tests passed [@alvarosamudio ](https://github.com/alvarosamudio)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix an issue in Files where the backspace button would trigger a return to the previous level of the directory when creating a folder.
|
||||||
|
- Fix the display problem of application list in CPU widget.
|
||||||
|
- Fix the problem that the ipv6 of the application cannot be opened
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Interfaces related to "zerotier"
|
||||||
|
|
||||||
|
## [0.2.10] - 2022-03-10
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added CasaOS own file manager, now you can browse, upload, download files from the system, even edit code online, preview photos and videos through it. It will appear in the first position of Apps.
|
||||||
|
- Added CPU core count display and memory capacity display.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Optimized the rendering performance of the home page.
|
||||||
|
- Optimized the internationalization display of the time widget.
|
||||||
|
- Show the icon of the stopped application as gray.
|
||||||
|
- Unify the animation of the drop-down menu.
|
||||||
|
- Optimize the display of the application drop-down menu.
|
||||||
|
- Replaced the default font to optimize the display.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the problem of failed to create storage space
|
||||||
|
|
||||||
|
## [0.2.9] - 2022-02-18
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add a simple notification function
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Custom installation of new parameters(Capabilities,Hostname,Privileged)
|
||||||
|
- Update front-end translation [@SemVer](https://github.com/zarevskaya) [@koboldMaki](https://github.com/koboldMaki) [@sgastol](https://github.com/sgastol) [@delki8](https://github.com/delki8)
|
||||||
|
|
||||||
|
- Modify the default location and name of the usb mount
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the problem of being indexed by search engines
|
||||||
|
- Fix some style display issues
|
||||||
|
- Solve hard drive can't be formatted, can't finish adding storage
|
||||||
|
|
||||||
|
## [0.2.8] - 2022-01-30
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add USB disk device display
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update translation [@baptiste313](https://github.com/baptiste313) [@thueske](https://github.com/thueske)
|
||||||
|
- Compatible with more types of drives
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the language initialization bug
|
||||||
|
- Fix the problem that the login page could not be displayed
|
||||||
|
- Fix missing translated content
|
||||||
|
|
||||||
|
## [0.2.7] - 2022.01.26
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Apply multilingual support
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix an injectable execution bug
|
||||||
|
|
||||||
|
## [0.2.6] - 2022.01.26
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add a bug report panel.
|
||||||
|
- App Store apps start supporting multiple languages
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix a disk that cannot be formatted under certain circumstances
|
||||||
|
|
||||||
|
## [0.2.5] - 2022.01.24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Storage Manager
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update Disk widget
|
||||||
|
- Update language files [@ImOstrovskiy](https://github.com/ImOstrovskiy) [@baptiste313](https://github.com/baptiste313)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- File synchronization issues
|
||||||
|
- Fix the app store classification problem
|
||||||
|
|
||||||
|
## [0.2.4] - 2021.12.30
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Brand new App Store
|
||||||
|
- Optimize request method
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix Sync panel width display error.
|
||||||
|
- Fix App panel width display error.
|
||||||
|
|
||||||
|
## [0.2.3] - 2021.12.11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add detailed CPU and memory statistics.
|
||||||
|
- Add the multi-language function and add Chinese translation.
|
||||||
|
- Add the function to modify the search engine.
|
||||||
|
- Add the function of modifying the WebUI port
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update update script
|
||||||
|
- Preprocessing usb automounting
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Volume path problem when customizing the installation of applications
|
||||||
|
- Fix Cpu and Ram usage display error
|
||||||
|
- Fix translation errors
|
||||||
|
- Fixed an error when importing and exporting appfile.
|
||||||
|
|
||||||
|
## [0.2.2] - 2021.12.02
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- UI adjustment
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the problem of data display error when manually installing apps
|
||||||
|
- Fix some spelling problems
|
||||||
|
- Fix the bug of synchronization module
|
||||||
|
|
||||||
|
## [0.2.1] - 2021.11.25
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix Sync display error
|
||||||
|
- Fix Sync Downoad url error
|
||||||
|
- Fix Smart Block display error
|
||||||
|
- Fix widgets settings dispaly error
|
||||||
|
- Fix application installation path error
|
||||||
|
|
||||||
|
## [0.2.0] - 2021.11.25
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add sync function
|
||||||
|
|
||||||
|
|
||||||
|
## [0.1.11] - 2021.11.10
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Adaptation of cell phone terminals
|
||||||
|
- Optimize user experience
|
||||||
|
- Replaced the default background
|
||||||
|
- Optimized the display performance and fixed some bugs
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Resolve application installation path errors
|
||||||
|
|
||||||
|
## [0.1.10] - 2021.11.04
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add application terminal
|
||||||
|
- Add application logs
|
||||||
|
- Add system logs
|
||||||
|
- Add App Store for installation
|
||||||
|
|
||||||
|
## [0.1.9] - 2021.11.01 [YANKED]
|
||||||
|
|
||||||
|
## [0.1.8] - 2021.10.27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add system terminal
|
||||||
|
- Add the ability to modify the user name and password
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Experience optimization
|
||||||
|
- Improve single user management function
|
||||||
|
- Fixed Disk widget display error
|
||||||
|
- Fixed Username display error after change
|
||||||
|
- Adaptation for mobile access
|
||||||
|
|
||||||
|
## [0.1.7] - 2021.10.22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add user authentication module, Login page and initialization page.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the problem that the application could not start after the system restarted.
|
||||||
|
- Home storage space data display exception
|
||||||
|
- Script override causes application loss after installation
|
||||||
|
- Fix docker network error
|
||||||
|
|
||||||
|
## [0.1.6] - 2021.10.19
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add app icon auto-fill via docker image name.
|
||||||
|
- Add a file selector for app install.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Modify import reminder.
|
||||||
|
- Optimize the application installation process
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed an issue with the app were it would disappear when the app was modified.
|
||||||
|
- Fixed device selector default dir to /dev
|
||||||
|
|
||||||
|
## [0.1.5] - 2021.10.15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add CPU RAM Status with widget
|
||||||
|
- Add Disk Info with widget
|
||||||
|
- Realize automatic loading of widgets
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Enhance the Docker cli import experience and automatically fill in the folders that need to be mounted
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove Weather widget.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- AppFile upload does not pass verification
|
||||||
|
- The setting menu of the app is displayed abnormally when the browser window is too narrow
|
||||||
|
- The port is occupied and the program cannot start
|
||||||
|
- Fix display bugs when windows size less than 1024px
|
||||||
|
|
||||||
|
## [0.1.4] - 2021.09.30
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Import and export of application configuration files
|
||||||
|
- Automatic parsing of docker commands
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improve the program release process
|
||||||
|
- Application installation process UX/UI optimization
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Authentication failure during the operation, resulting in the need to re-login
|
||||||
|
|
||||||
|
## [0.1.3] - 2021.09.29 [YANKED]
|
||||||
|
|
||||||
|
## [0.1.2] - 2021.09.28
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Application modification and new creation failure issues
|
||||||
|
|
||||||
|
## [0.1.1] - 2021.09.27
|
||||||
|
|
||||||
|
## [0.1.0] - 2021.09.26
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Application Center
|
||||||
33
DEVELOPING.md
Normal file
33
DEVELOPING.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# CasaOS Development
|
||||||
|
Here we will describe the steps required to setup a development environment with CasaOS.
|
||||||
|
|
||||||
|
- [Setting up development environment](#setting-up-development-environment)
|
||||||
|
- [Pre-requisites](#pre-requisites)
|
||||||
|
- [1. Fork the Repo](#1.-fork-the-repo)
|
||||||
|
- [2. Clone the repo down](#2.-clone-the-repo-down)
|
||||||
|
- [3. Install dependencies](#3.-install-dependencies)
|
||||||
|
|
||||||
|
|
||||||
|
## Setting up a development environment
|
||||||
|
In this section we will walk you through the general process of setting up your development environment to get started.
|
||||||
|
|
||||||
|
### Pre-requisites
|
||||||
|
The following must be installed in order to get started. The details of how to install them is outside the scope of this doc, but generally they should be able to be installed with your systems package manager (apt, yum, brew, choco, etc).
|
||||||
|
- Go > v1.17.0
|
||||||
|
- yarn
|
||||||
|
- node.js
|
||||||
|
|
||||||
|
### 1. Fork the Repo
|
||||||
|
[Fork the repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo) onto your own GitHub account for developing.
|
||||||
|
|
||||||
|
### 2. Clone the repo down
|
||||||
|
1. Navigate into your go workspace (check with `go env GOPATH`).
|
||||||
|
2. Navigate to the appropriate path for github. It should look something like this: `<path from GOPATH>/github.com/<GitHub Username>/`. If it doesn't exist create it.
|
||||||
|
3. Clone down the repo with the following: `git clone --recurse-submodules --remote-submodules https://github.com/<your GitHub Username>/CasaOS.git`
|
||||||
|
|
||||||
|
### 3. Install dependencies
|
||||||
|
1. `cd UI`
|
||||||
|
2. `yarn install`
|
||||||
|
3. `yarn build`
|
||||||
|
4. `cd ..`
|
||||||
|
5. `go get`
|
||||||
201
LICENSE
Normal file
201
LICENSE
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
4
Makefile
4
Makefile
@@ -4,10 +4,10 @@ build: build-ui build-backend
|
|||||||
|
|
||||||
|
|
||||||
build-ui:
|
build-ui:
|
||||||
cd UI && yarn install && yarn build
|
cd CasaOS-UI && yarn install && yarn build
|
||||||
|
|
||||||
build-backend:
|
build-backend:
|
||||||
export CGO_ENABLED=1;export CGO_LDFLAGS=-static;go mod tidy;go build -o ./casa main.go;upx --lzma --best casa
|
export CGO_ENABLED=1;export CGO_LDFLAGS=-static;go build -o ./casa main.go;upx --lzma --best casa
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo "call john"
|
@echo "call john"
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
## 目录结构
|
|
||||||
|
|
||||||
- conf 配置文件
|
|
||||||
- route 路由
|
|
||||||
- service 方法的具体实现
|
|
||||||
- utils 工具
|
|
||||||
- main.go 入口
|
|
||||||
89
README.md
89
README.md
@@ -1,2 +1,89 @@
|
|||||||
# Oasis
|
# CasaOS - A simple, easy-to-use, elegant open-source Home Cloud system.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[](https://github.com/IceWhaleTech/CasaOS)
|
||||||
|
[](https://github.com/IceWhaleTech/CasaOS/pulls)
|
||||||
|
[](https://github.com/IceWhaleTech/CasaOS/issues)
|
||||||
|
[](https://github.com/IceWhaleTech/CasaOS/stargazers)
|
||||||
|
[](https://discord.gg/knqAbbBbeX)
|
||||||
|
|
||||||
|
CasaOS is an open-source Home Cloud system based on the Docker ecosystem and designed for home scenarios. It is committed to building the world's most simple, easy-to-use, and elegant Home Cloud system.
|
||||||
|
|
||||||
|
IceWhale team believes that through community-driven collaborative innovation and open communication with global developers, we can reshape the digital home experience like never before.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
> ⚠️ Note:
|
||||||
|
>
|
||||||
|
> CasaOS is still in the early development stage and may vary significantly with the final release. Feel free to test run and share your feedback in the [Discord server](https://discord.gg/knqAbbBbeX)!
|
||||||
|
|
||||||
|
### Quick Setup CasaOS
|
||||||
|
|
||||||
|
Fresh install a system from the list below and run the this command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wget -qO- https://get.icewhale.io/casaos.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fsSL https://get.icewhale.io/casaos.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### Uninstall CasaOS
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fsSL https://get.icewhale.io/casaos-uninstall.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### System Compatibility
|
||||||
|
|
||||||
|
- Ubuntu Server 20.04 amd64 (✅ Recommend, Tested)
|
||||||
|
- Armbian 22.02 armhf/arm64/amd64 (✅ Recommend, Tested)
|
||||||
|
- Elementary OS 6.1 Jólnir amd64 (✅ Recommend, Tested)
|
||||||
|
- Deepin 20.4 amd64 (⚠️ Not Fully Tested Yet)
|
||||||
|
- Raspberry Pi Lite OS aarch64/arm64 (⚠️ Not Fully Tested Yet)
|
||||||
|
- Debian 11 amd64 (⚠️ Not Fully Tested Yet)
|
||||||
|
- OpenWrt 21.02 amd64 (⚠️ Not Fully Tested Yet)
|
||||||
|
- OpenWrt 21.02 aarch64/arm64 (⚠️ Not Fully Tested Yet)
|
||||||
|
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- UI designed for home scenarios - simple, elegant, and easy-to-use
|
||||||
|
- Quick Docker app installation with only three steps, plus automatic management
|
||||||
|
- App Store for Home Cloud 🚧
|
||||||
|
- Home data/digital asset management 🚧
|
||||||
|
- Smart home manager 🚧
|
||||||
|
|
||||||
|
🚧 is under development.
|
||||||
|
|
||||||
|
We are actively moving forward with development, and you are more than welcome to share any idea with us!
|
||||||
|
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
The word Casa comes from the Spanish word for "home". Project CasaOS originated as a pre-installed system for crowdfunded product [ZimaBoard](https://www.zimaboard.com) on Kickstarter.
|
||||||
|
|
||||||
|
After looking at many systems and software on the market, the team found no server system designed for home scenarios, sadly true.
|
||||||
|
|
||||||
|
So, we set out to build this open source project to develop CasaOS with our own hands, everyone in the community, and you.
|
||||||
|
|
||||||
|
> A warm welcome for you to share and discuss your great ideas in the [Discord server](https://discord.gg/knqAbbBbeX)!
|
||||||
|
|
||||||
|
[](https://discord.gg/knqAbbBbeX)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Maintainers
|
||||||
|
- Jerry Liu
|
||||||
|
- Link Liang
|
||||||
|
- Ober Zhang
|
||||||
|
- Zyaire Ann
|
||||||
|
- John Guan
|
||||||
|
- Right here, waiting for YOU!
|
||||||
|
|||||||
1
UI
Submodule
1
UI
Submodule
Submodule UI added at 7af1bf549d
@@ -1,3 +0,0 @@
|
|||||||
> 1%
|
|
||||||
last 2 versions
|
|
||||||
not dead
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// .env.dev
|
|
||||||
NODE_ENV='dev'
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// .env.production
|
|
||||||
NODE_ENV='prod'
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
env: {
|
|
||||||
node: true
|
|
||||||
},
|
|
||||||
'extends': [
|
|
||||||
'plugin:vue/essential',
|
|
||||||
'eslint:recommended'
|
|
||||||
],
|
|
||||||
parserOptions: {
|
|
||||||
parser: 'babel-eslint'
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'vue/no-unused-vars':'off'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
23
UI/.gitignore
vendored
23
UI/.gitignore
vendored
@@ -1,23 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
node_modules
|
|
||||||
/dist
|
|
||||||
|
|
||||||
|
|
||||||
# local env files
|
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
# Log files
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
|
|
||||||
# Editor directories and files
|
|
||||||
.idea
|
|
||||||
.vscode
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
32
UI/README.md
32
UI/README.md
@@ -1,32 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-22 14:24:43
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-22 14:44:31
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/README.md
|
|
||||||
-->
|
|
||||||
# CasaOS-UI
|
|
||||||
|
|
||||||
The front-end of CasaOs,build with VueJS
|
|
||||||
|
|
||||||
## Project setup
|
|
||||||
```
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and hot-reloads for development
|
|
||||||
```
|
|
||||||
yarn serve
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and minifies for production
|
|
||||||
```
|
|
||||||
yarn build
|
|
||||||
```
|
|
||||||
Will be output to the ../web folder
|
|
||||||
|
|
||||||
### Lints and fixes files
|
|
||||||
```
|
|
||||||
yarn lint
|
|
||||||
```
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/cli-plugin-babel/preset'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "CasaOS",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"serve": "vue-cli-service serve --mode dev",
|
|
||||||
"build": "vue-cli-service build --no-clean --dest ../web --mode production",
|
|
||||||
"lint": "vue-cli-service lint"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"axios": "^0.21.4",
|
|
||||||
"buefy": "^0.9.0",
|
|
||||||
"core-js": "^3.6.5",
|
|
||||||
"easy-affix": "^1.0.8",
|
|
||||||
"lodash.debounce": "^4.0.8",
|
|
||||||
"lottie-vuejs": "^0.4.0",
|
|
||||||
"moment": "^2.29.1",
|
|
||||||
"nth-check": "^2.0.1",
|
|
||||||
"qs": "^6.10.1",
|
|
||||||
"vee-validate": "^3.4.12",
|
|
||||||
"vue": "^2.6.11",
|
|
||||||
"vue-router": "^3.2.0",
|
|
||||||
"vue-slider-component": "^3.2.14",
|
|
||||||
"vuex": "^3.4.0",
|
|
||||||
"vuex-persistedstate": "^4.0.0",
|
|
||||||
"yargs-parser": "^20.2.9"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@vue/cli-plugin-babel": "~4.5.0",
|
|
||||||
"@vue/cli-plugin-eslint": "~4.5.0",
|
|
||||||
"@vue/cli-plugin-router": "~4.5.0",
|
|
||||||
"@vue/cli-plugin-vuex": "~4.5.0",
|
|
||||||
"@vue/cli-service": "~4.5.0",
|
|
||||||
"babel-eslint": "^10.1.0",
|
|
||||||
"compression-webpack-plugin": "^9.0.0",
|
|
||||||
"eslint": "^6.7.2",
|
|
||||||
"eslint-plugin-vue": "^6.2.2",
|
|
||||||
"node-sass": "^4.9.0",
|
|
||||||
"sass-loader": "^7.0.1",
|
|
||||||
"vue-cli-plugin-buefy": "~0.3.8",
|
|
||||||
"vue-template-compiler": "^2.6.11"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<browserconfig>
|
|
||||||
<msapplication>
|
|
||||||
<tile>
|
|
||||||
<square150x150logo src="/ui/img/icon/mstile-150x150.png"/>
|
|
||||||
<TileColor>#da532c</TileColor>
|
|
||||||
</tile>
|
|
||||||
</msapplication>
|
|
||||||
</browserconfig>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-22 14:24:43
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-24 18:03:02
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/public/index.html
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="<%= BASE_URL %>img/icon/apple-touch-icon.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="<%= BASE_URL %>img/icon/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="<%= BASE_URL %>img/icon/favicon-16x16.png">
|
|
||||||
<link rel="manifest" href="<%= BASE_URL %>site.webmanifest">
|
|
||||||
<link rel="mask-icon" href="<%= BASE_URL %>img/icon/safari-pinned-tab.svg" color="#5bbad5">
|
|
||||||
<meta name="msapplication-TileColor" content="#da532c">
|
|
||||||
<meta name="theme-color" content="#ffffff">
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
|
||||||
<link rel="stylesheet" href="//cdn.materialdesignicons.com/2.0.46/css/materialdesignicons.min.css">
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.4/js/all.js"
|
|
||||||
integrity="sha256-GaerX2a/DuOnPrxn/4vH13dobiFUe/27LO6gCZDNauA=" crossorigin="anonymous"></script>
|
|
||||||
<title>
|
|
||||||
<%= htmlWebpackPlugin.options.title %>
|
|
||||||
</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
|
|
||||||
Please enable it to continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app"></div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "",
|
|
||||||
"short_name": "",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "/ui/img/icon/android-chrome-192x192.png",
|
|
||||||
"sizes": "192x192",
|
|
||||||
"type": "image/png"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"theme_color": "#ffffff",
|
|
||||||
"background_color": "#ffffff",
|
|
||||||
"display": "standalone"
|
|
||||||
}
|
|
||||||
110
UI/src/App.vue
110
UI/src/App.vue
@@ -1,110 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-23 16:42:14
|
|
||||||
* @Description: Main entry of application
|
|
||||||
* @FilePath: /CasaOS-UI/src/App.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<!-- <div id="app" class="is-flex is-flex-direction-column" :style="{'background-image': 'url(' + require('./assets/background/AbstractShapes.jpg') + ')'}"> -->
|
|
||||||
<div id="app" class="is-flex is-flex-direction-column" :style="{'background-image': 'url(https://www.bing.com/th?id=OHR.Aldeyjarfoss_ZH-CN0106567013_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp)'}">
|
|
||||||
<!-- NavBar Start -->
|
|
||||||
<top-bar></top-bar>
|
|
||||||
<!-- NavBar End -->
|
|
||||||
|
|
||||||
<!-- Content Start -->
|
|
||||||
<div class="contents pt-55 pb-6">
|
|
||||||
<div class="container">
|
|
||||||
<div class="is-flex">
|
|
||||||
<!-- SideBar Start -->
|
|
||||||
<side-bar></side-bar>
|
|
||||||
<!-- SideBar End -->
|
|
||||||
|
|
||||||
<!-- MainContent Start -->
|
|
||||||
<div class="main-content">
|
|
||||||
<!-- SearchBar Start -->
|
|
||||||
<section>
|
|
||||||
<search-bar></search-bar>
|
|
||||||
</section>
|
|
||||||
<!-- SearchBar End -->
|
|
||||||
|
|
||||||
<!-- Suggestions For You Start -->
|
|
||||||
<section>
|
|
||||||
<suggestion></suggestion>
|
|
||||||
</section>
|
|
||||||
<!-- Suggestions For You End -->
|
|
||||||
|
|
||||||
<!-- Apps Start -->
|
|
||||||
<section>
|
|
||||||
<apps></apps>
|
|
||||||
</section>
|
|
||||||
<!-- Apps End -->
|
|
||||||
|
|
||||||
<!-- Shortcuts Start -->
|
|
||||||
<!-- <section>
|
|
||||||
<shortcuts></shortcuts>
|
|
||||||
</section> -->
|
|
||||||
<!-- Shortcuts End -->
|
|
||||||
</div>
|
|
||||||
<!-- MainContent End -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Content End -->
|
|
||||||
|
|
||||||
<!-- BrandBar Start -->
|
|
||||||
<brand-bar></brand-bar>
|
|
||||||
<!-- BrandBar End -->
|
|
||||||
|
|
||||||
<!-- ContactBar Start -->
|
|
||||||
<contact-bar></contact-bar>
|
|
||||||
<!-- ContactBar End -->
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Apps from './components/Apps.vue'
|
|
||||||
import BrandBar from './components/BrandBar.vue'
|
|
||||||
import ContactBar from './components/ContactBar.vue'
|
|
||||||
import SearchBar from './components/SearchBar.vue'
|
|
||||||
import SideBar from './components/SideBar.vue'
|
|
||||||
import Suggestion from './components/Suggestion.vue'
|
|
||||||
import TopBar from './components/TopBar.vue'
|
|
||||||
//import Shortcuts from './components/Shortcuts.vue'
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
BrandBar,
|
|
||||||
ContactBar,
|
|
||||||
SideBar,
|
|
||||||
SearchBar,
|
|
||||||
Suggestion,
|
|
||||||
Apps,
|
|
||||||
TopBar,
|
|
||||||
//Shortcuts
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
// Check if not login then login and get token
|
|
||||||
if (!localStorage.getItem("user_token")) {
|
|
||||||
this.login()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
login() {
|
|
||||||
/**
|
|
||||||
* @description: Login
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
// this.$api.user.login({
|
|
||||||
// username: "admin",
|
|
||||||
// pwd: "admin"
|
|
||||||
// }).then((res) => {
|
|
||||||
// if (res.data.success == 200) {
|
|
||||||
// localStorage.setItem("user_token", res.data.data)
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.3 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -1,152 +0,0 @@
|
|||||||
// Included below are all the defined variables from Bulma
|
|
||||||
// Modify as needed, removing the !default attribute.
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
|
|
||||||
$black: hsl(0, 0%, 4%) !default;
|
|
||||||
$black-bis: hsl(0, 0%, 7%) !default;
|
|
||||||
$black-ter: hsl(0, 0%, 14%) !default;
|
|
||||||
|
|
||||||
$grey-darker: hsl(0, 0%, 21%) !default;
|
|
||||||
$grey-dark: hsl(0, 0%, 29%) !default;
|
|
||||||
$grey: hsl(0, 0%, 48%) !default;
|
|
||||||
$grey-light: hsl(0, 0%, 71%) !default;
|
|
||||||
$grey-lighter: hsl(0, 0%, 86%) !default;
|
|
||||||
|
|
||||||
$white-ter: hsl(0, 0%, 96%) !default;
|
|
||||||
$white-bis: hsl(0, 0%, 98%) !default;
|
|
||||||
$white: hsl(0, 0%, 100%) !default;
|
|
||||||
|
|
||||||
$orange: hsl(14, 100%, 53%) !default;
|
|
||||||
$yellow: hsl(48, 100%, 67%) !default;
|
|
||||||
$green: hsl(141, 71%, 48%) !default;
|
|
||||||
$turquoise: hsl(171, 100%, 41%) !default;
|
|
||||||
$cyan: hsl(204, 86%, 53%) !default;
|
|
||||||
$blue: hsl(217, 71%, 53%) !default;
|
|
||||||
$purple: hsl(271, 100%, 71%) !default;
|
|
||||||
$red: hsl(348, 100%, 61%) !default;
|
|
||||||
|
|
||||||
// Typography
|
|
||||||
|
|
||||||
$family-sans-serif: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !default;
|
|
||||||
$family-monospace: monospace !default;
|
|
||||||
$render-mode: optimizeLegibility !default;
|
|
||||||
|
|
||||||
$size-1: 3rem !default;
|
|
||||||
$size-2: 2.5rem !default;
|
|
||||||
$size-3: 2rem !default;
|
|
||||||
$size-4: 1.5rem !default;
|
|
||||||
$size-5: 1.25rem !default;
|
|
||||||
$size-6: 1rem !default;
|
|
||||||
$size-7: 0.75rem !default;
|
|
||||||
|
|
||||||
$weight-light: 300 !default;
|
|
||||||
$weight-normal: 400 !default;
|
|
||||||
$weight-medium: 500 !default;
|
|
||||||
$weight-semibold: 600 !default;
|
|
||||||
$weight-bold: 700 !default;
|
|
||||||
|
|
||||||
// Responsiveness
|
|
||||||
|
|
||||||
// The container horizontal gap, which acts as the offset for breakpoints
|
|
||||||
$gap: 32px !default;
|
|
||||||
// 960, 1152, and 1344 have been chosen because they are divisible by both 12 and 16
|
|
||||||
$tablet: 769px !default;
|
|
||||||
// 960px container + 4rem
|
|
||||||
$desktop: 960px + (2 * $gap) !default;
|
|
||||||
// 1152px container + 4rem
|
|
||||||
$widescreen: 1152px + (2 * $gap) !default;
|
|
||||||
// 1344px container + 4rem;
|
|
||||||
$fullhd: 1344px + (2 * $gap) !default;
|
|
||||||
|
|
||||||
// Miscellaneous
|
|
||||||
|
|
||||||
$easing: ease-out !default;
|
|
||||||
$radius-small: 2px !default;
|
|
||||||
$radius: 3px !default;
|
|
||||||
$radius-large: 5px !default;
|
|
||||||
$radius-rounded: 290486px !default;
|
|
||||||
$speed: 86ms !default;
|
|
||||||
|
|
||||||
// Flags
|
|
||||||
|
|
||||||
$variable-columns: true !default;
|
|
||||||
|
|
||||||
|
|
||||||
// The default Bulma derived variables are declared below
|
|
||||||
|
|
||||||
$primary: $turquoise !default;
|
|
||||||
|
|
||||||
$info: $cyan !default;
|
|
||||||
$success: $green !default;
|
|
||||||
$warning: $yellow !default;
|
|
||||||
$danger: $red !default;
|
|
||||||
|
|
||||||
$light: $white-ter !default;
|
|
||||||
$dark: $grey-darker !default;
|
|
||||||
|
|
||||||
// Invert colors
|
|
||||||
|
|
||||||
$orange-invert: findColorInvert($orange) !default;
|
|
||||||
$yellow-invert: findColorInvert($yellow) !default;
|
|
||||||
$green-invert: findColorInvert($green) !default;
|
|
||||||
$turquoise-invert: findColorInvert($turquoise) !default;
|
|
||||||
$cyan-invert: findColorInvert($cyan) !default;
|
|
||||||
$blue-invert: findColorInvert($blue) !default;
|
|
||||||
$purple-invert: findColorInvert($purple) !default;
|
|
||||||
$red-invert: findColorInvert($red) !default;
|
|
||||||
|
|
||||||
$primary-invert: $turquoise-invert !default;
|
|
||||||
$info-invert: $cyan-invert !default;
|
|
||||||
$success-invert: $green-invert !default;
|
|
||||||
$warning-invert: $yellow-invert !default;
|
|
||||||
$danger-invert: $red-invert !default;
|
|
||||||
$light-invert: $dark !default;
|
|
||||||
$dark-invert: $light !default;
|
|
||||||
|
|
||||||
// General colors
|
|
||||||
|
|
||||||
$background: $white-ter !default;
|
|
||||||
|
|
||||||
$border: $grey-lighter !default;
|
|
||||||
$border-hover: $grey-light !default;
|
|
||||||
|
|
||||||
// Text colors
|
|
||||||
|
|
||||||
$text: $grey-dark !default;
|
|
||||||
$text-invert: findColorInvert($text) !default;
|
|
||||||
$text-light: $grey !default;
|
|
||||||
$text-strong: $grey-darker !default;
|
|
||||||
|
|
||||||
// Code colors
|
|
||||||
|
|
||||||
$code: $red !default;
|
|
||||||
$code-background: $background !default;
|
|
||||||
|
|
||||||
$pre: $text !default;
|
|
||||||
$pre-background: $background !default;
|
|
||||||
|
|
||||||
// Link colors
|
|
||||||
|
|
||||||
$link: $blue !default;
|
|
||||||
$link-invert: $blue-invert !default;
|
|
||||||
$link-visited: $purple !default;
|
|
||||||
|
|
||||||
$link-hover: $grey-darker !default;
|
|
||||||
$link-hover-border: $grey-light !default;
|
|
||||||
|
|
||||||
$link-focus: $grey-darker !default;
|
|
||||||
$link-focus-border: $blue !default;
|
|
||||||
|
|
||||||
$link-active: $grey-darker !default;
|
|
||||||
$link-active-border: $grey-dark !default;
|
|
||||||
|
|
||||||
// Typography
|
|
||||||
|
|
||||||
$family-primary: $family-sans-serif !default;
|
|
||||||
$family-code: $family-monospace !default;
|
|
||||||
|
|
||||||
$size-small: $size-7 !default;
|
|
||||||
$size-normal: $size-6 !default;
|
|
||||||
$size-medium: $size-5 !default;
|
|
||||||
$size-large: $size-4 !default;
|
|
||||||
@@ -1,429 +0,0 @@
|
|||||||
@import "~bulma/sass/utilities/initial-variables";
|
|
||||||
@import "~bulma/sass/utilities/functions";
|
|
||||||
// 1. Set your own initial variables and derived
|
|
||||||
// variables in _variables.scss
|
|
||||||
@import "variables";
|
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;1,100;1,300;1,400;1,500;1,700&display=swap");
|
|
||||||
|
|
||||||
// 2. Setup your Custom Colors
|
|
||||||
$linkedin: #0077b5;
|
|
||||||
$linkedin-invert: findColorInvert($linkedin);
|
|
||||||
$twitter: #55acee;
|
|
||||||
$twitter-invert: findColorInvert($twitter);
|
|
||||||
$github: #333;
|
|
||||||
$github-invert: findColorInvert($github);
|
|
||||||
|
|
||||||
@import "~bulma/sass/utilities/derived-variables";
|
|
||||||
|
|
||||||
// 3. Add new color variables to the color map.
|
|
||||||
$addColors: (
|
|
||||||
"twitter": (
|
|
||||||
$twitter,
|
|
||||||
$twitter-invert,
|
|
||||||
),
|
|
||||||
"linkedin": (
|
|
||||||
$linkedin,
|
|
||||||
$linkedin-invert,
|
|
||||||
),
|
|
||||||
"github": (
|
|
||||||
$github,
|
|
||||||
$github-invert,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
$colors: map-merge($colors, $addColors);
|
|
||||||
|
|
||||||
@import "~bulma";
|
|
||||||
@import "~buefy/src/scss/buefy";
|
|
||||||
|
|
||||||
$backDropColor: rgba(123, 123, 123, 0.16);
|
|
||||||
$backDropBlur: blur(1rem);
|
|
||||||
$backDropBorderRadius: 0.5rem;
|
|
||||||
|
|
||||||
// 4. Provide custom buefy overrides and site styles here
|
|
||||||
body,
|
|
||||||
html {
|
|
||||||
overflow: hidden;
|
|
||||||
font-family: "Roboto", sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#app {
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
text-align: center;
|
|
||||||
color: #2c3e50;
|
|
||||||
background-size: cover;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-bar {
|
|
||||||
position: relative;
|
|
||||||
z-index: 10;
|
|
||||||
|
|
||||||
height: 3rem;
|
|
||||||
background: rgba(255, 255, 255, 0.22);
|
|
||||||
backdrop-filter: blur(180.282px);
|
|
||||||
.navbar-brand {
|
|
||||||
.dropdown-menu {
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
min-width: 20rem;
|
|
||||||
.dropdown-content {
|
|
||||||
.dropdown-item {
|
|
||||||
padding: 1.25rem;
|
|
||||||
text-align: left;
|
|
||||||
.item {
|
|
||||||
height: 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.field {
|
|
||||||
line-height: 1rem;
|
|
||||||
}
|
|
||||||
.switch {
|
|
||||||
&.is-flex-direction-row-reverse {
|
|
||||||
.control-label {
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: calc(0.75em - 1px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.update-container {
|
|
||||||
.button.is-rounded {
|
|
||||||
border-radius: 9999px !important;
|
|
||||||
padding-left: calc(1em + 0.25em);
|
|
||||||
padding-right: calc(1em + 0.25em);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.button{
|
|
||||||
&.is-small{
|
|
||||||
height: 2em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-bar {
|
|
||||||
position: fixed;
|
|
||||||
left: 2rem;
|
|
||||||
bottom: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-bar {
|
|
||||||
position: fixed;
|
|
||||||
right: 2rem;
|
|
||||||
bottom: 2rem;
|
|
||||||
height: 3.5rem;
|
|
||||||
background: rgba(0, 0, 0, 0.16);
|
|
||||||
backdrop-filter: blur(24px);
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 1.5rem;
|
|
||||||
a {
|
|
||||||
color: $white;
|
|
||||||
margin: 0.5rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
&:hover {
|
|
||||||
color: #0077b5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.contents {
|
|
||||||
flex: 1;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.side-bar {
|
|
||||||
width: 16rem;
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-content {
|
|
||||||
flex: 1;
|
|
||||||
margin-left: 17.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pt-7 {
|
|
||||||
padding-top: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pt-55 {
|
|
||||||
padding-top: 2rem;
|
|
||||||
}
|
|
||||||
.p-55 {
|
|
||||||
padding: 2rem !important;
|
|
||||||
}
|
|
||||||
.button.is-light {
|
|
||||||
background-color: #a6afb9;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
.label {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button,
|
|
||||||
.input,
|
|
||||||
.textarea,
|
|
||||||
.taginput .taginput-container.is-focusable,
|
|
||||||
.select select,
|
|
||||||
.file-cta,
|
|
||||||
.file-name,
|
|
||||||
.pagination-previous,
|
|
||||||
.pagination-next,
|
|
||||||
.pagination-link,
|
|
||||||
.pagination-ellipsis {
|
|
||||||
&:focus {
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.image.is-72x72 {
|
|
||||||
height: 72px;
|
|
||||||
width: 72px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// widgets
|
|
||||||
.widget {
|
|
||||||
background: $backDropColor;
|
|
||||||
backdrop-filter: $backDropBlur;
|
|
||||||
border-radius: $backDropBorderRadius;
|
|
||||||
padding: 0.875rem 1.5rem;
|
|
||||||
margin-bottom: 0.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cards
|
|
||||||
.wuji-card {
|
|
||||||
background: $backDropColor;
|
|
||||||
backdrop-filter: $backDropBlur;
|
|
||||||
border-radius: $backDropBorderRadius;
|
|
||||||
padding: 1.5rem;
|
|
||||||
color: $white;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.info {
|
|
||||||
flex: 1;
|
|
||||||
margin-right: 1rem;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.simg {
|
|
||||||
img {
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.icon-img {
|
|
||||||
position: relative;
|
|
||||||
&.stop::after {
|
|
||||||
position: absolute;
|
|
||||||
content: "";
|
|
||||||
width: 0.75rem;
|
|
||||||
height: 0.75rem;
|
|
||||||
background-color: #ff1616;
|
|
||||||
border-radius: 50%;
|
|
||||||
right: -0.375rem;
|
|
||||||
top: -0.375rem;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.b-image-wrapper {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
&.stop::after {
|
|
||||||
position: absolute;
|
|
||||||
content: "";
|
|
||||||
width: 0.75rem;
|
|
||||||
height: 0.75rem;
|
|
||||||
background-color: #ff1616;
|
|
||||||
border-radius: 50%;
|
|
||||||
right: -0.375rem;
|
|
||||||
top: -0.375rem;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.action-btn {
|
|
||||||
position: absolute;
|
|
||||||
right: 0.5rem;
|
|
||||||
top: 1rem;
|
|
||||||
visibility: hidden;
|
|
||||||
opacity: 0;
|
|
||||||
transition: all 0.2s;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
.one-line {
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 1;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.two-line {
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
.action-btn {
|
|
||||||
visibility: visible;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: white;
|
|
||||||
p {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.flex1 {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
.title-bar {
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
.title {
|
|
||||||
flex: 1;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.ii {
|
|
||||||
.dropdown-menu {
|
|
||||||
background: rgba(255, 255, 255, 0.88);
|
|
||||||
backdrop-filter: $backDropBlur;
|
|
||||||
border-radius: $backDropBorderRadius;
|
|
||||||
overflow: hidden;
|
|
||||||
padding-top: 0;
|
|
||||||
|
|
||||||
.dropdown-content {
|
|
||||||
background: none;
|
|
||||||
padding: 0;
|
|
||||||
.button {
|
|
||||||
border-radius: 0;
|
|
||||||
padding-left: 1.5rem;
|
|
||||||
padding-right: 1.5rem;
|
|
||||||
&.is-text {
|
|
||||||
text-decoration: none;
|
|
||||||
justify-content: flex-start;
|
|
||||||
outline: none;
|
|
||||||
transition: all 0.2s;
|
|
||||||
border: none !important;
|
|
||||||
&.running {
|
|
||||||
color: #779e2a !important;
|
|
||||||
}
|
|
||||||
&.exited {
|
|
||||||
color: #ff1616 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:active {
|
|
||||||
background: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
&:focus {
|
|
||||||
background: none;
|
|
||||||
box-shadow: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.bbor {
|
|
||||||
overflow: hidden;
|
|
||||||
border-top: #2c3e50 1px solid;
|
|
||||||
.is-text {
|
|
||||||
text-decoration: none;
|
|
||||||
justify-content: center !important ;
|
|
||||||
}
|
|
||||||
.column:first-child {
|
|
||||||
border-right: #2c3e50 1px solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Panel
|
|
||||||
.modal-background {
|
|
||||||
background: rgba(0, 0, 0, 0.8);
|
|
||||||
}
|
|
||||||
.modal-card {
|
|
||||||
background: rgba(255, 255, 255, 0.88);
|
|
||||||
backdrop-filter: $backDropBlur;
|
|
||||||
border-radius: $backDropBorderRadius;
|
|
||||||
.modal-card-head,
|
|
||||||
.modal-card-body,
|
|
||||||
.modal-card-foot {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
.modal-card-head {
|
|
||||||
padding: 3rem;
|
|
||||||
}
|
|
||||||
.modal-card-body {
|
|
||||||
padding: 0 3rem;
|
|
||||||
.button.is-static,
|
|
||||||
.input,
|
|
||||||
.textarea,
|
|
||||||
.taginput .taginput-container.is-focusable,
|
|
||||||
.select select,
|
|
||||||
.file-cta,
|
|
||||||
.file-name,
|
|
||||||
.pagination-previous,
|
|
||||||
.pagination-next,
|
|
||||||
.pagination-link,
|
|
||||||
.pagination-ellipsis {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
height: 2.714em;
|
|
||||||
border: 1px solid #cfcfcf !important;
|
|
||||||
border-radius: 4px;
|
|
||||||
&:focus {
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.media {
|
|
||||||
padding: 0rem;
|
|
||||||
}
|
|
||||||
.field:last-child {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
.field-body {
|
|
||||||
.field:last-child {
|
|
||||||
margin-bottom: 0rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.port-item:not(:last-child) {
|
|
||||||
.field {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.modal-card-foot {
|
|
||||||
padding: 1rem 3rem 2rem 3rem;
|
|
||||||
.button {
|
|
||||||
border-radius: 9999px;
|
|
||||||
padding-left: calc(1em + 0.25em);
|
|
||||||
padding-right: calc(1em + 0.25em);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.import-area .textarea {
|
|
||||||
max-height: 40em;
|
|
||||||
min-height: 16em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-card {
|
|
||||||
.loading-background {
|
|
||||||
background: none !important;
|
|
||||||
border-radius: $backDropBorderRadius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="widget has-text-white clock">
|
|
||||||
<div class="time">{{timeText}}</div>
|
|
||||||
<div class="data">{{dateText}}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import moment from 'moment'
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
timer: 0,
|
|
||||||
timeText:"",
|
|
||||||
dateText:""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (this.timer) {
|
|
||||||
clearInterval(this.timer)
|
|
||||||
}
|
|
||||||
this.updateClock()
|
|
||||||
this.timer = setInterval(() => {
|
|
||||||
this.updateClock()
|
|
||||||
}, 1000)
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
updateClock() {
|
|
||||||
|
|
||||||
this.timeText = moment().format('LT');
|
|
||||||
this.dateText = moment().format('dddd, MMMM Do')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.clock {
|
|
||||||
font-family: Roboto;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 300;
|
|
||||||
text-align: left;
|
|
||||||
.time {
|
|
||||||
font-size: 2.75rem;
|
|
||||||
line-height: 4.25rem;
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
.data {
|
|
||||||
line-height: 1.5rem;
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="widget has-text-white clock">
|
|
||||||
<div class="time">09:40</div>
|
|
||||||
<div class="data">Wednesday,September 15</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:01:19
|
|
||||||
* @Description: App module
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\Apps.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="has-text-left mt-6">
|
|
||||||
<!-- Title Bar Start -->
|
|
||||||
<div class="title-bar is-flex is-align-items-center">
|
|
||||||
<h1 class="title is-4 has-text-white is-flex-shrink-1">Apps</h1>
|
|
||||||
<div class="buttons ">
|
|
||||||
<b-button icon-left="plus" type="is-dark" size="is-small" rounded @click="showInstall">New App</b-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Title Bar End -->
|
|
||||||
|
|
||||||
<!-- App List Start -->
|
|
||||||
<div class="columns is-variable is-2 is-multiline ">
|
|
||||||
<div class="column is-narrow is-3" v-for="(item,index) in appList" :key="'app-'+index">
|
|
||||||
<app-card :item="item" @updateState="getList" @configApp="showConfigPanel"></app-card>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Title Bar End -->
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import AppCard from './Apps/AppCard.vue'
|
|
||||||
import Panel from './Panel.vue'
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
appList: [],
|
|
||||||
appConfig: {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
AppCard,
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.getList();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Fetch the list of installed apps
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
getList() {
|
|
||||||
this.$api.app.myAppList().then(res => {
|
|
||||||
this.appList = res.data.data;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Show Install Panel Programmatic
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
showInstall() {
|
|
||||||
this.$api.app.appConfig().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.$buefy.modal.open({
|
|
||||||
parent: this,
|
|
||||||
component: Panel,
|
|
||||||
hasModalCard: true,
|
|
||||||
customClass: '',
|
|
||||||
trapFocus: true,
|
|
||||||
canCancel: ['escape'],
|
|
||||||
scroll: "keep",
|
|
||||||
animation: "zoom-out",
|
|
||||||
events: {
|
|
||||||
'updateState': () => {
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
id: "0",
|
|
||||||
state: "install",
|
|
||||||
configData: res.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Show Settings Panel Programmatic
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
showConfigPanel(id) {
|
|
||||||
this.$api.app.getContainerSettingdata(id).then(ret => {
|
|
||||||
this.$api.app.appConfig().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.$buefy.modal.open({
|
|
||||||
parent: this,
|
|
||||||
component: Panel,
|
|
||||||
hasModalCard: true,
|
|
||||||
customClass: '',
|
|
||||||
trapFocus: true,
|
|
||||||
canCancel: ['escape'],
|
|
||||||
scroll: "keep",
|
|
||||||
animation: "zoom-out",
|
|
||||||
events: {
|
|
||||||
'updateState': () => {
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
id: id,
|
|
||||||
state: "update",
|
|
||||||
configData: res.data.data,
|
|
||||||
initDatas: ret.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,202 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:12:57
|
|
||||||
* @Description: App Card item
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\Apps\AppCard.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="wuji-card is-flex is-align-items-center is-justify-content-center p-55 app-card" @mouseover="hover = true" @mouseleave="hover = false">
|
|
||||||
<!-- Action Button Start -->
|
|
||||||
<div class="action-btn">
|
|
||||||
<b-dropdown aria-role="list" position="is-bottom-left" class="ii" ref="dro" @active-change="setDropState">
|
|
||||||
<template #trigger>
|
|
||||||
<p role="button">
|
|
||||||
<b-icon pack="fas" icon="ellipsis-v" size="is-small">
|
|
||||||
</b-icon>
|
|
||||||
</p>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<b-dropdown-item aria-role="menu-item" :focusable="false" custom paddingless>
|
|
||||||
<b-button type="is-text" tag="a" :target="(item.state == 'running') ?'_blank':'_self'" :href="(item.state == 'running') ? siteUrl(item.port,item.index) :'javascript:void(0)'" expanded>Open</b-button>
|
|
||||||
<b-button type="is-text" @click="configApp" expanded>Setting</b-button>
|
|
||||||
<b-button type="is-text" expanded @click="uninstallConfirm" :loading="isUninstalling">Unistall</b-button>
|
|
||||||
<div class="columns is-gapless bbor">
|
|
||||||
<div class="column is-flex is-justify-content-center is-align-items-center">
|
|
||||||
<b-button icon-pack="fas" icon-left="sync" type="is-text" expanded :loading="isRestarting" @click="restartApp"></b-button>
|
|
||||||
</div>
|
|
||||||
<div class="column is-flex is-justify-content-center is-align-items-center">
|
|
||||||
<b-button icon-pack="fas" icon-left="power-off" type="is-text" expanded @click="toggle(item)" :loading="isStarting" :class="item.state"></b-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</b-dropdown-item>
|
|
||||||
</b-dropdown>
|
|
||||||
</div>
|
|
||||||
<!-- Action Button End -->
|
|
||||||
|
|
||||||
<!-- Card Content Start -->
|
|
||||||
<div class="has-text-centered is-flex is-justify-content-center is-flex-direction-column pt-3 pb-3">
|
|
||||||
<a :target="(item.state == 'running') ?'_blank':'_self'" class="is-flex is-justify-content-center" :href="(item.state == 'running') ? siteUrl(item.port,item.index) :'javascript:void(0)'">
|
|
||||||
<b-image :src="item.icon" :src-fallback="require('@/assets/img/default.png')" webp-fallback=".jpg" class="is-72x72" :class="item.state | dotClass"></b-image>
|
|
||||||
</a>
|
|
||||||
<p class="mt-4 one-line">
|
|
||||||
<a class="one-line" :target="(item.state == 'running') ?'_blank':'_self'" :href="(item.state == 'running') ? siteUrl(item.port,item.index) :'javascript:void(0)'">
|
|
||||||
{{item.name}}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- Card Content End -->
|
|
||||||
|
|
||||||
<!-- Loading Bar Start -->
|
|
||||||
<b-loading :is-full-page="false" v-model="isUninstalling" :can-cancel="false"></b-loading>
|
|
||||||
<!-- Loading Bar End -->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "app-card",
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
hover: false,
|
|
||||||
dropState: false,
|
|
||||||
isUninstalling: false,
|
|
||||||
isRestarting: false,
|
|
||||||
isStarting: false,
|
|
||||||
isStoping: false,
|
|
||||||
isSaving: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
item: {
|
|
||||||
type: Object
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
/**
|
|
||||||
* @description: Create application access link
|
|
||||||
* @param {String} port App access port
|
|
||||||
* @param {String} index App access index page
|
|
||||||
* @return {String}
|
|
||||||
*/
|
|
||||||
siteUrl(port, index) {
|
|
||||||
return (process.env.NODE_ENV === "'dev'") ? `http://${this.$store.state.devIp}:${port}${index}` : `http://${document.domain}:${port}${index}`
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Set drop-down menu status
|
|
||||||
* @param {Boolean} e
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
setDropState(e) {
|
|
||||||
this.dropState = e
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Restart Application
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
restartApp() {
|
|
||||||
this.isRestarting = true
|
|
||||||
this.$api.app.startContainer(this.item.custom_id, { state: "restart" }).then((res) => {
|
|
||||||
console.log(res.data);
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.updateState()
|
|
||||||
}
|
|
||||||
this.isRestarting = false;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Confirm before uninstall
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
uninstallConfirm() {
|
|
||||||
let _this = this
|
|
||||||
this.$buefy.dialog.confirm({
|
|
||||||
title: 'Attention',
|
|
||||||
message: 'Data cannot be recovered after deletion! <br>Continue on to uninstall this application?',
|
|
||||||
type: 'is-dark',
|
|
||||||
confirmText: 'Uninstall',
|
|
||||||
onConfirm: () => {
|
|
||||||
_this.isUninstalling = true
|
|
||||||
_this.uninstallApp()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Uninstall app
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
uninstallApp() {
|
|
||||||
this.isUninstalling = true
|
|
||||||
this.$api.app.uninstall(this.item.custom_id).then((res) => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
console.log(res.data.data);
|
|
||||||
this.updateState()
|
|
||||||
}
|
|
||||||
this.isUninstalling = false;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Emit the event that the app has been updated
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
updateState() {
|
|
||||||
this.$emit("updateState")
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Emit the event that the app has been updated with custom_id
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
configApp() {
|
|
||||||
this.$emit("configApp", this.item.custom_id)
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Start or Stop a App
|
|
||||||
* @param {Object} item the app info object
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
toggle(item) {
|
|
||||||
this.isStarting = true;
|
|
||||||
let data = {
|
|
||||||
state: item.state == "running" ? "stop" : "start"
|
|
||||||
}
|
|
||||||
this.$api.app.startContainer(item.custom_id, data).then((res) => {
|
|
||||||
console.log(res.data);
|
|
||||||
item.state = res.data.data
|
|
||||||
this.isStarting = false
|
|
||||||
this.updateState()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
hover(val) {
|
|
||||||
if (!val && this.dropState)
|
|
||||||
this.$refs.dro.toggle();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
filters: {
|
|
||||||
/**
|
|
||||||
* @description: Format Dot Class
|
|
||||||
* @param {String} state
|
|
||||||
* @return {String}
|
|
||||||
*/
|
|
||||||
dotClass(state) {
|
|
||||||
return state == 'running' ? 'start' : 'stop'
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:13:58
|
|
||||||
* @Description: The left bottom brand bar
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\BrandBar.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="brand-bar is-flex is-align-items-center has-text-white">
|
|
||||||
<figure class="image is-32x32">
|
|
||||||
<img :src="require('@/assets/img/casa.svg')">
|
|
||||||
</figure>
|
|
||||||
<span class="is-size-4 mr-3 ml-3">CasaOS</span>
|
|
||||||
<span>Made by IceWhale with ❤ and you !️</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "brand-bar"
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:14:33
|
|
||||||
* @Description: The right bottom contact bar
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\ContactBar.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="contact-bar is-flex is-align-items-center has-text-white pl-3 pr-3">
|
|
||||||
<a href="#">
|
|
||||||
<b-icon pack="fas" icon="map-signs" size=""></b-icon>
|
|
||||||
</a>
|
|
||||||
<a href="https://discord.gg/Gx4BCEtHjx" target="_blank">
|
|
||||||
<b-icon pack="fab" icon="discord" size=""></b-icon>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/ZimaBoard/CasaOS" target="_blank">
|
|
||||||
<b-icon pack="fab" icon="github" size=""></b-icon>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "contact-bar"
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,453 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-22 16:27:00
|
|
||||||
* @Description: Install Panel of Docker
|
|
||||||
* @FilePath: /CasaOS-UI/src/components/Panel.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="modal-card">
|
|
||||||
<!-- Modal-Card Header Start -->
|
|
||||||
<header class="modal-card-head">
|
|
||||||
<div class="flex1">
|
|
||||||
<h3 class="title is-4 has-text-weight-normal">Create a new App manually</h3>
|
|
||||||
</div>
|
|
||||||
<b-button icon-left="file-import" type="is-dark" size="is-small" rounded @click="showImportPanel" v-if="currentSlide == 1 && state == 'install'">Import</b-button>
|
|
||||||
</header>
|
|
||||||
<!-- Modal-Card Header End -->
|
|
||||||
<!-- Modal-Card Body Start -->
|
|
||||||
<section class="modal-card-body">
|
|
||||||
|
|
||||||
<section v-show="currentSlide == 1">
|
|
||||||
<ValidationObserver ref="ob1">
|
|
||||||
<ValidationProvider rules="required" name="Image" v-slot="{ errors, valid }">
|
|
||||||
<b-field label="Docker Image *" :type="{ 'is-danger': errors[0], 'is-success': valid }" :message="errors">
|
|
||||||
<b-input v-model="initData.image" placeholder="e.g.,hello-world:latest" :readonly="state == 'update'"></b-input>
|
|
||||||
<!-- <b-autocomplete :data="data" placeholder="e.g. hello-world:latest" field="image" :loading="isFetching" @typing="getAsyncData" @select="option => selected = option" v-model="initData.image" :readonly="state == 'update'"></b-autocomplete> -->
|
|
||||||
</b-field>
|
|
||||||
</ValidationProvider>
|
|
||||||
<ValidationProvider rules="required" name="Name" v-slot="{ errors, valid }">
|
|
||||||
<b-field label="App name *" :type="{ 'is-danger': errors[0], 'is-success': valid }" :message="errors">
|
|
||||||
<b-input value="" v-model="initData.label" placeholder="Your custom App Name"></b-input>
|
|
||||||
</b-field>
|
|
||||||
</ValidationProvider>
|
|
||||||
|
|
||||||
<b-field label="Icon URL">
|
|
||||||
<b-input value="" v-model="initData.icon" placeholder="Your custom icon URL"></b-input>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
<b-field label="Web UI">
|
|
||||||
<p class="control">
|
|
||||||
<span class="button is-static">{{baseUrl}}</span>
|
|
||||||
</p>
|
|
||||||
<b-input v-model="webui" placeholder="8080/web/index.html" expanded></b-input>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
<b-field label="Network">
|
|
||||||
<b-select v-model="initData.network_model" placeholder="Select" expanded>
|
|
||||||
<optgroup v-for="net in networks" :key="net.driver" :label="net.driver">
|
|
||||||
<option v-for="(option,index) in net.networks" :value="option.id" :key="option.name+index">
|
|
||||||
{{ option.name}}
|
|
||||||
</option>
|
|
||||||
</optgroup>
|
|
||||||
</b-select>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
<ports v-model="initData.ports" :showHostPost="showHostPort" v-if="showPorts"></ports>
|
|
||||||
<input-group v-model="initData.volumes" label="Data Volumes" message="No App Data Volumes now, Click “+” to add one."></input-group>
|
|
||||||
<input-group v-model="initData.envs" label="Environment Variables" message="No environment variables now, Click “+” to add one." name1="Key" name2="Value"></input-group>
|
|
||||||
<input-group v-model="initData.devices" label="Devices" message="No devices now, Click “+” to add one."></input-group>
|
|
||||||
<b-field label="Memory Limit">
|
|
||||||
<vue-slider :min="256" :max="totalMemory" v-model="initData.memory"></vue-slider>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
<b-field label="CPU Shares">
|
|
||||||
<b-select v-model="initData.cpu_shares" placeholder="Select" expanded>
|
|
||||||
<option value="10">Low</option>
|
|
||||||
<option value="50">Medium</option>
|
|
||||||
<option value="90">High</option>
|
|
||||||
</b-select>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
<b-field label="Restart Policy">
|
|
||||||
<b-select v-model="initData.restart" placeholder="Select" expanded>
|
|
||||||
<option value="on-failure">on-failure</option>
|
|
||||||
<option value="always">always</option>
|
|
||||||
<option value="unless-stopped">unless-stopped</option>
|
|
||||||
</b-select>
|
|
||||||
</b-field>
|
|
||||||
<b-field label="App Description">
|
|
||||||
<b-input v-model="initData.description"></b-input>
|
|
||||||
</b-field>
|
|
||||||
<b-loading :is-full-page="false" v-model="isLoading" :can-cancel="false"></b-loading>
|
|
||||||
</ValidationObserver>
|
|
||||||
</section>
|
|
||||||
<section v-show="currentSlide == 2">
|
|
||||||
<div class="installing-warpper">
|
|
||||||
<lottie-animation path="./ui/img/ani/rocket-launching.json" :autoPlay="true" :width="200" :height="200"></lottie-animation>
|
|
||||||
<h3 class="title is-6 has-text-centered" :class="{'has-text-danger':errorType == 3,'has-text-black':errorType != 3}" v-html="installText"></h3>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<!-- Modal-Card Body End -->
|
|
||||||
|
|
||||||
<!-- Modal-Card Footer Start-->
|
|
||||||
<footer class="modal-card-foot is-flex is-align-items-center">
|
|
||||||
<div class="flex1"></div>
|
|
||||||
<div>
|
|
||||||
<b-button v-if="currentSlide == 1" :label="cancelButtonText" @click="$emit('close')" rounded />
|
|
||||||
<b-button v-if="currentSlide == 2 && errorType == 3 " label="Back" @click="prevStep" rounded />
|
|
||||||
<b-button v-if="currentSlide == 1 && state == 'install'" label="Install" type="is-dark" @click="installApp()" rounded />
|
|
||||||
<b-button v-if="currentSlide == 1 && state == 'update'" label="Update" type="is-dark" @click="updateApp()" rounded />
|
|
||||||
<b-button v-if="currentSlide == 2" :label="cancelButtonText" type="is-dark" @click="$emit('close')" rounded />
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
<!-- Modal-Card Footer End -->
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import axios from 'axios'
|
|
||||||
import InputGroup from './forms/InputGroup.vue';
|
|
||||||
import Ports from './forms/Ports.vue'
|
|
||||||
import ImportPanel from './forms/ImportPanel.vue'
|
|
||||||
import LottieAnimation from "lottie-vuejs/src/LottieAnimation.vue";
|
|
||||||
import VueSlider from 'vue-slider-component'
|
|
||||||
import 'vue-slider-component/theme/default.css'
|
|
||||||
import { ValidationObserver, ValidationProvider } from "vee-validate";
|
|
||||||
import "@/plugins/vee-validate";
|
|
||||||
import debounce from 'lodash/debounce'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
Ports,
|
|
||||||
InputGroup,
|
|
||||||
ValidationObserver,
|
|
||||||
ValidationProvider,
|
|
||||||
LottieAnimation,
|
|
||||||
VueSlider
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
timer: 0,
|
|
||||||
data: [],
|
|
||||||
isLoading: false,
|
|
||||||
isFetching: false,
|
|
||||||
errorType: 1,
|
|
||||||
currentSlide: 1,
|
|
||||||
cancelButtonText: "Cancel",
|
|
||||||
webui: "",
|
|
||||||
baseUrl: "",
|
|
||||||
totalMemory: 0,
|
|
||||||
networks: [],
|
|
||||||
tempNetworks: [],
|
|
||||||
networkModes: [],
|
|
||||||
installPercent: 0,
|
|
||||||
installText: "",
|
|
||||||
|
|
||||||
initData: {
|
|
||||||
port_map: "",
|
|
||||||
cpu_shares: 10,
|
|
||||||
memory: 300,
|
|
||||||
restart: "always",
|
|
||||||
label: "",
|
|
||||||
position: true,
|
|
||||||
index: "",
|
|
||||||
icon: "",
|
|
||||||
network_model: "",
|
|
||||||
image: "",
|
|
||||||
description: "",
|
|
||||||
origin: "custom",
|
|
||||||
ports: [],
|
|
||||||
volumes: [],
|
|
||||||
envs: [],
|
|
||||||
devices: [],
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
id: String,
|
|
||||||
state: String,
|
|
||||||
configData: Object,
|
|
||||||
initDatas: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
//If it is edit, Init data
|
|
||||||
if (this.initDatas != undefined) {
|
|
||||||
this.initData = this.initDatas
|
|
||||||
this.webui = this.initDatas.port_map + this.initDatas.index
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get Max memory info form device
|
|
||||||
this.totalMemory = Math.floor(this.configData.memory.total / 1048576);
|
|
||||||
this.initData.memory = this.totalMemory
|
|
||||||
|
|
||||||
//Handling network types
|
|
||||||
this.tempNetworks = this.configData.networks;
|
|
||||||
this.networkModes = this.unique(this.tempNetworks.map(item => {
|
|
||||||
return item.driver
|
|
||||||
}))
|
|
||||||
this.networks = this.networkModes.map(item => {
|
|
||||||
let tempitem = {}
|
|
||||||
tempitem.driver = item
|
|
||||||
tempitem.networks = this.tempNetworks.filter(net => {
|
|
||||||
return net.driver == item
|
|
||||||
})
|
|
||||||
return tempitem
|
|
||||||
})
|
|
||||||
|
|
||||||
let gg = this.tempNetworks.filter(item => {
|
|
||||||
if (item.driver == "bridge") {
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
this.initData.network_model = gg[0].id
|
|
||||||
|
|
||||||
// Set Front-end base url
|
|
||||||
this.baseUrl = `${window.location.protocol}//${document.domain}:`;
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
|
|
||||||
showPorts() {
|
|
||||||
if (this.initData.network_model.indexOf("macvlan") > -1) {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
showHostPort() {
|
|
||||||
if (this.initData.network_model.indexOf("host") > -1) {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Process the datas before submit
|
|
||||||
* @param {*}
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
processData() {
|
|
||||||
// GET port map and index
|
|
||||||
if (this.webui != "") {
|
|
||||||
let slashArr = this.webui.split("/")
|
|
||||||
this.initData.port_map = slashArr[0]
|
|
||||||
this.initData.index = "/" + slashArr.slice(1).join("/");
|
|
||||||
}
|
|
||||||
|
|
||||||
let model = this.initData.network_model.split("-");
|
|
||||||
this.initData.network_model = model[0]
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Array deduplication
|
|
||||||
* @param {Array} arr
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
unique(arr) {
|
|
||||||
for (var i = 0; i < arr.length; i++) {
|
|
||||||
for (var j = i + 1; j < arr.length; j++) {
|
|
||||||
if (arr[i] == arr[j]) {
|
|
||||||
arr.splice(j, 1);
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Back to prev Step
|
|
||||||
* @param {*}
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
prevStep() {
|
|
||||||
this.currentSlide--;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Validate form async
|
|
||||||
* @param {Object} ref ref of component
|
|
||||||
* @return {Boolean}
|
|
||||||
*/
|
|
||||||
async checkStep(ref) {
|
|
||||||
let isValid = await ref.validate()
|
|
||||||
return isValid
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Submit datas after valid
|
|
||||||
* @param {*}
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
installApp() {
|
|
||||||
this.checkStep(this.$refs.ob1).then(val => {
|
|
||||||
if (val) {
|
|
||||||
this.processData();
|
|
||||||
this.isLoading = true;
|
|
||||||
this.$api.app.install(this.id, this.initData).then((res) => {
|
|
||||||
this.isLoading = false;
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.currentSlide = 2;
|
|
||||||
this.cancelButtonText = "Continue in background"
|
|
||||||
this.checkInstallState(res.data.data)
|
|
||||||
} else {
|
|
||||||
//this.currentSlide = 1;
|
|
||||||
this.$buefy.toast.open({
|
|
||||||
message: res.data.message,
|
|
||||||
type: 'is-warning'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Check the installation process every 250 milliseconds
|
|
||||||
* @param {String} appId
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
checkInstallState(appId) {
|
|
||||||
this.timer = setInterval(() => {
|
|
||||||
this.updateInstallState(appId)
|
|
||||||
}, 250)
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Update the installation status to the UI
|
|
||||||
* @param {String} appId
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
updateInstallState(appId) {
|
|
||||||
this.$api.app.state(appId).then((res) => {
|
|
||||||
let resData = res.data.data;
|
|
||||||
this.installPercent = resData.speed;
|
|
||||||
this.errorType = resData.type;
|
|
||||||
if (this.errorType == 4) {
|
|
||||||
try {
|
|
||||||
let info = JSON.parse(resData.message)
|
|
||||||
let id = (info.id != undefined) ? info.id : "";
|
|
||||||
let progress = ""
|
|
||||||
if (info.progressDetail != undefined) {
|
|
||||||
let progressDetail = info.progressDetail
|
|
||||||
if (!isNaN(progressDetail.current / progressDetail.total)) {
|
|
||||||
progress = "<br>Progress:" + String(Math.floor((progressDetail.current / progressDetail.total) * 100)) + "%"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let status = info.status
|
|
||||||
this.installText = status + ":" + id + " " + progress
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.installText = resData.message
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resData.speed == 100 || this.errorType == 3) {
|
|
||||||
clearInterval(this.timer)
|
|
||||||
}
|
|
||||||
let _this = this
|
|
||||||
if (resData.speed == 100) {
|
|
||||||
setTimeout(() => {
|
|
||||||
_this.$emit('updateState')
|
|
||||||
_this.$emit('close')
|
|
||||||
}, 1000)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Save edit update
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
updateApp() {
|
|
||||||
this.processData();
|
|
||||||
this.isLoading = true;
|
|
||||||
this.$api.app.updateContainerSetting(this.id, this.initData).then((res) => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.isLoading = false;
|
|
||||||
this.$emit('updateState')
|
|
||||||
} else {
|
|
||||||
this.$buefy.toast.open({
|
|
||||||
message: res.data.message,
|
|
||||||
type: 'is-warning'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.$emit('close')
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Show import panel
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
showImportPanel() {
|
|
||||||
this.$buefy.modal.open({
|
|
||||||
parent: this,
|
|
||||||
component: ImportPanel,
|
|
||||||
hasModalCard: true,
|
|
||||||
customClass: '',
|
|
||||||
trapFocus: true,
|
|
||||||
canCancel: ['escape'],
|
|
||||||
scroll: "keep",
|
|
||||||
animation: "zoom-out",
|
|
||||||
events: {
|
|
||||||
'update': (e) => {
|
|
||||||
this.initData = e
|
|
||||||
this.$buefy.dialog.alert({
|
|
||||||
title: 'Attention',
|
|
||||||
message: 'AutoFill only helps you to complete most of the configuration. Some of the configuration information still needs to be confirmed by you.',
|
|
||||||
type: 'is-dark'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
initData: this.initData,
|
|
||||||
netWorks: this.networks
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Get remote synchronization information
|
|
||||||
* @param {*} function
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
getAsyncData: debounce(function (name) {
|
|
||||||
if (!name.length) {
|
|
||||||
this.data = []
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.isFetching = true
|
|
||||||
axios.get(`https://hub.docker.com/api/content/v1/products/search?source=community&q=${name}&page=1&page_size=4`)
|
|
||||||
.then(({ data }) => {
|
|
||||||
this.data = []
|
|
||||||
data.summaries.forEach((item) => this.data.push(item.name))
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
this.data = []
|
|
||||||
throw error
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
this.isFetching = false
|
|
||||||
})
|
|
||||||
}, 500)
|
|
||||||
|
|
||||||
},
|
|
||||||
destroyed() {
|
|
||||||
clearInterval(this.timer)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:23:01
|
|
||||||
* @Description: Top Search bar
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\SearchBar.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<b-field position="is-centered " class="search-bar has-text-white">
|
|
||||||
<b-input placeholder="Google Search..." v-model="keyText" icon="magnify" icon-right="magnify" icon-right-clickable @icon-right-click="gotoSearch" @keyup.enter.native="gotoSearch" size="is-large" :class="['ovh',isFocus?'fo':'']" expanded @focus="onFocus" @blur="onBlur">
|
|
||||||
</b-input>
|
|
||||||
</b-field>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "search-bar",
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isFocus: false,
|
|
||||||
keyText: ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
/**
|
|
||||||
* @description: Handle Focus event
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
onFocus() {
|
|
||||||
this.isFocus = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Handle Blur event
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
onBlur() {
|
|
||||||
if (this.keyText == "")
|
|
||||||
this.isFocus = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Pop up a new window and jump to google search
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
gotoSearch() {
|
|
||||||
window.open("https://www.google.com/search?q=" + this.keyText, '_blank')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.search-bar {
|
|
||||||
input {
|
|
||||||
transition: all 0.2s;
|
|
||||||
appearance: none;
|
|
||||||
background: rgba(123, 123, 123, 0.16);
|
|
||||||
backdrop-filter: blur(0.875rem);
|
|
||||||
border-radius: 8px;
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
font-size: 1.5rem;
|
|
||||||
color: white;
|
|
||||||
&:focus {
|
|
||||||
border: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
&::placeholder {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.ovh {
|
|
||||||
overflow: hidden;
|
|
||||||
.icon.is-left {
|
|
||||||
transition: all 0.2s;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
.icon.is-right {
|
|
||||||
transition: all 0.2s;
|
|
||||||
right: -3rem !important;
|
|
||||||
color: white !important;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
padding-left: 2.5em !important;
|
|
||||||
padding-right: 1em !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.fo {
|
|
||||||
.icon.is-left {
|
|
||||||
left: -3rem !important;
|
|
||||||
}
|
|
||||||
.icon.is-right {
|
|
||||||
transition: all 0.2s;
|
|
||||||
right: 0 !important;
|
|
||||||
}
|
|
||||||
input {
|
|
||||||
padding-right: 2.5em !important;
|
|
||||||
padding-left: 1em !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:23:49
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\Shortcuts.vue
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<div class="has-text-left mt-6">
|
|
||||||
<div class="title-bar is-flex is-align-items-center">
|
|
||||||
<h1 class="title is-4 has-text-white is-flex-shrink-1">Shortcuts</h1>
|
|
||||||
<div class="buttons ">
|
|
||||||
<b-button icon-left="plus" type="is-dark" size="is-small" rounded>Add shortcut</b-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="columns is-variable is-2 is-multiline ">
|
|
||||||
<div class="column is-narrow is-3" v-for="n in 10" :key="n">
|
|
||||||
<div class="wuji-card is-flex is-align-items-center ">
|
|
||||||
|
|
||||||
<figure class="image is-32x32 simg">
|
|
||||||
<img :src="require('@/assets/img/icon.png')">
|
|
||||||
</figure>
|
|
||||||
<p class="ml-4 flex1 one-line">Test</p>
|
|
||||||
<div class="action-btn1">
|
|
||||||
<b-dropdown aria-role="list" position="is-bottom-left" append-to-body>
|
|
||||||
<template #trigger>
|
|
||||||
<p role="button">
|
|
||||||
<b-icon pack="fas" icon="ellipsis-v" size="is-small">
|
|
||||||
</b-icon>
|
|
||||||
</p>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<b-dropdown-item aria-role="listitem">Action</b-dropdown-item>
|
|
||||||
<b-dropdown-item aria-role="listitem">Another action</b-dropdown-item>
|
|
||||||
<b-dropdown-item aria-role="listitem">Something else</b-dropdown-item>
|
|
||||||
</b-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'shortcuts'
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:20:56
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\SideBar.vue
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<div class="side-bar mr-5">
|
|
||||||
<clock></clock>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Clock from '../assets/widgets/Clock.vue'
|
|
||||||
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'side-bar',
|
|
||||||
components: { Clock },
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:20:19
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: \CasaOS-UI\src\components\Suggestion.vue
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<div class="has-text-left ">
|
|
||||||
<h1 class="title is-4 mt-6 has-text-white">Suggestions</h1>
|
|
||||||
<div class="columns is-variable is-2 is-multiline">
|
|
||||||
<div class="column is-one-third" v-for="(item,index) in list" :key="'ss'+index">
|
|
||||||
<a :href="item.url" target="_blank">
|
|
||||||
<div class="wuji-card is-flex is-align-items-center">
|
|
||||||
<div class="info ">
|
|
||||||
<div class="two-line ">
|
|
||||||
{{item.title}}
|
|
||||||
</div>
|
|
||||||
<div class="des two-line">
|
|
||||||
{{item.content}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<figure class="image is-48x48 simg is-flex">
|
|
||||||
<img :src="item.image_url">
|
|
||||||
</figure>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name:'suggestion',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
list: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$api.task.list().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.list = res.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
<!--
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-23 18:21:13
|
|
||||||
* @Description: Top bar
|
|
||||||
* @FilePath: /CasaOS-UI/src/components/TopBar.vue
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="navbar top-bar is-flex is-align-items-center">
|
|
||||||
<div class="navbar-brand ml-3">
|
|
||||||
<b-dropdown aria-role="list" class="navbar-item" @active-change="onOpen">
|
|
||||||
<template #trigger>
|
|
||||||
<p role="button">
|
|
||||||
<b-icon pack="fas" icon="sliders-h">
|
|
||||||
</b-icon>
|
|
||||||
</p>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<b-dropdown-item aria-role="menu-item" :focusable="false" custom>
|
|
||||||
<h2 class="title is-4">CasaOS Setting</h2>
|
|
||||||
<div class="is-flex is-align-items-center item">
|
|
||||||
<div class="is-flex is-align-items-center flex1">
|
|
||||||
<b-icon pack="fas" icon="sync-alt" class="mr-1"></b-icon> <b>Update</b>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
v{{updateInfo.current_version}}
|
|
||||||
</div>
|
|
||||||
<!-- <b-field>
|
|
||||||
<b-switch v-model="barData.auto_update" type="is-dark" size="is-small" class="is-flex-direction-row-reverse mr-0" @input="saveData">
|
|
||||||
Auto-Check
|
|
||||||
</b-switch>
|
|
||||||
</b-field> -->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="is-flex is-align-items-center pl-5" v-if="!updateInfo.is_need">
|
|
||||||
{{latestText}}
|
|
||||||
<b-icon type="is-success" pack="fas" icon="check" class="ml-1"></b-icon>
|
|
||||||
</div>
|
|
||||||
<div class="is-flex is-align-items-center is-justify-content-end update-container pl-5" v-if="updateInfo.is_need">
|
|
||||||
<div class="flex1">{{updateText}}</div>
|
|
||||||
<b-button type="is-dark" size="is-small" class="ml-2" :loading="isUpdating" rounded @click="updateSystem">Update</b-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</b-dropdown-item>
|
|
||||||
</b-dropdown>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="navbar-menu">
|
|
||||||
<div class="navbar-end mr-3">
|
|
||||||
<!-- <b-icon pack="far" icon="comment-alt"></b-icon> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "top-bar",
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
timer: 0,
|
|
||||||
barData: {
|
|
||||||
auto_update: false,
|
|
||||||
background: "",
|
|
||||||
background_type: "d",
|
|
||||||
search_engine: "google",
|
|
||||||
search_switch: false,
|
|
||||||
shortcuts_switch: false,
|
|
||||||
widgets_switch: false
|
|
||||||
},
|
|
||||||
updateInfo: {
|
|
||||||
current_version: '0',
|
|
||||||
is_need: false,
|
|
||||||
version: Object
|
|
||||||
},
|
|
||||||
isUpdating: false,
|
|
||||||
latestText: "Currently the latest version",
|
|
||||||
updateText: "A new version is available!"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.getConfig();
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
/**
|
|
||||||
* @description: Get CasaOs Configs
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
getConfig() {
|
|
||||||
this.$api.info.systemConfig().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.barData = res.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Save CasaOs Configs
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
saveData() {
|
|
||||||
this.$api.info.saveSystemConfig(this.barData).then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
console.log(res);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Handle Dropmenu state
|
|
||||||
* @param {Boolean} isOpen
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
onOpen(isOpen) {
|
|
||||||
if (isOpen) {
|
|
||||||
this.$api.info.checkVersion().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
this.updateInfo = res.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Update System Version and check update state
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
updateSystem() {
|
|
||||||
this.isUpdating = true;
|
|
||||||
this.$api.info.updateSystem().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
console.log(res.data.data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.checkUpdateState();
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* @description: check update state if is_need is false then reload page
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
checkUpdateState() {
|
|
||||||
this.timer = setInterval(() => {
|
|
||||||
this.$api.info.checkVersion().then(res => {
|
|
||||||
if (res.data.success == 200) {
|
|
||||||
if (!res.data.data.is_need) {
|
|
||||||
clearInterval(this.timer);
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, 3000)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="modal-card">
|
|
||||||
<!-- Modal-Card Header Start -->
|
|
||||||
<header class="modal-card-head">
|
|
||||||
<div class="flex1">
|
|
||||||
<h3 class="title is-4 has-text-weight-normal">Import From Docker CLI</h3>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<!-- Modal-Card Header End -->
|
|
||||||
<!-- Modal-Card Body Start -->
|
|
||||||
<section class="modal-card-body">
|
|
||||||
<b-field label="Command Line" :type="{ 'is-danger': parseError}" :message="errors">
|
|
||||||
<b-input maxlength="800" type="textarea" class="import-area" v-model="dockerCliCommands"></b-input>
|
|
||||||
</b-field>
|
|
||||||
</section>
|
|
||||||
<!-- Modal-Card Body End -->
|
|
||||||
<!-- Modal-Card Footer Start-->
|
|
||||||
<footer class="modal-card-foot is-flex is-align-items-center">
|
|
||||||
<div class="flex1"></div>
|
|
||||||
<div>
|
|
||||||
<b-button label="Cancel" @click="$emit('close')" rounded />
|
|
||||||
<b-button label="Sumbit" type="is-dark" @click="emitSubmit" rounded />
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
<!-- Modal-Card Footer End -->
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import parser from 'yargs-parser'
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
dockerCliCommands: "",
|
|
||||||
parseError: false,
|
|
||||||
errors: "",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
initData: Object,
|
|
||||||
netWorks: Array
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
console.log(this.netWorks);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Emit Event to tell parent Update
|
|
||||||
* @param {*}
|
|
||||||
* @return {*} void
|
|
||||||
*/
|
|
||||||
emitSubmit() {
|
|
||||||
if (this.parseCli()) {
|
|
||||||
this.errors = ""
|
|
||||||
this.$emit('update', this.initData)
|
|
||||||
this.$emit('close')
|
|
||||||
} else {
|
|
||||||
this.errors = "Please fill correct command line"
|
|
||||||
this.parseError = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Parse Import Docker Cli Commands
|
|
||||||
* @return {Boolean}
|
|
||||||
*/
|
|
||||||
parseCli() {
|
|
||||||
const formattedInput = this.dockerCliCommands.replace(/\<[^\>]*\>/g, 'Custom_data').replace(/[\r\n]/g, "").replace(/\\/g, "\\ ").trim();
|
|
||||||
const parsedInput = parser(formattedInput)
|
|
||||||
console.log(parsedInput);
|
|
||||||
const { _: command, ...params } = parsedInput;
|
|
||||||
if (command[0] !== 'docker' || (command[1] !== 'run' && command[1] !== 'create')) {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
//Envs
|
|
||||||
this.initData.envs = this.makeArray(parsedInput.e).map(item => {
|
|
||||||
let ii = item.split("=");
|
|
||||||
return {
|
|
||||||
container: ii[0],
|
|
||||||
host: ii[1]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
//Ports
|
|
||||||
this.initData.ports = this.makeArray(parsedInput.p).map(item => {
|
|
||||||
let pArray = item.split(":")
|
|
||||||
let endArray = pArray[1].split("/")
|
|
||||||
let protocol = (endArray[1]) ? endArray[1] : 'tcp';
|
|
||||||
return {
|
|
||||||
container: endArray[0],
|
|
||||||
host: pArray[0],
|
|
||||||
protocol: protocol
|
|
||||||
}
|
|
||||||
})
|
|
||||||
//Volume
|
|
||||||
this.initData.volumes = this.makeArray(parsedInput.v).map(item => {
|
|
||||||
let ii = item.split(":");
|
|
||||||
return {
|
|
||||||
container: ii[1],
|
|
||||||
host: ii[0]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// Devices
|
|
||||||
this.initData.devices = this.makeArray(parsedInput.device).map(item => {
|
|
||||||
let ii = item.split(":");
|
|
||||||
return {
|
|
||||||
container: ii[1],
|
|
||||||
host: ii[0]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//Network
|
|
||||||
if (parsedInput.network != undefined) {
|
|
||||||
let network = (parsedInput.network == 'physical') ? 'macvlan' : parsedInput.network;
|
|
||||||
let seletNetworks = this.netWorks.filter(item => {
|
|
||||||
if (item.driver == network) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (seletNetworks.length > 0) {
|
|
||||||
this.initData.network_model = seletNetworks[0].networks[0].id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Image
|
|
||||||
this.initData.image = [...command].pop()
|
|
||||||
//Label
|
|
||||||
if (parsedInput.name != undefined) {
|
|
||||||
this.initData.label = parsedInput.name.replace(/^\S/, s => s.toUpperCase())
|
|
||||||
}
|
|
||||||
//Restart
|
|
||||||
if (parsedInput.restart != undefined) {
|
|
||||||
this.initData.restart = parsedInput.restart
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description: Make String to Array
|
|
||||||
* @param {*}
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
makeArray(foo) {
|
|
||||||
let newArray = (typeof (foo) == "string") ? [foo] : foo
|
|
||||||
return (newArray == undefined) ? [] : newArray
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="mb-5">
|
|
||||||
<div class="field is-flex is-align-items-center mb-2">
|
|
||||||
<label class="label mb-0 flex1">{{label}}</label>
|
|
||||||
<b-button icon-left="plus" type="is-dark" size="is-small" rounded @click="addItem">Add</b-button>
|
|
||||||
</div>
|
|
||||||
<div class="is-flex is-align-items-center mb-5 info" v-if="vdata.length == 0">
|
|
||||||
<b-icon pack="fas" icon="info-circle" size="is-small" class="mr-2 "></b-icon>
|
|
||||||
<span>
|
|
||||||
{{message}}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="port-item" v-for="(item,index) in vdata" :key="'port'+index">
|
|
||||||
<b-icon pack="fas" icon="times" size="is-small" class="is-clickable" @click.native="removeItem(index)"></b-icon>
|
|
||||||
<template v-if="index < 1">
|
|
||||||
<b-field grouped>
|
|
||||||
<b-field :label="name1" expanded>
|
|
||||||
<b-input :placeholder="name1" v-model="item.container" expanded @input="handleInput"></b-input>
|
|
||||||
</b-field>
|
|
||||||
<b-field :label="name2" expanded>
|
|
||||||
<b-input :placeholder="name2" v-model="item.host" expanded @input="handleInput"></b-input>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
</b-field>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
|
|
||||||
<b-field grouped>
|
|
||||||
<b-input :placeholder="name1" v-model="item.container" expanded @input="handleInput"></b-input>
|
|
||||||
<b-input :placeholder="name2" v-model="item.host" expanded @input="handleInput"></b-input>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name:'input-group',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isLoading: false,
|
|
||||||
items: [],
|
|
||||||
min: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
model: {
|
|
||||||
prop: 'vdata',
|
|
||||||
event: 'change'
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
vdata: Array,
|
|
||||||
label: String,
|
|
||||||
message: String,
|
|
||||||
name1: {
|
|
||||||
type: String,
|
|
||||||
default: "Container"
|
|
||||||
},
|
|
||||||
name2: {
|
|
||||||
type: String,
|
|
||||||
default: "Host"
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
//this.items = this.vdata;
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
//this.addItem()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
addItem() {
|
|
||||||
let itemObj = {
|
|
||||||
container: "",
|
|
||||||
host: ""
|
|
||||||
}
|
|
||||||
this.vdata.push(itemObj)
|
|
||||||
},
|
|
||||||
|
|
||||||
removeItem(index) {
|
|
||||||
this.vdata.splice(index, 1)
|
|
||||||
this.filterArray()
|
|
||||||
},
|
|
||||||
handleInput() {
|
|
||||||
this.filterArray()
|
|
||||||
},
|
|
||||||
filterArray() {
|
|
||||||
// let newArray = this.items.filter(item => {
|
|
||||||
// if (item.container != "" && item.host != "") {
|
|
||||||
// return true
|
|
||||||
// } else {
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
this.$emit('change', this.vdata)
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="mb-5">
|
|
||||||
<div class="field is-flex is-align-items-center mb-2">
|
|
||||||
<label class="label mb-0 flex1">Ports</label>
|
|
||||||
<b-button icon-left="plus" type="is-dark" size="is-small" rounded @click="addItem">Add</b-button>
|
|
||||||
</div>
|
|
||||||
<div class="is-flex is-align-items-center mb-5 info" v-if="vdata.length == 0">
|
|
||||||
<b-icon pack="fas" icon="info-circle" size="is-small" class="mr-2 "></b-icon>
|
|
||||||
<span>
|
|
||||||
No App Ports now, Click “+” to add one.
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="port-item" v-for="(item,index) in vdata" :key="'port'+index">
|
|
||||||
<b-icon pack="fas" icon="times" size="is-small" class="is-clickable" @click.native="removeItem(index)"></b-icon>
|
|
||||||
<template v-if="index < 1">
|
|
||||||
<b-field grouped>
|
|
||||||
<b-field label="Container" expanded>
|
|
||||||
<b-input placeholder="Container" type="number" v-model="item.container" expanded @input="handleInput"></b-input>
|
|
||||||
</b-field>
|
|
||||||
<b-field label="Host" expanded>
|
|
||||||
<b-input placeholder="Host" type="number" v-model="item.host" expanded @input="handleInput" v-if="showHostPost"></b-input>
|
|
||||||
</b-field>
|
|
||||||
<b-field label="Protocol" expanded>
|
|
||||||
<b-select placeholder="Protocol" v-model="item.protocol" expanded @input="handleInput">
|
|
||||||
<option value="tcp">TCP</option>
|
|
||||||
<option value="udp">UDP</option>
|
|
||||||
<option value="both">TCP + UDP</option>
|
|
||||||
</b-select>
|
|
||||||
</b-field>
|
|
||||||
</b-field>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
|
|
||||||
<b-field grouped>
|
|
||||||
<b-input placeholder="Container" type="number" v-model="item.container" expanded @input="handleInput"></b-input>
|
|
||||||
<b-input placeholder="Host" type="number" v-model="item.host" expanded @input="handleInput" v-if="showHostPost"></b-input>
|
|
||||||
<b-select placeholder="Protocol" v-model="item.protocol" expanded @input="handleInput">
|
|
||||||
<option value="tcp">TCP</option>
|
|
||||||
<option value="udp">UDP</option>
|
|
||||||
<option value="both">TCP + UDP</option>
|
|
||||||
</b-select>
|
|
||||||
</b-field>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'ports',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isLoading: false,
|
|
||||||
items: [],
|
|
||||||
min: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
model: {
|
|
||||||
prop: 'vdata',
|
|
||||||
event: 'change'
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
vdata: Array,
|
|
||||||
showHostPost: Boolean
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
//this.items = this.vdata;
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (this.vdata.length == 0) {
|
|
||||||
//this.addItem()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
addItem() {
|
|
||||||
let itemObj = {
|
|
||||||
container: "",
|
|
||||||
host: "",
|
|
||||||
protocol: "tcp"
|
|
||||||
}
|
|
||||||
this.vdata.push(itemObj)
|
|
||||||
},
|
|
||||||
|
|
||||||
removeItem(index) {
|
|
||||||
this.vdata.splice(index, 1)
|
|
||||||
this.filterArray()
|
|
||||||
},
|
|
||||||
handleInput() {
|
|
||||||
this.filterArray()
|
|
||||||
},
|
|
||||||
filterArray() {
|
|
||||||
// let newArray = this.items.filter(item => {
|
|
||||||
// if (item.container != "" && item.host != "") {
|
|
||||||
// return true
|
|
||||||
// } else {
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
|
|
||||||
this.$emit('change', this.vdata)
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.info {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
color: #5a5a5a;
|
|
||||||
}
|
|
||||||
.port-item {
|
|
||||||
position: relative;
|
|
||||||
.icon {
|
|
||||||
position: absolute;
|
|
||||||
right: -1.5rem;
|
|
||||||
bottom: 0.825rem;
|
|
||||||
}
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
.field.is-expanded {
|
|
||||||
.label {
|
|
||||||
text-align: center;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import Vue from 'vue'
|
|
||||||
import App from '@/App.vue'
|
|
||||||
import router from '@/router'
|
|
||||||
import store from '@/store'
|
|
||||||
import api from '@/service/api.js'
|
|
||||||
import Buefy from 'buefy'
|
|
||||||
import '@/assets/scss/app.scss'
|
|
||||||
|
|
||||||
Vue.use(Buefy)
|
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
|
||||||
Vue.prototype.$api = api;
|
|
||||||
new Vue({
|
|
||||||
router,
|
|
||||||
store,
|
|
||||||
render: h => h(App)
|
|
||||||
}).$mount('#app')
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import { required, confirmed, length, email, min } from "vee-validate/dist/rules";
|
|
||||||
import { extend } from "vee-validate";
|
|
||||||
|
|
||||||
extend("required", {
|
|
||||||
...required,
|
|
||||||
message: "This field is required"
|
|
||||||
});
|
|
||||||
|
|
||||||
extend("email", {
|
|
||||||
...email,
|
|
||||||
message: "This field must be a valid email"
|
|
||||||
});
|
|
||||||
|
|
||||||
extend("confirmed", {
|
|
||||||
...confirmed,
|
|
||||||
message: "This field confirmation does not match"
|
|
||||||
});
|
|
||||||
|
|
||||||
extend("length", {
|
|
||||||
...length,
|
|
||||||
message: "This field must have 2 options"
|
|
||||||
});
|
|
||||||
|
|
||||||
extend("min", {
|
|
||||||
...min,
|
|
||||||
message: "This field must have more than {length} characters"
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-18 23:19:27
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: \CasaOS-UI\src\router\index.js
|
|
||||||
*/
|
|
||||||
import Vue from 'vue'
|
|
||||||
import VueRouter from 'vue-router'
|
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
|
||||||
|
|
||||||
const routes = [
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
const router = new VueRouter({
|
|
||||||
mode: 'history',
|
|
||||||
base: process.env.BASE_URL,
|
|
||||||
routes
|
|
||||||
})
|
|
||||||
|
|
||||||
export default router
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-23 15:59:52
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/src/service/api.js
|
|
||||||
*/
|
|
||||||
import user from "./user.js";
|
|
||||||
import app from './app.js';
|
|
||||||
import task from './task.js';
|
|
||||||
import info from './info.js';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
app,
|
|
||||||
info,
|
|
||||||
user,
|
|
||||||
task
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:20
|
|
||||||
* @Description: Application API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\app.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const app = {
|
|
||||||
//Get Install Info
|
|
||||||
appConfig() {
|
|
||||||
return api.get("/app/install/config");
|
|
||||||
},
|
|
||||||
//Store List
|
|
||||||
storeList(data) {
|
|
||||||
return api.get("/app/list", data);
|
|
||||||
},
|
|
||||||
//Store App Info
|
|
||||||
storeAppInfo(id) {
|
|
||||||
return api.get("/app/appinfo/" + id);
|
|
||||||
},
|
|
||||||
//Store Category List
|
|
||||||
storeCategoryList() {
|
|
||||||
return api.get("/app/category");
|
|
||||||
},
|
|
||||||
//Check Port
|
|
||||||
checkPort(port, type) {
|
|
||||||
let data = {
|
|
||||||
type: type
|
|
||||||
}
|
|
||||||
return api.get('/app/check/' + port, data);
|
|
||||||
},
|
|
||||||
// Get a free port
|
|
||||||
getPort() {
|
|
||||||
return api.get('/app/getport');
|
|
||||||
},
|
|
||||||
// Get app Running State
|
|
||||||
getState(id, data) {
|
|
||||||
return api.get('/app/state/' + id, data);
|
|
||||||
},
|
|
||||||
//Install App
|
|
||||||
install(id, data) {
|
|
||||||
return api.post('/app/install/' + id, data);
|
|
||||||
},
|
|
||||||
//Install Info
|
|
||||||
state(id) {
|
|
||||||
return api.get('/app/speed/' + id);
|
|
||||||
},
|
|
||||||
// Uninstall App
|
|
||||||
uninstall(id) {
|
|
||||||
return api.delete('/app/uninstall/' + id);
|
|
||||||
},
|
|
||||||
//My App List
|
|
||||||
myAppList(data) {
|
|
||||||
return api.get('/app/mylist', data);
|
|
||||||
},
|
|
||||||
//Container info
|
|
||||||
getContainerInfo(id) {
|
|
||||||
return api.get('/app/info/' + id);
|
|
||||||
},
|
|
||||||
//Container Log
|
|
||||||
getContainerLogs(id) {
|
|
||||||
return api.get('/app/logs/' + id)
|
|
||||||
},
|
|
||||||
//Start Or Stop Or Restart A Container with ID
|
|
||||||
startContainer(id, data) {
|
|
||||||
return api.put('/app/state/' + id, data)
|
|
||||||
},
|
|
||||||
getContainerSettingdata(id) {
|
|
||||||
return api.get(`/app/update/${id}/info`)
|
|
||||||
},
|
|
||||||
//Update Container Settings
|
|
||||||
updateContainerSetting(id, data) {
|
|
||||||
return api.put(`/app/update/${id}/setting`, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default app;
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:08
|
|
||||||
* @Description: DDNS Service API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\ddns.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const ddns = {
|
|
||||||
//Add New DDNS
|
|
||||||
add(data) {
|
|
||||||
return api.post("/ddns/set", data);
|
|
||||||
},
|
|
||||||
//Delete a DDNS Item
|
|
||||||
delete(id) {
|
|
||||||
return api.delete("/ddns/delete/" + id);
|
|
||||||
},
|
|
||||||
//Get DDNS List
|
|
||||||
get_list() {
|
|
||||||
return api.get('/ddns/list');
|
|
||||||
},
|
|
||||||
//Ger DDNS Provider List
|
|
||||||
get_provider_list() {
|
|
||||||
return api.get('/ddns/getlist');
|
|
||||||
},
|
|
||||||
//Get Public Internet IP address (IPv4)
|
|
||||||
get_ipv4() {
|
|
||||||
return api.get('/ddns/ip');
|
|
||||||
},
|
|
||||||
// Ping Host
|
|
||||||
ping(host) {
|
|
||||||
return api.get('/ddns/ping/' + host);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default ddns;
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:02
|
|
||||||
* @Description: Disk API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\disk.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const disk = {
|
|
||||||
// get Path list
|
|
||||||
diskInfo() {
|
|
||||||
return api.get('/disk/info');
|
|
||||||
},
|
|
||||||
diskList() {
|
|
||||||
return api.get('/disk/list');
|
|
||||||
},
|
|
||||||
// System path
|
|
||||||
renamePath(oldpath, path) {
|
|
||||||
let data = {
|
|
||||||
oldpath: oldpath,
|
|
||||||
newpath: path
|
|
||||||
}
|
|
||||||
return api.get('/zima/rename', data);
|
|
||||||
},
|
|
||||||
// Make a new Dir
|
|
||||||
mkdir(path) {
|
|
||||||
let data = {
|
|
||||||
path: path
|
|
||||||
}
|
|
||||||
return api.get('/zima/mkdir', data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default disk;
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:25:53
|
|
||||||
* @Description: File API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\file.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const file = {
|
|
||||||
// get Path list
|
|
||||||
dirPath(path) {
|
|
||||||
let data = {
|
|
||||||
path: path
|
|
||||||
}
|
|
||||||
return api.get('/file/dirpath', data);
|
|
||||||
},
|
|
||||||
// System path
|
|
||||||
renamePath(oldpath, path) {
|
|
||||||
let data = {
|
|
||||||
oldpath: oldpath,
|
|
||||||
newpath: path
|
|
||||||
}
|
|
||||||
return api.get('/file/rename', data);
|
|
||||||
},
|
|
||||||
// Make a new Dir
|
|
||||||
mkdir(path) {
|
|
||||||
let data = {
|
|
||||||
path: path
|
|
||||||
}
|
|
||||||
return api.post('/file/mkdir', data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default file;
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-23 17:41:01
|
|
||||||
* @Description: System HardWare Info API
|
|
||||||
* @FilePath: /CasaOS-UI/src/service/info.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const info = {
|
|
||||||
//CPU info
|
|
||||||
cpuInfo() {
|
|
||||||
return api.get("/zima/getcpuinfo");
|
|
||||||
},
|
|
||||||
//Memory Info
|
|
||||||
memoryInfo() {
|
|
||||||
return api.get("/zima/getmeminfo");
|
|
||||||
},
|
|
||||||
//Network Info
|
|
||||||
networkInfo() {
|
|
||||||
return api.get('/zima/getnetinfo');
|
|
||||||
},
|
|
||||||
//Disk Info
|
|
||||||
diskInfo() {
|
|
||||||
return api.get('/zima/getdiskinfo');
|
|
||||||
},
|
|
||||||
//All Info
|
|
||||||
allInfo() {
|
|
||||||
return api.get('/zima/getinfo');
|
|
||||||
},
|
|
||||||
// System Info
|
|
||||||
systemInfo() {
|
|
||||||
return api.get('/zima/sysinfo');
|
|
||||||
},
|
|
||||||
//Get CasaOS Config
|
|
||||||
systemConfig() {
|
|
||||||
return api.get('/sys/config')
|
|
||||||
},
|
|
||||||
//Save CasaOs Config
|
|
||||||
saveSystemConfig(data) {
|
|
||||||
return api.post('/sys/config', data)
|
|
||||||
},
|
|
||||||
// Check Verison
|
|
||||||
checkVersion() {
|
|
||||||
return api.get('/sys/check');
|
|
||||||
},
|
|
||||||
//Update System
|
|
||||||
updateSystem(){
|
|
||||||
return api.post('/sys/update');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default info;
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-23 17:26:31
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/src/service/service.js
|
|
||||||
*/
|
|
||||||
import axios from 'axios'
|
|
||||||
import qs from 'qs'
|
|
||||||
import router from '@/router'
|
|
||||||
import store from '@/store'
|
|
||||||
// Set Post Headers
|
|
||||||
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
|
|
||||||
axios.defaults.withCredentials = false;
|
|
||||||
if (process.env.NODE_ENV === "'dev'") {
|
|
||||||
axios.defaults.baseURL = `http://${store.state.devIp}:8089/v1`;
|
|
||||||
} else {
|
|
||||||
axios.defaults.baseURL = `${document.location.protocol}//${document.location.host}/v1`
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create a axios instance, And set timeout to 30s
|
|
||||||
const instance = axios.create({
|
|
||||||
timeout: 10000,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
window.isRefreshing = false
|
|
||||||
|
|
||||||
let refreshSubscribers = []
|
|
||||||
|
|
||||||
function subscribeTokenRefresh(cb) {
|
|
||||||
refreshSubscribers.push(cb)
|
|
||||||
}
|
|
||||||
|
|
||||||
function onRrefreshed(token) {
|
|
||||||
refreshSubscribers.map(cb => cb(token))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request interceptors
|
|
||||||
instance.interceptors.request.use((config) => {
|
|
||||||
let token = ''
|
|
||||||
if (sessionStorage.getItem("user_token")) {
|
|
||||||
token = sessionStorage.getItem("user_token")
|
|
||||||
}
|
|
||||||
if (localStorage.getItem("user_token")) {
|
|
||||||
token = localStorage.getItem("user_token")
|
|
||||||
}
|
|
||||||
config.headers.Authorization = token
|
|
||||||
if (token === "" && config.url !== "user/login") {
|
|
||||||
if (!window.isRefreshing) {
|
|
||||||
window.isRefreshing = true;
|
|
||||||
axios.post('user/login', qs.stringify({
|
|
||||||
username: "admin",
|
|
||||||
pwd: "admin"
|
|
||||||
})).then(res => {
|
|
||||||
token = res.data.data;
|
|
||||||
store.commit('setToken', token)
|
|
||||||
localStorage.setItem("user_token", token)
|
|
||||||
onRrefreshed(token);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
let retry = new Promise((resolve) => {
|
|
||||||
/* (token) => {...}这个函数就是回调函数 */
|
|
||||||
subscribeTokenRefresh((token) => {
|
|
||||||
config.headers.Authorization = token
|
|
||||||
/* 将请求挂起 */
|
|
||||||
resolve(config)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
return retry
|
|
||||||
} else {
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}, (error) => {
|
|
||||||
// Do something with request error
|
|
||||||
return Promise.reject(error)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 响应拦截(请求返回后拦截)
|
|
||||||
instance.interceptors.response.use(response => {
|
|
||||||
//console.log("响应拦截", response);
|
|
||||||
return response;
|
|
||||||
}, error => {
|
|
||||||
console.log('catch', error)
|
|
||||||
if (error.response) {
|
|
||||||
|
|
||||||
switch (error.response.status) {
|
|
||||||
case 401:
|
|
||||||
sessionStorage.removeItem('user_token') //可能是token过期,清除它
|
|
||||||
router.replace({ //跳转到登录页面
|
|
||||||
path: '/',
|
|
||||||
query: { redirect: router.currentRoute.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
|
|
||||||
})
|
|
||||||
break;
|
|
||||||
case 404:
|
|
||||||
store.commit('setServiceError', true);
|
|
||||||
break;
|
|
||||||
case 500:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
store.commit('setServiceError', true);
|
|
||||||
}
|
|
||||||
return Promise.reject(error)
|
|
||||||
})
|
|
||||||
|
|
||||||
//按照请求类型对axios进行封装
|
|
||||||
const api = {
|
|
||||||
get(url, data) {
|
|
||||||
return instance.get(url, { params: data })
|
|
||||||
},
|
|
||||||
post(url, data) {
|
|
||||||
let newData = (url.indexOf("install") > 0 || url.indexOf("sys") > 0) ? JSON.stringify(data) : qs.stringify(data)
|
|
||||||
if (url.indexOf("install") > 0) {
|
|
||||||
axios.defaults.headers.post['Content-Type'] = 'application/json';
|
|
||||||
} else {
|
|
||||||
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
|
|
||||||
}
|
|
||||||
return instance.post(url, newData)
|
|
||||||
},
|
|
||||||
put(url, data) {
|
|
||||||
let newData = (url.indexOf("setting") > 0) ? JSON.stringify(data) : qs.stringify(data)
|
|
||||||
if (url.indexOf("setting") > 0) {
|
|
||||||
axios.defaults.headers.post['Content-Type'] = 'application/json';
|
|
||||||
} else {
|
|
||||||
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
|
|
||||||
}
|
|
||||||
return instance.put(url, newData)
|
|
||||||
},
|
|
||||||
delete(url, data) {
|
|
||||||
return instance.delete(url, { params: data })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export { api }
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:45
|
|
||||||
* @Description: Task API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\task.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const task = {
|
|
||||||
//List
|
|
||||||
list() {
|
|
||||||
return api.get("/task/list");
|
|
||||||
},
|
|
||||||
//Mark
|
|
||||||
completion(id) {
|
|
||||||
return api.put(`/task/completion/${id}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default task;
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:47
|
|
||||||
* @Description: User API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\user.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const user = {
|
|
||||||
//login
|
|
||||||
login(data) {
|
|
||||||
return api.post("user/login", data);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Create UserName and Password
|
|
||||||
createUsernameAndPaword(data) {
|
|
||||||
return api.post("/user/setusernamepwd", data);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Change User Avatar
|
|
||||||
changeAvatar(data) {
|
|
||||||
return api.post("/user/changhead", data);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Change UserName
|
|
||||||
changeUserName(data) {
|
|
||||||
return api.put("/user/changusername", data);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Change User Password
|
|
||||||
changePassword(data) {
|
|
||||||
return api.put("/user/changuserpwd", data);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Get user info
|
|
||||||
getUserInfo() {
|
|
||||||
return api.get("/user/info");
|
|
||||||
},
|
|
||||||
|
|
||||||
// Change User Info
|
|
||||||
changeUserInfo(data) {
|
|
||||||
return api.post('/user/changuserinfo', data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default user;
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-19 09:26:50
|
|
||||||
* @Description: Zerotier API
|
|
||||||
* @FilePath: \CasaOS-UI\src\service\zerotier.js
|
|
||||||
*/
|
|
||||||
import { api } from "./service.js";
|
|
||||||
|
|
||||||
const zerotier = {
|
|
||||||
//Check if Need login to zerotier
|
|
||||||
isLogin() {
|
|
||||||
return api.get("/zerotier/islogin");
|
|
||||||
},
|
|
||||||
//Login
|
|
||||||
login(data) {
|
|
||||||
return api.post("/zerotier/login", data);
|
|
||||||
},
|
|
||||||
//Register
|
|
||||||
register(data) {
|
|
||||||
return api.post('/zerotier/register', data);
|
|
||||||
},
|
|
||||||
//networklist
|
|
||||||
networkLits() {
|
|
||||||
return api.get('/zerotier/list');
|
|
||||||
},
|
|
||||||
//joinNetwork
|
|
||||||
joinNetwork(id) {
|
|
||||||
return api.post(`/zerotier/join/${id}`);
|
|
||||||
},
|
|
||||||
// leaveNetwork
|
|
||||||
leaveNetwork(id) {
|
|
||||||
return api.post(`/zerotier/leave/${id}`);
|
|
||||||
},
|
|
||||||
// Get Network detial
|
|
||||||
networkDetail(id) {
|
|
||||||
return api.get(`/zerotier/info/${id}`);
|
|
||||||
},
|
|
||||||
// Edit Network
|
|
||||||
editNetwork(id, data) {
|
|
||||||
return api.put(`/zerotier/edit/${id}`, data)
|
|
||||||
},
|
|
||||||
// Delete A Network
|
|
||||||
delNetwork(id) {
|
|
||||||
return api.delete(`/zerotier/network/${id}/del`)
|
|
||||||
},
|
|
||||||
createNetwork() {
|
|
||||||
return api.post('/zerotier/create')
|
|
||||||
},
|
|
||||||
// Get Network member list
|
|
||||||
getMembers(id) {
|
|
||||||
return api.get(`/zerotier/member/${id}`)
|
|
||||||
},
|
|
||||||
// Edit Member
|
|
||||||
editMember(id, mId, data) {
|
|
||||||
return api.put(`/zerotier/member/${id}/edit/${mId}`, data)
|
|
||||||
},
|
|
||||||
// Delete Member
|
|
||||||
delMemeber(id, mId) {
|
|
||||||
return api.delete(`/zerotier/member/${id}/del/${mId}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default zerotier;
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-18 21:32:13
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-22 16:28:16
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/src/store/index.js
|
|
||||||
*/
|
|
||||||
import Vue from 'vue'
|
|
||||||
import Vuex from 'vuex'
|
|
||||||
//import createPersistedState from "vuex-persistedstate";
|
|
||||||
|
|
||||||
Vue.use(Vuex)
|
|
||||||
|
|
||||||
export default new Vuex.Store({
|
|
||||||
//plugins: [createPersistedState()],
|
|
||||||
state: {
|
|
||||||
token: "",
|
|
||||||
devIp: "192.168.2.217",
|
|
||||||
serviceError: false
|
|
||||||
},
|
|
||||||
mutations: {
|
|
||||||
setToken(state, val) {
|
|
||||||
state.token = val
|
|
||||||
},
|
|
||||||
setServiceError(state, val) {
|
|
||||||
state.serviceError = val
|
|
||||||
}
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
},
|
|
||||||
modules: {
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: JerryK
|
|
||||||
* @Date: 2021-09-22 10:10:10
|
|
||||||
* @LastEditors: JerryK
|
|
||||||
* @LastEditTime: 2021-09-22 15:26:47
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: /CasaOS-UI/vue.config.js
|
|
||||||
*/
|
|
||||||
const webpack = require('webpack')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
publicPath: '/ui/',
|
|
||||||
runtimeCompiler: true,
|
|
||||||
lintOnSave: false,
|
|
||||||
productionSourceMap: false,
|
|
||||||
pluginOptions: {
|
|
||||||
|
|
||||||
},
|
|
||||||
chainWebpack: config => {
|
|
||||||
config.plugin('ignore')
|
|
||||||
.use(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
9172
UI/yarn.lock
9172
UI/yarn.lock
File diff suppressed because it is too large
Load Diff
41
alpha.md
Normal file
41
alpha.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-06-27 11:37:26
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-30 14:16:31
|
||||||
|
* @FilePath: /CasaOS/alpha.md
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
# alpha Test Description
|
||||||
|
|
||||||
|
## :warning: Warning
|
||||||
|
|
||||||
|
There is a risk of data loss in non-release versions, so please be careful to back up your data.
|
||||||
|
|
||||||
|
## Install/Update
|
||||||
|
|
||||||
|
``` curl -fsSL https://get.casaos.io | bash -v v0.3.3-alpha ```
|
||||||
|
|
||||||
|
## Check change log
|
||||||
|
|
||||||
|
[CHANGELOG](https://github.com/IceWhaleTech/CasaOS/blob/main/CHANGELOG.md)
|
||||||
|
|
||||||
|
## Check Design drawings
|
||||||
|
|
||||||
|
[Design drawings](https://www.figma.com/file/pvlGobvuWEvbCb3GLqXfim/CasaOS-V0.3.3)
|
||||||
|
|
||||||
|
## Feedback questions
|
||||||
|
|
||||||
|
Go [here]() to give feedback on your question, note that try to match the picture or video
|
||||||
|
|
||||||
|
|
||||||
|
## Retest after update
|
||||||
|
|
||||||
|
Wait for the fix to appear and update and retest, and follow up on the issue
|
||||||
|
|
||||||
|
## Thanks
|
||||||
|
|
||||||
|
Thank you for your great support, we will return your support from time to time.
|
||||||
40
conf/conf.conf
Normal file
40
conf/conf.conf
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
[app]
|
||||||
|
PAGE_SIZE = 10
|
||||||
|
RuntimeRootPath = runtime/
|
||||||
|
LogPath = ./CasaOS/logs/server/
|
||||||
|
LogSaveName = log
|
||||||
|
LogFileExt = log
|
||||||
|
DateStrFormat = 20060102
|
||||||
|
DateTimeFormat = 2006-01-02 15:04:05
|
||||||
|
TimeFormat = 15:04:05
|
||||||
|
DateFormat = 2006-01-02
|
||||||
|
DBPath = ./CasaOS/server/db
|
||||||
|
ShellPath = ./CasaOS/server/shell
|
||||||
|
UserDataPath = ./CasaOS/conf
|
||||||
|
TempPath = ./CasaOS/temp
|
||||||
|
|
||||||
|
[server]
|
||||||
|
HttpPort = 8089
|
||||||
|
UDPPort = 54216
|
||||||
|
RunMode = release
|
||||||
|
;ServerApi = https://api.casaos.io/casaos-api
|
||||||
|
ServerApi = http://127.0.0.1:8091
|
||||||
|
Handshake = socket.casaos.io
|
||||||
|
Token = af268e4f-9f3a-408a-b59b-cf1a4f7f88c8
|
||||||
|
USBAutoMount =
|
||||||
|
SocketPort = 58313
|
||||||
|
|
||||||
|
[system]
|
||||||
|
ConfigStr = {"auto_update":false,"background":"","background_type":"","search_engine":"https://duckduckgo.com/?q=","search_switch":false,"shortcuts_switch":false,"widgets_switch":false,"lang":"en_us"}
|
||||||
|
WidgetList = [{"name":"clock","show":true},{"name":"cpu","show":true},{"name":"disks","show":true},{"name":"network","show":true}]
|
||||||
|
|
||||||
|
[file]
|
||||||
|
ShareDir =
|
||||||
|
DownloadDir = ./CasaOS/DATA/Downloads
|
||||||
|
|
||||||
|
[user]
|
||||||
|
Description = nothing
|
||||||
|
UserName = casaos
|
||||||
|
Initialized = true
|
||||||
|
PWD = 123456
|
||||||
|
|
||||||
32
conf/conf.conf.sample
Normal file
32
conf/conf.conf.sample
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[app]
|
||||||
|
PAGE_SIZE = 10
|
||||||
|
RuntimeRootPath = runtime/
|
||||||
|
LogPath = /var/log/casaos/
|
||||||
|
LogSaveName = log
|
||||||
|
LogFileExt = log
|
||||||
|
DateStrFormat = 20060102
|
||||||
|
DateTimeFormat = 2006-01-02 15:04:05
|
||||||
|
TimeFormat = 15:04:05
|
||||||
|
DateFormat = 2006-01-02
|
||||||
|
DBPath = /var/lib/casaos
|
||||||
|
ShellPath = /usr/share/casaos/shell
|
||||||
|
UserDataPath = /var/lib/casaos/conf
|
||||||
|
TempPath = /var/lib/casaos/temp
|
||||||
|
|
||||||
|
[server]
|
||||||
|
HttpPort = 80
|
||||||
|
UDPPort =
|
||||||
|
RunMode = release
|
||||||
|
ServerApi = https://api.casaos.io/casaos-api
|
||||||
|
Handshake = socket.casaos.io
|
||||||
|
Token =
|
||||||
|
USBAutoMount =
|
||||||
|
|
||||||
|
|
||||||
|
[system]
|
||||||
|
WidgetList =
|
||||||
|
|
||||||
|
|
||||||
|
[file]
|
||||||
|
ShareDir =
|
||||||
|
DownloadDir =
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
[app]
|
|
||||||
PAGE_SIZE = 10
|
|
||||||
RuntimeRootPath = runtime/
|
|
||||||
LogSavePath = /casaOS/logs/server/
|
|
||||||
LogSaveName = log
|
|
||||||
LogFileExt = log
|
|
||||||
; 必须的格式
|
|
||||||
DateStrFormat = 20060102
|
|
||||||
DateTimeFormat = 2006-01-02 15:04:05
|
|
||||||
TimeFormat = 15:04:05
|
|
||||||
DateFormat = 2006-01-02
|
|
||||||
|
|
||||||
|
|
||||||
[server]
|
|
||||||
HttpPort = 8089
|
|
||||||
RunMode = debug
|
|
||||||
;ServerApi = http://113.52.135.30:8090
|
|
||||||
;ServerApi = https://casaos.zimaboard.com
|
|
||||||
;ServerApi = http://192.168.2.167:8090
|
|
||||||
ServerApi = http://192.168.2.142:8090
|
|
||||||
|
|
||||||
[user]
|
|
||||||
UserName = admin
|
|
||||||
PWD = zimaboard
|
|
||||||
Email = aaa@222.ddd
|
|
||||||
Description = ddddddd
|
|
||||||
Token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImVyZXJlIiwicGFzc3dvcmQiOiJhZHNmZGYiLCJleHAiOjE2MjQwMDU0ODEsImlzcyI6Imdpbi1ibG9nIn0.JNsCccZuFCwlSMLJg62iOIB2xymk_k7xGa11xhZ07bc
|
|
||||||
|
|
||||||
[zerotier]
|
|
||||||
UserName = ddddd
|
|
||||||
PWD =
|
|
||||||
Token = yBKYyavr2RdFAIVN7iTpzlsB1o6CqTgm
|
|
||||||
|
|
||||||
[redis]
|
|
||||||
Host = 192.168.2.167:6379
|
|
||||||
Password =
|
|
||||||
MaxIdle = 30
|
|
||||||
MaxActive = 30
|
|
||||||
IdleTimeout = 200
|
|
||||||
|
|
||||||
[system]
|
|
||||||
AutoUpdate = true
|
|
||||||
SearchSwitch = true
|
|
||||||
WidgetsSwitch = false
|
|
||||||
ShortcutsSwitch = true
|
|
||||||
SearchEngine = baidu
|
|
||||||
Background = http://baidu.com1
|
|
||||||
BackgroundType = d
|
|
||||||
|
|
||||||
2901
docs/docs.go
2901
docs/docs.go
File diff suppressed because it is too large
Load Diff
2839
docs/swagger.json
2839
docs/swagger.json
File diff suppressed because it is too large
Load Diff
1753
docs/swagger.yaml
1753
docs/swagger.yaml
File diff suppressed because it is too large
Load Diff
BIN
file/lll.png
BIN
file/lll.png
Binary file not shown.
|
Before Width: | Height: | Size: 116 KiB |
74
go.mod
74
go.mod
@@ -1,57 +1,85 @@
|
|||||||
module oasis
|
module github.com/IceWhaleTech/CasaOS
|
||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/PuerkitoBio/goquery v1.7.0
|
github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d
|
||||||
|
github.com/Microsoft/go-winio v0.5.0 // indirect
|
||||||
|
github.com/Microsoft/hcsshim v0.8.22 // indirect
|
||||||
github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 // indirect
|
github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 // indirect
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
github.com/ambelovsky/go-structs v1.1.0 // indirect
|
||||||
github.com/containerd/containerd v1.5.2
|
github.com/ambelovsky/gosf v0.0.0-20201109201340-237aea4d6109
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
github.com/ambelovsky/gosf-socketio v0.0.0-20201109193639-add9d32f8b19 // indirect
|
||||||
|
github.com/bits-and-blooms/bitset v1.2.1 // indirect
|
||||||
|
github.com/containerd/containerd v1.5.7
|
||||||
|
github.com/containerd/continuity v0.2.0 // indirect
|
||||||
|
github.com/disintegration/imaging v1.6.2
|
||||||
|
github.com/docker/distribution v2.8.0+incompatible // indirect
|
||||||
github.com/docker/docker v20.10.7+incompatible
|
github.com/docker/docker v20.10.7+incompatible
|
||||||
github.com/docker/go-connections v0.4.0
|
github.com/docker/go-connections v0.4.0
|
||||||
|
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b
|
||||||
|
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
|
||||||
github.com/forease/gotld v0.0.0-20190808124948-c50ff635576b
|
github.com/forease/gotld v0.0.0-20190808124948-c50ff635576b
|
||||||
github.com/gin-contrib/gzip v0.0.2 // indirect
|
github.com/gin-contrib/gzip v0.0.2
|
||||||
github.com/gin-gonic/gin v1.7.2
|
github.com/gin-gonic/gin v1.7.2
|
||||||
github.com/go-ini/ini v1.62.0
|
github.com/go-ini/ini v1.62.0
|
||||||
github.com/go-ole/go-ole v1.2.5 // indirect
|
github.com/go-ole/go-ole v1.2.5 // indirect
|
||||||
github.com/go-openapi/jsonreference v0.19.6 // indirect
|
github.com/go-openapi/spec v0.20.4 // indirect
|
||||||
github.com/go-openapi/spec v0.20.3 // indirect
|
|
||||||
github.com/go-openapi/swag v0.19.15 // indirect
|
|
||||||
github.com/go-playground/validator/v10 v10.6.1 // indirect
|
github.com/go-playground/validator/v10 v10.6.1 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/gogo/googleapis v1.4.1 // indirect
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.4.1
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/gomodule/redigo v1.8.5
|
github.com/gomodule/redigo v1.8.5
|
||||||
github.com/google/go-github/v36 v36.0.0
|
github.com/google/go-github/v36 v36.0.0
|
||||||
|
github.com/google/uuid v1.3.0 // indirect
|
||||||
|
github.com/googollee/go-socket.io v1.6.2
|
||||||
github.com/gorilla/mux v1.8.0 // indirect
|
github.com/gorilla/mux v1.8.0 // indirect
|
||||||
github.com/gorilla/websocket v1.4.2
|
github.com/gorilla/websocket v1.4.2
|
||||||
github.com/jinzhu/copier v0.3.2
|
github.com/jinzhu/copier v0.3.2
|
||||||
github.com/json-iterator/go v1.1.11 // indirect
|
github.com/json-iterator/go v1.1.11 // indirect
|
||||||
|
github.com/klauspost/compress v1.13.6 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
|
github.com/lucas-clemente/quic-go v0.25.0
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.13 // indirect
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.11 // indirect
|
||||||
|
github.com/mholt/archiver/v3 v3.5.1
|
||||||
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
|
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
|
||||||
github.com/morikuni/aec v1.0.0 // indirect
|
github.com/morikuni/aec v1.0.0 // indirect
|
||||||
|
github.com/opencontainers/image-spec v1.0.2 // indirect
|
||||||
|
github.com/opencontainers/selinux v1.8.5 // indirect
|
||||||
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prestonTao/upnp v0.0.0-20150206124352-f4370df5e109
|
github.com/prestonTao/upnp v0.0.0-20150206124352-f4370df5e109
|
||||||
|
github.com/prometheus/procfs v0.7.3 // indirect
|
||||||
github.com/robfig/cron v1.2.0
|
github.com/robfig/cron v1.2.0
|
||||||
github.com/satori/go.uuid v1.2.0
|
github.com/satori/go.uuid v1.2.0
|
||||||
github.com/shirou/gopsutil/v3 v3.21.5
|
github.com/shirou/gopsutil/v3 v3.21.5
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
|
github.com/smartystreets/assertions v1.2.0 // indirect
|
||||||
github.com/smartystreets/goconvey v1.6.4 // indirect
|
github.com/smartystreets/goconvey v1.6.4 // indirect
|
||||||
github.com/swaggo/gin-swagger v1.3.0
|
github.com/swaggo/gin-swagger v1.3.0
|
||||||
github.com/swaggo/swag v1.7.0
|
github.com/swaggo/swag v1.7.3
|
||||||
github.com/tidwall/gjson v1.8.0
|
github.com/tidwall/gjson v1.10.2
|
||||||
github.com/tklauser/go-sysconf v0.3.6 // indirect
|
github.com/tklauser/go-sysconf v0.3.6 // indirect
|
||||||
github.com/ugorji/go v1.2.6 // indirect
|
github.com/ugorji/go v1.2.6 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
|
go.opencensus.io v0.23.0 // indirect
|
||||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
|
go.uber.org/zap v1.10.0
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
|
||||||
golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 // indirect
|
golang.org/x/mod v0.5.0 // indirect
|
||||||
golang.org/x/tools v0.1.3 // indirect
|
golang.org/x/net v0.0.0-20211020060615-d418f374d309 // indirect
|
||||||
google.golang.org/grpc v1.39.0 // indirect
|
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f
|
||||||
|
golang.org/x/sys v0.0.0-20211020174200-9d6173849985 // indirect
|
||||||
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
|
||||||
|
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||||
|
golang.org/x/tools v0.1.7 // indirect
|
||||||
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0 // indirect
|
||||||
|
google.golang.org/grpc v1.41.0 // indirect
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
gopkg.in/ini.v1 v1.62.0 // indirect
|
gopkg.in/ini.v1 v1.62.0 // indirect
|
||||||
gorm.io/driver/mysql v1.1.1 // indirect
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||||
gorm.io/driver/sqlite v1.1.5
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
||||||
gorm.io/gorm v1.21.15
|
gorm.io/driver/sqlite v1.2.6
|
||||||
src.techknowlogick.com/xgo v1.4.1-0.20210909190026-ce016894db20 // indirect
|
gorm.io/gorm v1.22.5
|
||||||
)
|
)
|
||||||
|
|||||||
131
main.go
131
main.go
@@ -3,59 +3,140 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/IceWhaleTech/CasaOS/model/notify"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/cache"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/sqlite"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/encryption"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/loger"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/random"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/route"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/service"
|
||||||
|
|
||||||
"github.com/robfig/cron"
|
"github.com/robfig/cron"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"net/http"
|
|
||||||
"oasis/pkg/config"
|
|
||||||
"oasis/pkg/sqlite"
|
|
||||||
loger2 "oasis/pkg/utils/loger"
|
|
||||||
"oasis/route"
|
|
||||||
"oasis/service"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var sqliteDB *gorm.DB
|
var sqliteDB *gorm.DB
|
||||||
|
|
||||||
var swagHandler gin.HandlerFunc
|
|
||||||
var configFlag = flag.String("c", "", "config address")
|
var configFlag = flag.String("c", "", "config address")
|
||||||
|
var dbFlag = flag.String("db", "", "db path")
|
||||||
|
var showUserInfo = flag.Bool("show-user-info", false, "show user info")
|
||||||
|
var resetUser = flag.Bool("ru", false, "reset user")
|
||||||
|
var user = flag.String("user", "", "user name")
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
config.InitSetup(*configFlag)
|
config.InitSetup(*configFlag)
|
||||||
loger2.LogSetup()
|
config.UpdateSetup()
|
||||||
sqliteDB = sqlite.GetDb(config.AppInfo.ProjectPath)
|
loger.LogInit()
|
||||||
|
if len(*dbFlag) == 0 {
|
||||||
|
*dbFlag = config.AppInfo.DBPath + "/db"
|
||||||
|
}
|
||||||
|
sqliteDB = sqlite.GetDb(*dbFlag)
|
||||||
//gredis.GetRedisConn(config.RedisInfo),
|
//gredis.GetRedisConn(config.RedisInfo),
|
||||||
service.MyService = service.NewService(sqliteDB, loger2.NewOLoger())
|
service.MyService = service.NewService(sqliteDB)
|
||||||
|
service.Cache = cache.Init()
|
||||||
|
|
||||||
|
service.GetToken()
|
||||||
|
service.UDPAddressMap = make(map[string]string)
|
||||||
|
//go service.SocketConnect()
|
||||||
|
service.CancelList = make(map[string]string)
|
||||||
|
service.InternalInspection = make(map[string][]string)
|
||||||
|
service.NewVersionApp = make(map[string]string)
|
||||||
|
route.InitFunction()
|
||||||
|
|
||||||
|
// go service.LoopFriend()
|
||||||
|
// go service.MyService.App().CheckNewImage()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @title Oasis API
|
// @title casaOS API
|
||||||
// @version 1.0.0
|
// @version 1.0.0
|
||||||
// @contact.name lauren.pan
|
// @contact.name lauren.pan
|
||||||
// @contact.url https://www.zimaboard.com
|
// @contact.url https://www.zimaboard.com
|
||||||
// @contact.email lauren.pan@icewhale.org
|
// @contact.email lauren.pan@icewhale.org
|
||||||
// @description Oasis v1版本api
|
// @description casaOS v1版本api
|
||||||
// @host 192.168.2.114:8089
|
// @host 192.168.2.217:8089
|
||||||
// @securityDefinitions.apikey ApiKeyAuth
|
// @securityDefinitions.apikey ApiKeyAuth
|
||||||
// @in header
|
// @in header
|
||||||
// @name Authorization
|
// @name Authorization
|
||||||
// @BasePath /v1
|
// @BasePath /v1
|
||||||
func main() {
|
func main() {
|
||||||
|
service.NotifyMsg = make(chan notify.Message, 10)
|
||||||
|
if *showUserInfo {
|
||||||
|
fmt.Println("CasaOS User Info")
|
||||||
|
fmt.Println("UserName:" + config.UserInfo.UserName)
|
||||||
|
fmt.Println("Password:" + config.UserInfo.PWD)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("Reset User", *resetUser)
|
||||||
|
if *resetUser {
|
||||||
|
|
||||||
|
if user == nil || len(*user) == 0 {
|
||||||
|
fmt.Println("user is empty")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userData := service.MyService.User().GetUserAllInfoByName(*user)
|
||||||
|
if userData.Id == 0 {
|
||||||
|
fmt.Println("user not exist")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
password := random.RandomString(6, false)
|
||||||
|
userData.Password = encryption.GetMD5ByStr(password)
|
||||||
|
service.MyService.User().UpdateUserPassword(userData)
|
||||||
|
fmt.Println("User reset successful")
|
||||||
|
fmt.Println("UserName:" + userData.UserName)
|
||||||
|
fmt.Println("Password:" + password)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
service.UDPService()
|
||||||
|
service.SendIPToServer()
|
||||||
|
}()
|
||||||
|
go route.SocketInit(service.NotifyMsg)
|
||||||
|
go func() {
|
||||||
|
for i := 0; i < 1000; i++ {
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
//service.NotifyMsg <- strconv.Itoa(i)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
//model.Setup()
|
//model.Setup()
|
||||||
//gredis.Setup()
|
//gredis.Setup()
|
||||||
r := route.InitRouter(swagHandler)
|
r := route.InitRouter()
|
||||||
service.SyncTask(sqliteDB)
|
//service.SyncTask(sqliteDB)
|
||||||
cron2 := cron.New() //创建一个cron实例
|
cron2 := cron.New()
|
||||||
//执行定时任务(每5秒执行一次)
|
//every day execution
|
||||||
err := cron2.AddFunc("0 0 0 1/1 * *", func() {
|
err := cron2.AddFunc("0 0/5 * * * *", func() {
|
||||||
|
//service.PushIpInfo(*&config.ServerInfo.Token)
|
||||||
//service.UpdataDDNSList(mysqldb)
|
//service.UpdataDDNSList(mysqldb)
|
||||||
service.SyncTask(sqliteDB)
|
//service.SyncTask(sqliteDB)
|
||||||
|
|
||||||
|
service.SendIPToServer()
|
||||||
|
|
||||||
|
service.LoopFriend()
|
||||||
|
//service.MyService.App().CheckNewImage()
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
err = cron2.AddFunc("0/5 * * * * *", func() {
|
||||||
|
if service.ClientCount > 0 {
|
||||||
|
//route.SendNetINfoBySocket()
|
||||||
|
//route.SendCPUBySocket()
|
||||||
|
//route.SendMemBySocket()
|
||||||
|
// route.SendDiskBySocket()
|
||||||
|
//route.SendUSBBySocket()
|
||||||
|
route.SendAllHardwareStatusBySocket()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//启动/关闭
|
|
||||||
cron2.Start()
|
cron2.Start()
|
||||||
defer cron2.Stop()
|
defer cron2.Stop()
|
||||||
s := &http.Server{
|
s := &http.Server{
|
||||||
@@ -65,6 +146,10 @@ func main() {
|
|||||||
WriteTimeout: 60 * time.Second,
|
WriteTimeout: 60 * time.Second,
|
||||||
MaxHeaderBytes: 1 << 20,
|
MaxHeaderBytes: 1 << 20,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.ListenAndServe()
|
s.ListenAndServe()
|
||||||
|
|
||||||
|
// if err := r.Run(fmt.Sprintf(":%v", config.ServerInfo.HttpPort)); err != nil {
|
||||||
|
// fmt.Println("failed run app: ", err)
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2021-10-08 10:29:08
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-21 15:10:03
|
||||||
|
* @FilePath: /CasaOS/middleware/gin.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/loger"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Cors() gin.HandlerFunc {
|
func Cors() gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
method := c.Request.Method
|
method := c.Request.Method
|
||||||
//origin := c.Request.Header.Get("Origin") //请求头部
|
|
||||||
//if origin != "" {
|
|
||||||
//接收客户端发送的origin (重要!)
|
|
||||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
|
||||||
c.Header("Access-Control-Allow-Origin", "*")
|
c.Header("Access-Control-Allow-Origin", "*")
|
||||||
//服务器支持的所有跨域请求的方法
|
|
||||||
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
|
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
|
||||||
//允许跨域设置可以返回其他子段,可以自定义字段
|
//允许跨域设置可以返回其他子段,可以自定义字段
|
||||||
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session")
|
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,Language")
|
||||||
// 允许浏览器(客户端)可以解析的头部 (重要)
|
// 允许浏览器(客户端)可以解析的头部 (重要)
|
||||||
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
|
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
|
||||||
|
//c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, Content-Length, X-CSRF-Token, Token, session, Origin, Host, Connection, Accept-Encoding, Accept-Language, X-Requested-With")
|
||||||
//设置缓存时间
|
//设置缓存时间
|
||||||
c.Header("Access-Control-Max-Age", "172800")
|
c.Header("Access-Control-Max-Age", "172800")
|
||||||
//允许客户端传递校验信息比如 cookie (重要)
|
|
||||||
c.Header("Access-Control-Allow-Credentials", "true")
|
c.Header("Access-Control-Allow-Credentials", "true")
|
||||||
c.Set("content-type", "application/json")
|
c.Set("content-type", "application/json")
|
||||||
//}
|
//}
|
||||||
@@ -41,3 +50,9 @@ func Cors() gin.HandlerFunc {
|
|||||||
c.Next()
|
c.Next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func WriteLog() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
loger.Info("request:", zap.Any("path", c.Request.URL.String()), zap.Any("param", c.Params), zap.Any("query", c.Request.URL.Query()), zap.Any("body", c.Request.Body), zap.Any("method", c.Request.Method))
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
27
model/app-analyse.go
Normal file
27
model/app-analyse.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-03-18 11:40:55
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-05-13 14:48:01
|
||||||
|
* @FilePath: /CasaOS/model/app-analyse.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package model
|
||||||
|
|
||||||
|
type AppAnalyse struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
UUId string `json:"uuid"`
|
||||||
|
Language string `json:"language"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConnectionStatus struct {
|
||||||
|
From string `json:"from"`
|
||||||
|
To string `json:"to"`
|
||||||
|
Error string `json:"error"`
|
||||||
|
UUId string `json:"uuid"`
|
||||||
|
Event string `json:"event"`
|
||||||
|
}
|
||||||
27
model/app.go
27
model/app.go
@@ -6,6 +6,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ServerAppListCollection struct {
|
||||||
|
List []ServerAppList `json:"list"`
|
||||||
|
Recommend []ServerAppList `json:"recommend"`
|
||||||
|
Community []ServerAppList `json:"community"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
type ServerAppList struct {
|
type ServerAppList struct {
|
||||||
Id uint `gorm:"column:id;primary_key" json:"id"`
|
Id uint `gorm:"column:id;primary_key" json:"id"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
@@ -15,12 +22,16 @@ type ServerAppList struct {
|
|||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
ScreenshotLink Strings `gorm:"type:json" json:"screenshot_link"`
|
ScreenshotLink Strings `gorm:"type:json" json:"screenshot_link"`
|
||||||
Category string `json:"category"`
|
Category string `json:"category"`
|
||||||
TcpPort uint `json:"tcp_port"`
|
CategoryId int `json:"category_id"`
|
||||||
PortMap uint `json:"port_map"`
|
CategoryFont string `json:"category_font"`
|
||||||
|
PortMap string `json:"port_map"`
|
||||||
ImageVersion string `json:"image_version"`
|
ImageVersion string `json:"image_version"`
|
||||||
Tip string `json:"tip"`
|
Tip string `json:"tip"`
|
||||||
Configures configures `gorm:"type:json" json:"configures"`
|
Envs EnvArray `json:"envs"`
|
||||||
NetworkModel string `json:"network_mode"`
|
Ports PortArray `json:"ports"`
|
||||||
|
Volumes PathArray `json:"volumes"`
|
||||||
|
Devices PathArray `json:"devices"`
|
||||||
|
NetworkModel string `json:"network_model"`
|
||||||
Image string `json:"image"`
|
Image string `json:"image"`
|
||||||
Index string `json:"index"`
|
Index string `json:"index"`
|
||||||
CreatedAt time.Time `json:"created_at"`
|
CreatedAt time.Time `json:"created_at"`
|
||||||
@@ -33,6 +44,14 @@ type ServerAppList struct {
|
|||||||
Thumbnail string `json:"thumbnail"`
|
Thumbnail string `json:"thumbnail"`
|
||||||
Healthy string `json:"healthy"`
|
Healthy string `json:"healthy"`
|
||||||
Plugins Strings `json:"plugins"`
|
Plugins Strings `json:"plugins"`
|
||||||
|
Origin string `json:"origin"`
|
||||||
|
Type int `json:"type"`
|
||||||
|
QueryCount int `json:"query_count"`
|
||||||
|
Developer string `json:"developer"`
|
||||||
|
HostName string `json:"host_name"`
|
||||||
|
Privileged bool `json:"privileged"`
|
||||||
|
CapAdd Strings `json:"cap_add"`
|
||||||
|
Cmd Strings `json:"cmd"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ports struct {
|
type Ports struct {
|
||||||
|
|||||||
@@ -1,10 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* @Author: link a624669980@163.com
|
||||||
|
* @Date: 2022-05-16 17:37:08
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-22 17:45:53
|
||||||
|
* @FilePath: /CasaOS/model/category.go
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
|
||||||
|
*/
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type ServerCategoryList struct {
|
type ServerCategoryList struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Item []CategoryList `json:"item"`
|
||||||
|
}
|
||||||
|
type CategoryList struct {
|
||||||
Id uint `gorm:"column:id;primary_key" json:"id"`
|
Id uint `gorm:"column:id;primary_key" json:"id"`
|
||||||
//CreatedAt time.Time `json:"created_at"`
|
//CreatedAt time.Time `json:"created_at"`
|
||||||
//
|
//
|
||||||
//UpdatedAt time.Time `json:"updated_at"`
|
//UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
Font string `json:"font"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Count uint `json:"count"`
|
Count uint `json:"count"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,12 +20,57 @@ type LSBLKModel struct {
|
|||||||
Format string `json:"format"`
|
Format string `json:"format"`
|
||||||
Health string `json:"health"`
|
Health string `json:"health"`
|
||||||
HotPlug bool `json:"hotplug"`
|
HotPlug bool `json:"hotplug"`
|
||||||
|
UUID string `json:"uuid"`
|
||||||
FSUsed string `json:"fsused"`
|
FSUsed string `json:"fsused"`
|
||||||
|
Temperature int `json:"temperature"`
|
||||||
Tran string `json:"tran"`
|
Tran string `json:"tran"`
|
||||||
MinIO uint64 `json:"min-io"`
|
MinIO uint64 `json:"min-io"`
|
||||||
UsedPercent float64 `json:"used_percent"`
|
UsedPercent float64 `json:"used_percent"`
|
||||||
|
Serial string `json:"serial"`
|
||||||
Children []LSBLKModel `json:"children"`
|
Children []LSBLKModel `json:"children"`
|
||||||
|
SubSystems string `json:"subsystems"`
|
||||||
//详情特有
|
//详情特有
|
||||||
StartSector uint64 `json:"start_sector,omitempty"`
|
StartSector uint64 `json:"start_sector,omitempty"`
|
||||||
|
Rota bool `json:"rota"` //true(hhd) false(ssd)
|
||||||
|
DiskType string `json:"disk_type"`
|
||||||
EndSector uint64 `json:"end_sector,omitempty"`
|
EndSector uint64 `json:"end_sector,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Drive struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Size uint64 `json:"size"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
Health string `json:"health"`
|
||||||
|
Temperature int `json:"temperature"`
|
||||||
|
DiskType string `json:"disk_type"`
|
||||||
|
NeedFormat bool `json:"need_format"`
|
||||||
|
Serial string `json:"serial"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DriveUSB struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Size uint64 `json:"size"`
|
||||||
|
Used uint64 `json:"use"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
Mount bool `json:"mount"` //是否完全挂载
|
||||||
|
Avail uint64 `json:"avail"` //可用空间
|
||||||
|
}
|
||||||
|
|
||||||
|
type Storage struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
MountPoint string `json:"mountpoint"`
|
||||||
|
Size string `json:"size"`
|
||||||
|
Avail string `json:"avail"` //可用空间
|
||||||
|
Type string `json:"type"`
|
||||||
|
CreatedAt int64 `json:"create_at"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
DriveName string `json:"drive_name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Summary struct {
|
||||||
|
Size uint64 `json:"size"`
|
||||||
|
Avail uint64 `json:"avail"` //可用空间
|
||||||
|
Health bool `json:"health"`
|
||||||
|
Used uint64 `json:"used"`
|
||||||
|
}
|
||||||
|
|||||||
18
model/docker.go
Normal file
18
model/docker.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2021-12-08 18:10:25
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-14 17:20:36
|
||||||
|
* @FilePath: /CasaOS/model/docker.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package model
|
||||||
|
|
||||||
|
type DockerStatsModel struct {
|
||||||
|
Icon string `json:"icon"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
Pre interface{} `json:"pre"`
|
||||||
|
}
|
||||||
33
model/file.go
Normal file
33
model/file.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-20 16:27:12
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-09 18:18:46
|
||||||
|
* @FilePath: /CasaOS/model/file.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package model
|
||||||
|
|
||||||
|
type FileOperate struct {
|
||||||
|
Type string `json:"type" binding:"required"`
|
||||||
|
Item []FileItem `json:"item" binding:"required"`
|
||||||
|
TotalSize int64 `json:"total_size"`
|
||||||
|
ProcessedSize int64 `json:"processed_size"`
|
||||||
|
To string `json:"to" binding:"required"`
|
||||||
|
Style string `json:"style"`
|
||||||
|
Finished bool `json:"finished"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileItem struct {
|
||||||
|
From string `json:"from" binding:"required"`
|
||||||
|
Finished bool `json:"finished"`
|
||||||
|
Size int64 `json:"size"`
|
||||||
|
ProcessedSize int64 `json:"processed_size"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileUpdate struct {
|
||||||
|
FilePath string `json:"path" binding:"required"`
|
||||||
|
FileContent string `json:"content" binding:"required"`
|
||||||
|
}
|
||||||
6
model/heart.go
Normal file
6
model/heart.go
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type CasaOSHeart struct {
|
||||||
|
UuId string `json:"uuid"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
@@ -17,20 +17,22 @@ type UdpPorts struct {
|
|||||||
/*******************使用gorm支持json************************************/
|
/*******************使用gorm支持json************************************/
|
||||||
|
|
||||||
type PortMap struct {
|
type PortMap struct {
|
||||||
ContainerPort string `json:"container,omitempty"`
|
ContainerPort string `json:"container"`
|
||||||
CommendPort string `json:"host,omitempty"`
|
CommendPort string `json:"host"`
|
||||||
Protocol string `json:"protocol"`
|
Protocol string `json:"protocol"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
Type int `json:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PortArrey []PortMap
|
type PortArray []PortMap
|
||||||
|
|
||||||
// Value 实现方法
|
// Value 实现方法
|
||||||
func (p PortArrey) Value() (driver.Value, error) {
|
func (p PortArray) Value() (driver.Value, error) {
|
||||||
return json.Marshal(p)
|
return json.Marshal(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan 实现方法
|
// Scan 实现方法
|
||||||
func (p *PortArrey) Scan(input interface{}) error {
|
func (p *PortArray) Scan(input interface{}) error {
|
||||||
return json.Unmarshal(input.([]byte), p)
|
return json.Unmarshal(input.([]byte), p)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,20 +43,22 @@ func (p *PortArrey) Scan(input interface{}) error {
|
|||||||
type Env struct {
|
type Env struct {
|
||||||
Name string `json:"container"`
|
Name string `json:"container"`
|
||||||
Value string `json:"host"`
|
Value string `json:"host"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
Type int `json:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type JSON json.RawMessage
|
type JSON json.RawMessage
|
||||||
|
|
||||||
type EnvArrey []Env
|
type EnvArray []Env
|
||||||
|
|
||||||
// Value 实现方法
|
// Value 实现方法
|
||||||
func (p EnvArrey) Value() (driver.Value, error) {
|
func (p EnvArray) Value() (driver.Value, error) {
|
||||||
return json.Marshal(p)
|
return json.Marshal(p)
|
||||||
//return .MarshalJSON()
|
//return .MarshalJSON()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan 实现方法
|
// Scan 实现方法
|
||||||
func (p *EnvArrey) Scan(input interface{}) error {
|
func (p *EnvArray) Scan(input interface{}) error {
|
||||||
return json.Unmarshal(input.([]byte), p)
|
return json.Unmarshal(input.([]byte), p)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,17 +69,19 @@ func (p *EnvArrey) Scan(input interface{}) error {
|
|||||||
type PathMap struct {
|
type PathMap struct {
|
||||||
ContainerPath string `json:"container"`
|
ContainerPath string `json:"container"`
|
||||||
Path string `json:"host"`
|
Path string `json:"host"`
|
||||||
|
Type int `json:"type"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PathArrey []PathMap
|
type PathArray []PathMap
|
||||||
|
|
||||||
// Value 实现方法
|
// Value 实现方法
|
||||||
func (p PathArrey) Value() (driver.Value, error) {
|
func (p PathArray) Value() (driver.Value, error) {
|
||||||
return json.Marshal(p)
|
return json.Marshal(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan 实现方法
|
// Scan 实现方法
|
||||||
func (p *PathArrey) Scan(input interface{}) error {
|
func (p *PathArray) Scan(input interface{}) error {
|
||||||
return json.Unmarshal(input.([]byte), p)
|
return json.Unmarshal(input.([]byte), p)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,15 +104,16 @@ func (p *PathArrey) Scan(input interface{}) error {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
type CustomizationPostData struct {
|
type CustomizationPostData struct {
|
||||||
|
CustomId string `json:"custom_id"`
|
||||||
Origin string `json:"origin"`
|
Origin string `json:"origin"`
|
||||||
NetworkModel string `json:"network_model"`
|
NetworkModel string `json:"network_model"`
|
||||||
Index string `json:"index"`
|
Index string `json:"index"`
|
||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
Image string `json:"image"`
|
Image string `json:"image"`
|
||||||
Envs EnvArrey `json:"envs"`
|
Envs EnvArray `json:"envs"`
|
||||||
Ports PortArrey `json:"ports"`
|
Ports PortArray `json:"ports"`
|
||||||
Volumes PathArrey `json:"volumes"`
|
Volumes PathArray `json:"volumes"`
|
||||||
Devices PathArrey `json:"devices"`
|
Devices PathArray `json:"devices"`
|
||||||
//Port string `json:"port,omitempty"`
|
//Port string `json:"port,omitempty"`
|
||||||
PortMap string `json:"port_map"`
|
PortMap string `json:"port_map"`
|
||||||
CpuShares int64 `json:"cpu_shares"`
|
CpuShares int64 `json:"cpu_shares"`
|
||||||
@@ -116,4 +123,10 @@ type CustomizationPostData struct {
|
|||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Position bool `json:"position"`
|
Position bool `json:"position"`
|
||||||
|
HostName string `json:"host_name"`
|
||||||
|
Privileged bool `json:"privileged"`
|
||||||
|
CapAdd []string `json:"cap_add"`
|
||||||
|
Cmd []string `json:"cmd"`
|
||||||
|
Protocol string `json:"protocol"`
|
||||||
|
Host string `json:"host"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
type IOCountersStat struct {
|
type IOCountersStat struct {
|
||||||
Name string `json:"name"` // interface name
|
Name string `json:"name"` // interface name
|
||||||
BytesSent uint64 `json:"bytesSent"` // number of bytes sent
|
BytesSent uint64 `json:"bytesSent"` // number of bytes sent
|
||||||
@@ -15,5 +13,5 @@ type IOCountersStat struct {
|
|||||||
Fifoin uint64 `json:"fifoin"` // total number of FIFO buffers errors while receiving
|
Fifoin uint64 `json:"fifoin"` // total number of FIFO buffers errors while receiving
|
||||||
Fifoout uint64 `json:"fifoout"` // total number of FIFO buffers errors while sending
|
Fifoout uint64 `json:"fifoout"` // total number of FIFO buffers errors while sending
|
||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
DateTime time.Time `json:"date_time"`
|
Time int64 `json:"time"`
|
||||||
}
|
}
|
||||||
|
|||||||
6
model/notify.go
Normal file
6
model/notify.go
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type NotifyMssage struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Data string `json:"data"`
|
||||||
|
}
|
||||||
21
model/notify/application.go
Normal file
21
model/notify/application.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-27 15:01:58
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-05-31 14:51:21
|
||||||
|
* @FilePath: /CasaOS/model/notify/application.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package notify
|
||||||
|
|
||||||
|
type Application struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
State string `json:"state"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Icon string `json:"icon"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Finished bool `json:"finished"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
}
|
||||||
22
model/notify/file.go
Normal file
22
model/notify/file.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-26 14:21:57
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-02 11:14:15
|
||||||
|
* @FilePath: /CasaOS/model/notify/file.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package notify
|
||||||
|
|
||||||
|
type File struct {
|
||||||
|
Finished bool `json:"finished"`
|
||||||
|
ProcessedSize int64 `json:"processed_size"`
|
||||||
|
ProcessingPath string `json:"processing_path"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
TotalSize int64 `json:"total_size"`
|
||||||
|
Id string `json:"id"`
|
||||||
|
To string `json:"to"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
20
model/notify/message.go
Normal file
20
model/notify/message.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-26 14:39:22
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-05-26 19:08:52
|
||||||
|
* @FilePath: /CasaOS/model/notify/message.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
f "github.com/ambelovsky/gosf"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
Msg f.Message `json:"msg"`
|
||||||
|
}
|
||||||
16
model/notify/person.go
Normal file
16
model/notify/person.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-27 18:42:42
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-05-27 18:43:08
|
||||||
|
* @FilePath: /CasaOS/model/notify/person.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package notify
|
||||||
|
|
||||||
|
type Person struct {
|
||||||
|
ShareId string `json:"share_id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
18
model/notify/result.go
Normal file
18
model/notify/result.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-26 14:21:11
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-05-27 11:15:59
|
||||||
|
* @FilePath: /CasaOS/model/notify/result.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package notify
|
||||||
|
|
||||||
|
// Notify struct for Notify
|
||||||
|
type NotifyModel struct {
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
State string `json:"state"`
|
||||||
|
}
|
||||||
54
model/person.go
Normal file
54
model/person.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type PersionModel struct {
|
||||||
|
Token string `json:"token"`
|
||||||
|
Ips []string `json:"ips"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//记录链接状态
|
||||||
|
type ConnectState struct {
|
||||||
|
From string `json:"from"`
|
||||||
|
To string `json:"to"`
|
||||||
|
Type string `json:"type"` //current state 1:ready 2:ok
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UUId string `json:"uuid"` //对接标识
|
||||||
|
}
|
||||||
|
type MessageModel struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
UUId string `json:"uuid"`
|
||||||
|
From string `json:"from"`
|
||||||
|
To string `json:"to"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TranFileModel struct {
|
||||||
|
Hash string `json:"hash"` //Verify current fragment integrity
|
||||||
|
Length int `json:"length"`
|
||||||
|
Index int `json:"index"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//需要获取文件详情
|
||||||
|
type FileDetailModel struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//返回文件详情
|
||||||
|
type FileSummaryModel struct {
|
||||||
|
Hash string `json:"hash"` //Verify file
|
||||||
|
Name string `json:"name"`
|
||||||
|
BlockSize int `json:"block_size"`
|
||||||
|
Length int `json:"length"`
|
||||||
|
Size int64 `json:"size"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FriendsModel struct {
|
||||||
|
Id uint `gorm:"column:id;primary_key" json:"id"`
|
||||||
|
NickName string `json:"nick_name"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
ShareId string `json:"share_id"`
|
||||||
|
}
|
||||||
1
model/receive/app.go
Normal file
1
model/receive/app.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package receive
|
||||||
7
model/search.go
Normal file
7
model/search.go
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type SearchFileInfo struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type int `json:"type"`
|
||||||
|
}
|
||||||
69
model/smartctl_model.go
Normal file
69
model/smartctl_model.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
//
|
||||||
|
type SmartctlA struct {
|
||||||
|
Smartctl struct {
|
||||||
|
Version []int `json:"version"`
|
||||||
|
SvnRevision string `json:"svn_revision"`
|
||||||
|
PlatformInfo string `json:"platform_info"`
|
||||||
|
BuildInfo string `json:"build_info"`
|
||||||
|
Argv []string `json:"argv"`
|
||||||
|
ExitStatus int `json:"exit_status"`
|
||||||
|
} `json:"smartctl"`
|
||||||
|
Device struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
InfoName string `json:"info_name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Protocol string `json:"protocol"`
|
||||||
|
} `json:"device"`
|
||||||
|
ModelName string `json:"model_name"`
|
||||||
|
SerialNumber string `json:"serial_number"`
|
||||||
|
FirmwareVersion string `json:"firmware_version"`
|
||||||
|
UserCapacity struct {
|
||||||
|
Blocks int `json:"blocks"`
|
||||||
|
Bytes int64 `json:"bytes"`
|
||||||
|
} `json:"user_capacity"`
|
||||||
|
SmartStatus struct {
|
||||||
|
Passed bool `json:"passed"`
|
||||||
|
} `json:"smart_status"`
|
||||||
|
AtaSmartData struct {
|
||||||
|
OfflineDataCollection struct {
|
||||||
|
Status struct {
|
||||||
|
Value int `json:"value"`
|
||||||
|
String string `json:"string"`
|
||||||
|
} `json:"status"`
|
||||||
|
CompletionSeconds int `json:"completion_seconds"`
|
||||||
|
} `json:"offline_data_collection"`
|
||||||
|
SelfTest struct {
|
||||||
|
Status struct {
|
||||||
|
Value int `json:"value"`
|
||||||
|
String string `json:"string"`
|
||||||
|
Passed bool `json:"passed"`
|
||||||
|
} `json:"status"`
|
||||||
|
PollingMinutes struct {
|
||||||
|
Short int `json:"short"`
|
||||||
|
Extended int `json:"extended"`
|
||||||
|
Conveyance int `json:"conveyance"`
|
||||||
|
} `json:"polling_minutes"`
|
||||||
|
} `json:"self_test"`
|
||||||
|
Capabilities struct {
|
||||||
|
Values []int `json:"values"`
|
||||||
|
ExecOfflineImmediateSupported bool `json:"exec_offline_immediate_supported"`
|
||||||
|
OfflineIsAbortedUponNewCmd bool `json:"offline_is_aborted_upon_new_cmd"`
|
||||||
|
OfflineSurfaceScanSupported bool `json:"offline_surface_scan_supported"`
|
||||||
|
SelfTestsSupported bool `json:"self_tests_supported"`
|
||||||
|
ConveyanceSelfTestSupported bool `json:"conveyance_self_test_supported"`
|
||||||
|
SelectiveSelfTestSupported bool `json:"selective_self_test_supported"`
|
||||||
|
AttributeAutosaveEnabled bool `json:"attribute_autosave_enabled"`
|
||||||
|
ErrorLoggingSupported bool `json:"error_logging_supported"`
|
||||||
|
GpLoggingSupported bool `json:"gp_logging_supported"`
|
||||||
|
} `json:"capabilities"`
|
||||||
|
} `json:"ata_smart_data"`
|
||||||
|
PowerOnTime struct {
|
||||||
|
Hours int `json:"hours"`
|
||||||
|
} `json:"power_on_time"`
|
||||||
|
PowerCycleCount int `json:"power_cycle_count"`
|
||||||
|
Temperature struct {
|
||||||
|
Current int `json:"current"`
|
||||||
|
} `json:"temperature"`
|
||||||
|
}
|
||||||
@@ -1,3 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* @Author: LinkLeong link@icewhale.com
|
||||||
|
* @Date: 2022-05-13 18:15:46
|
||||||
|
* @LastEditors: LinkLeong
|
||||||
|
* @LastEditTime: 2022-06-16 17:50:56
|
||||||
|
* @FilePath: /CasaOS/model/sys_common.go
|
||||||
|
* @Description:
|
||||||
|
* @Website: https://www.casaos.io
|
||||||
|
* Copyright (c) 2022 by icewhale, All Rights Reserved.
|
||||||
|
*/
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
@@ -15,6 +25,10 @@ type UserModel struct {
|
|||||||
Head string
|
Head string
|
||||||
Email string
|
Email string
|
||||||
Description string
|
Description string
|
||||||
|
Initialized bool
|
||||||
|
Avatar string
|
||||||
|
NickName string
|
||||||
|
Public string
|
||||||
}
|
}
|
||||||
|
|
||||||
//服务配置
|
//服务配置
|
||||||
@@ -22,18 +36,27 @@ type ServerModel struct {
|
|||||||
HttpPort string
|
HttpPort string
|
||||||
RunMode string
|
RunMode string
|
||||||
ServerApi string
|
ServerApi string
|
||||||
|
LockAccount bool
|
||||||
|
Handshake string
|
||||||
|
Token string
|
||||||
|
UDPPort string
|
||||||
|
USBAutoMount string
|
||||||
|
SocketPort string
|
||||||
}
|
}
|
||||||
|
|
||||||
//服务配置
|
//服务配置
|
||||||
type APPModel struct {
|
type APPModel struct {
|
||||||
LogSavePath string
|
LogPath string
|
||||||
LogSaveName string
|
LogSaveName string
|
||||||
LogFileExt string
|
LogFileExt string
|
||||||
DateStrFormat string
|
DateStrFormat string
|
||||||
DateTimeFormat string
|
DateTimeFormat string
|
||||||
|
UserDataPath string
|
||||||
TimeFormat string
|
TimeFormat string
|
||||||
DateFormat string
|
DateFormat string
|
||||||
ProjectPath string
|
DBPath string
|
||||||
|
ShellPath string
|
||||||
|
TempPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
//公共返回模型
|
//公共返回模型
|
||||||
@@ -43,13 +66,6 @@ type Result struct {
|
|||||||
Data interface{} `json:"data" example:"返回结果"`
|
Data interface{} `json:"data" example:"返回结果"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//zeritier相关
|
|
||||||
type ZeroTierModel struct {
|
|
||||||
UserName string
|
|
||||||
PWD string
|
|
||||||
Token string
|
|
||||||
}
|
|
||||||
|
|
||||||
//redis配置文件
|
//redis配置文件
|
||||||
type RedisModel struct {
|
type RedisModel struct {
|
||||||
Host string
|
Host string
|
||||||
@@ -60,11 +76,19 @@ type RedisModel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SystemConfig struct {
|
type SystemConfig struct {
|
||||||
SearchSwitch bool `json:"search_switch"` //搜索开关
|
ConfigStr string `json:"config_str"`
|
||||||
SearchEngine string `json:"search_engine"` //搜索引擎
|
WidgetList string `json:"widget_list"`
|
||||||
ShortcutsSwitch bool `json:"shortcuts_switch"`
|
ConfigPath string `json:"config_path"`
|
||||||
WidgetsSwitch bool `json:"widgets_switch"`
|
SyncPort string `json:"sync_port"`
|
||||||
BackgroundType string `json:"background_type"`
|
SyncKey string `json:"sync_key"`
|
||||||
Background string `json:"background"`
|
Analyse string `json:"analyse"`
|
||||||
AutoUpdate bool `json:"auto_update"`
|
}
|
||||||
|
|
||||||
|
type CasaOSGlobalVariables struct {
|
||||||
|
AppChange bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileSetting struct {
|
||||||
|
ShareDir []string `json:"share_dir" delim:"|"`
|
||||||
|
DownloadDir string `json:"download_dir"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
|
|
||||||
8
model/system_app/sync.go
Normal file
8
model/system_app/sync.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
package system_app
|
||||||
|
|
||||||
|
import "encoding/xml"
|
||||||
|
|
||||||
|
type SyncConfig struct {
|
||||||
|
XMLName xml.Name `xml:"configuration"`
|
||||||
|
Key string `xml:"gui>apikey"`
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user