奇淼(piexlmax
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 747 additions and 368 deletions
-
148deployment/server/gva-server-configmap.yaml
-
68deployment/server/gva-server-deployment.yaml
-
21deployment/server/gva-server-service.yaml
-
32deployment/web/gva-web-configmap.yaml
-
51deployment/web/gva-web-deploymemt.yaml
-
21deployment/web/gva-web-service.yaml
-
2server/Dockerfile
-
6server/initialize/router.go
-
12server/resource/template/web/table.vue.tpl
-
3server/service/system/sys_authority.go
-
16web/src/components/warningBar/warningBar.vue
-
22web/src/core/gin-vue-admin.js
-
73web/src/directive/auth.js
-
15web/src/main.js
-
193web/src/style/element_visiable.scss
-
180web/src/style/main.scss
-
12web/src/view/example/customer/customer.vue
-
14web/src/view/example/excel/excel.vue
-
12web/src/view/example/upload/upload.vue
-
53web/src/view/login/index.vue
-
15web/src/view/superAdmin/api/api.vue
-
6web/src/view/superAdmin/authority/authority.vue
-
20web/src/view/superAdmin/dictionary/sysDictionary.vue
-
12web/src/view/superAdmin/dictionary/sysDictionaryDetail.vue
-
28web/src/view/superAdmin/menu/menu.vue
-
22web/src/view/superAdmin/operation/sysOperationRecord.vue
-
14web/src/view/superAdmin/user/user.vue
-
24web/src/view/systemTools/autoCode/index.vue
-
14web/src/view/systemTools/autoCodeAdmin/index.vue
-
6web/yarn.lock
@ -0,0 +1,148 @@ |
|||
apiVersion: v1 |
|||
kind: ConfigMap |
|||
metadata: |
|||
name: config.yaml |
|||
annotations: |
|||
flipped-aurora/gin-vue-admin: backend |
|||
github: "https://github.com/flipped-aurora/gin-vue-admin.git" |
|||
app.kubernetes.io/version: 0.0.1 |
|||
labels: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
data: |
|||
config.yaml: | |
|||
# github.com/flipped-aurora/gin-vue-admin/server Global Configuration |
|||
|
|||
# jwt configuration |
|||
jwt: |
|||
signing-key: 'qmPlus' |
|||
expires-time: 604800 |
|||
buffer-time: 86400 |
|||
|
|||
# zap logger configuration |
|||
zap: |
|||
level: 'info' |
|||
format: 'console' |
|||
prefix: '[github.com/flipped-aurora/gin-vue-admin/server]' |
|||
director: 'log' |
|||
link-name: 'latest_log' |
|||
show-line: true |
|||
encode-level: 'LowercaseColorLevelEncoder' |
|||
stacktrace-key: 'stacktrace' |
|||
log-in-console: true |
|||
|
|||
# redis configuration |
|||
redis: |
|||
db: 0 |
|||
addr: '127.0.0.1:6379' |
|||
password: '' |
|||
|
|||
# email configuration |
|||
email: |
|||
to: 'xxx@qq.com' |
|||
port: 465 |
|||
from: 'xxx@163.com' |
|||
host: 'smtp.163.com' |
|||
is-ssl: true |
|||
secret: 'xxx' |
|||
nickname: 'test' |
|||
|
|||
# casbin configuration |
|||
casbin: |
|||
model-path: './resource/rbac_model.conf' |
|||
|
|||
# system configuration |
|||
system: |
|||
env: 'develop' # Change to "develop" to skip authentication for development mode |
|||
addr: 8888 |
|||
db-type: 'mysql' |
|||
oss-type: 'local' # 控制oss选择走本期还是 七牛等其他仓 自行增加其他oss仓可以在 server/utils/upload/upload.go 中 NewOss函数配置 |
|||
use-multipoint: false |
|||
|
|||
# captcha configuration |
|||
captcha: |
|||
key-long: 6 |
|||
img-width: 240 |
|||
img-height: 80 |
|||
|
|||
# mysql connect configuration |
|||
# 未初始化之前请勿手动修改数据库信息!!!如果一定要手动初始化请看(https://www.github.com/flipped-aurora/gin-vue-admin/server.com/docs/first) |
|||
mysql: |
|||
path: '' |
|||
config: '' |
|||
db-name: '' |
|||
username: '' |
|||
password: '' |
|||
max-idle-conns: 10 |
|||
max-open-conns: 100 |
|||
log-mode: false |
|||
log-zap: "" |
|||
|
|||
# local configuration |
|||
local: |
|||
path: 'uploads/file' |
|||
|
|||
# autocode configuration |
|||
autocode: |
|||
transfer-restart: true |
|||
root: "" |
|||
server: /server |
|||
server-api: /api/v1/autocode |
|||
server-initialize: /initialize |
|||
server-model: /model/autocode |
|||
server-request: /model/autocode/request/ |
|||
server-router: /router/autocode |
|||
server-service: /service/autocode |
|||
web: /web/src |
|||
web-api: /api |
|||
web-flow: /view |
|||
web-form: /view |
|||
web-table: /view |
|||
|
|||
# qiniu configuration (请自行七牛申请对应的 公钥 私钥 bucket 和 域名地址) |
|||
qiniu: |
|||
zone: 'ZoneHuaDong' |
|||
bucket: '' |
|||
img-path: '' |
|||
use-https: false |
|||
access-key: '' |
|||
secret-key: '' |
|||
use-cdn-domains: false |
|||
|
|||
|
|||
# aliyun oss configuration |
|||
aliyun-oss: |
|||
endpoint: 'yourEndpoint' |
|||
access-key-id: 'yourAccessKeyId' |
|||
access-key-secret: 'yourAccessKeySecret' |
|||
bucket-name: 'yourBucketName' |
|||
bucket-url: 'yourBucketUrl' |
|||
base-path: 'yourBasePath' |
|||
|
|||
# tencent cos configuration |
|||
tencent-cos: |
|||
bucket: 'xxxxx-10005608' |
|||
region: 'ap-shanghai' |
|||
secret-id: 'xxxxxxxx' |
|||
secret-key: 'xxxxxxxx' |
|||
base-url: 'https://gin.vue.admin' |
|||
path-prefix: 'github.com/flipped-aurora/gin-vue-admin/server' |
|||
|
|||
# excel configuration |
|||
excel: |
|||
dir: './resource/excel/' |
|||
|
|||
|
|||
# timer task db clear table |
|||
Timer: |
|||
start: true |
|||
spec: "@daily" # 定时任务详细配置参考 https://pkg.go.dev/github.com/robfig/cron/v3 |
|||
detail: [ |
|||
# tableName: 需要清理的表名 |
|||
# compareField: 需要比较时间的字段 |
|||
# interval: 时间间隔, 具体配置详看 time.ParseDuration() 中字符串表示 且不能为负数 |
|||
# 2160h = 24 * 30 * 3 -> 三个月 |
|||
{ tableName: "sys_operation_records" , compareField: "created_at", interval: "2160h" }, |
|||
{ tableName: "jwt_blacklists" , compareField: "created_at", interval: "168h" } |
|||
#{ tableName: "log2" , compareField: "created_at", interval: "2160h" } |
|||
] |
@ -0,0 +1,68 @@ |
|||
apiVersion: apps/v1 |
|||
kind: Deployment |
|||
metadata: |
|||
name: gva-server |
|||
annotations: |
|||
flipped-aurora/gin-vue-admin: backend |
|||
github: "https://github.com/flipped-aurora/gin-vue-admin.git" |
|||
app.kubernetes.io/version: 0.0.1 |
|||
labels: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
spec: |
|||
replicas: 1 |
|||
selector: |
|||
matchLabels: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
template: |
|||
metadata: |
|||
labels: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
spec: |
|||
containers: |
|||
- name: gin-vue-admin-container |
|||
image: registry.cn-hangzhou.aliyuncs.com/gin-vue-admin/server:40fc3aa6 |
|||
imagePullPolicy: IfNotPresent |
|||
ports: |
|||
- containerPort: 8888 |
|||
name: http |
|||
volumeMounts: |
|||
- mountPath: /go/src/github.com/flipped-aurora/gin-vue-admin/server/config.yaml |
|||
name: config |
|||
subPath: config.yaml |
|||
- mountPath: /etc/localtime |
|||
name: localtime |
|||
resources: |
|||
limits: |
|||
cpu: 1000m |
|||
memory: 2000Mi |
|||
requests: |
|||
cpu: 100m |
|||
memory: 200Mi |
|||
# readinessProbe: |
|||
# httpGet: |
|||
# path: /ready |
|||
# port: http |
|||
# initialDelaySeconds: 20 |
|||
# periodSeconds: 10 |
|||
# successThreshold: 1 |
|||
# failureThreshold: 3 |
|||
# livenessProbe: |
|||
# httpGet: |
|||
# path: /health |
|||
# port: http |
|||
# initialDelaySeconds: 20 |
|||
# periodSeconds: 10 |
|||
# successThreshold: 1 |
|||
# failureThreshold: 3 |
|||
#imagePullSecrets: |
|||
# - name: docker-registry |
|||
volumes: |
|||
- name: localtime |
|||
hostPath: |
|||
path: /etc/localtime |
|||
- name: config |
|||
configMap: |
|||
name: config.yaml |
@ -0,0 +1,21 @@ |
|||
apiVersion: v1 |
|||
kind: Service |
|||
metadata: |
|||
name: gva-server |
|||
annotations: |
|||
flipped-aurora/gin-vue-admin: backend |
|||
github: "https://github.com/flipped-aurora/gin-vue-admin.git" |
|||
app.kubernetes.io/version: 0.0.1 |
|||
labels: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
spec: |
|||
selector: |
|||
app: gva-server |
|||
version: gva-vue3 |
|||
ports: |
|||
- port: 8888 |
|||
name: http |
|||
targetPort: 8888 |
|||
type: ClusterIP |
|||
# type: NodePort |
@ -0,0 +1,32 @@ |
|||
apiVersion: v1 |
|||
kind: ConfigMap |
|||
metadata: |
|||
name: my.conf |
|||
data: |
|||
my.conf: | |
|||
server { |
|||
listen 8080; |
|||
server_name localhost; |
|||
|
|||
#charset koi8-r; |
|||
#access_log logs/host.access.log main; |
|||
|
|||
location / { |
|||
root /usr/share/nginx/html; |
|||
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; |
|||
try_files $uri $uri/ /index.html; |
|||
} |
|||
|
|||
location /api { |
|||
proxy_set_header Host $http_host; |
|||
proxy_set_header X-Real-IP $remote_addr; |
|||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|||
proxy_set_header X-Forwarded-Proto $scheme; |
|||
rewrite ^/api/(.*)$ /$1 break; #重写 |
|||
proxy_pass http://gva-server:8888; # 设置代理服务器的协议和地址 |
|||
} |
|||
|
|||
location /api/swagger/index.html { |
|||
proxy_pass http://gva-server:8888/swagger/index.html; |
|||
} |
|||
} |
@ -0,0 +1,51 @@ |
|||
apiVersion: apps/v1 |
|||
kind: Deployment |
|||
metadata: |
|||
name: gva-web |
|||
annotations: |
|||
flipped-aurora/gin-vue-admin: ui |
|||
github: "https://github.com/flipped-aurora/gin-vue-admin.git" |
|||
app.kubernetes.io/version: 0.0.1 |
|||
labels: |
|||
app: gva-web |
|||
version: gva-vue3 |
|||
spec: |
|||
replicas: 1 |
|||
selector: |
|||
matchLabels: |
|||
app: gva-web |
|||
version: gva-vue3 |
|||
template: |
|||
metadata: |
|||
labels: |
|||
app: gva-web |
|||
version: gva-vue3 |
|||
spec: |
|||
containers: |
|||
- name: gin-vue-admin-nginx-container |
|||
image: registry.cn-hangzhou.aliyuncs.com/gin-vue-admin/web:40fc3aa6 |
|||
imagePullPolicy: IfNotPresent |
|||
ports: |
|||
- containerPort: 8080 |
|||
name: http |
|||
readinessProbe: |
|||
tcpSocket: |
|||
port: 8080 |
|||
initialDelaySeconds: 10 |
|||
periodSeconds: 10 |
|||
successThreshold: 1 |
|||
failureThreshold: 3 |
|||
resources: |
|||
limits: |
|||
cpu: 500m |
|||
memory: 1000Mi |
|||
requests: |
|||
cpu: 100m |
|||
memory: 100Mi |
|||
volumeMounts: |
|||
- mountPath: /etc/nginx/conf.d/ |
|||
name: nginx-config |
|||
volumes: |
|||
- name: nginx-config |
|||
configMap: |
|||
name: my.conf |
@ -0,0 +1,21 @@ |
|||
apiVersion: v1 |
|||
kind: Service |
|||
metadata: |
|||
name: gva-web |
|||
annotations: |
|||
flipped-aurora/gin-vue-admin: ui |
|||
github: "https://github.com/flipped-aurora/gin-vue-admin.git" |
|||
app.kubernetes.io/version: 0.0.1 |
|||
labels: |
|||
app: gva-web |
|||
version: gva-vue3 |
|||
spec: |
|||
type: NodePort |
|||
# type: ClusterIP |
|||
ports: |
|||
- name: http |
|||
port: 8080 |
|||
targetPort: 8080 |
|||
selector: |
|||
app: gva-web |
|||
version: gva-vue3 |
@ -1,39 +1,42 @@ |
|||
// 权限按钮展示指令
|
|||
import { store } from '@/store' |
|||
export const auth = (app) => { |
|||
app.directive('auth', { |
|||
// 当被绑定的元素插入到 DOM 中时……
|
|||
mounted: function(el, binding) { |
|||
const userInfo = store.getters['user/userInfo'] |
|||
let type = '' |
|||
switch (Object.prototype.toString.call(binding.value)) { |
|||
case '[object Array]': |
|||
type = 'Array' |
|||
break |
|||
case '[object String]': |
|||
type = 'String' |
|||
break |
|||
case '[object Number]': |
|||
type = 'Number' |
|||
break |
|||
default: |
|||
type = '' |
|||
break |
|||
export default { |
|||
install: (app) => { |
|||
app.directive('auth', { |
|||
// 当被绑定的元素插入到 DOM 中时……
|
|||
mounted: function(el, binding) { |
|||
const userInfo = store.getters['user/userInfo'] |
|||
let type = '' |
|||
switch (Object.prototype.toString.call(binding.value)) { |
|||
case '[object Array]': |
|||
type = 'Array' |
|||
break |
|||
case '[object String]': |
|||
type = 'String' |
|||
break |
|||
case '[object Number]': |
|||
type = 'Number' |
|||
break |
|||
default: |
|||
type = '' |
|||
break |
|||
} |
|||
if (type === '') { |
|||
/* eslint-disable */ |
|||
console.error("v-auth必须是Array,Number,String属性,暂不支持其他属性") |
|||
/* eslint-enable */ |
|||
return |
|||
} |
|||
const waitUse = binding.value.toString().split(',') |
|||
let flag = waitUse.some(item => item === userInfo.authorityId) |
|||
if (binding.modifiers.not) { |
|||
flag = !flag |
|||
} |
|||
if (!flag) { |
|||
el.style.display = 'none' |
|||
} |
|||
} |
|||
if (type === '') { |
|||
/* eslint-disable */ |
|||
console.error("v-auth必须是Array,Number,String属性,暂不支持其他属性") |
|||
/* eslint-enable */ |
|||
return |
|||
} |
|||
const waitUse = binding.value.toString().split(',') |
|||
let flag = waitUse.some(item => item === userInfo.authorityId) |
|||
if (binding.modifiers.not) { |
|||
flag = !flag |
|||
} |
|||
if (!flag) { |
|||
el.style.display = 'none' |
|||
} |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
|
@ -1,22 +1,25 @@ |
|||
import { createApp } from 'vue' |
|||
import 'element-plus/dist/index.css' |
|||
import './style/element_visiable.scss' |
|||
import ElementPlus from 'element-plus' |
|||
import zhCn from 'element-plus/es/locale/lang/zh-cn' |
|||
// 引入gin-vue-admin前端初始化相关内容
|
|||
import './core/gin-vue-admin' |
|||
// 引入封装的router
|
|||
import router from '@/router/index' |
|||
import { run } from '@/core/gin-vue-admin.js' |
|||
import run from '@/core/gin-vue-admin.js' |
|||
import auth from '@/directive/auth' |
|||
|
|||
import '@/permission' |
|||
import { store } from '@/store/index' |
|||
|
|||
import { auth } from '@/directive/auth' |
|||
|
|||
import App from './App.vue' |
|||
const app = createApp(App) |
|||
run(app) |
|||
auth(app) |
|||
app.config.productionTip = false |
|||
app.use(store).use(router).use(ElementPlus, { locale: zhCn }).mount('#app') |
|||
app.use(run) |
|||
.use(auth) |
|||
.use(store) |
|||
.use(router) |
|||
.use(ElementPlus, { locale: zhCn }).mount('#app') |
|||
|
|||
export default app |
@ -1,21 +1,192 @@ |
|||
/* 改变主题色变量 */ |
|||
$--color-primary: #1890ff; |
|||
|
|||
#app{ |
|||
.el-button{ |
|||
font-weight: 400; |
|||
border-radius: 4px; |
|||
border-radius: 2px; |
|||
} |
|||
} |
|||
///* 改变 icon 字体路径变量,必需 */ |
|||
//$--font-path: '~element-ui/lib/theme-chalk/fonts'; |
|||
// |
|||
// |
|||
// |
|||
//@import "~element-ui/packages/theme-chalk/src/index"; |
|||
// |
|||
|
|||
.el-dialog{ |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
::-webkit-scrollbar-track-piece { |
|||
background-color: #f8f8f8; |
|||
} |
|||
|
|||
::-webkit-scrollbar { |
|||
width: 9px; |
|||
height: 9px; |
|||
} |
|||
|
|||
::-webkit-scrollbar-thumb { |
|||
background-color: #dddddd; |
|||
background-clip: padding-box; |
|||
min-height: 28px; |
|||
border-radius: 4px; |
|||
} |
|||
|
|||
::-webkit-scrollbar-thumb:hover { |
|||
background-color: #bbb; |
|||
} |
|||
|
|||
.el-button--primary { |
|||
--el-button-font-color: #ffffff; |
|||
--el-button-background-color: #4D70FF; |
|||
--el-button-border-color: #4D70FF; |
|||
--el-button-hover-color: #0d84ff; |
|||
--el-button-active-font-color: #e6e6e6; |
|||
--el-button-active-background-color: #0d84ff; |
|||
--el-button-active-border-color: #0d84ff; |
|||
} |
|||
|
|||
:export { |
|||
colorPrimary: $--color-primary |
|||
.el-button--primary { |
|||
--el-button-font-color: #ffffff; |
|||
--el-button-background-color: #4D70FF; |
|||
--el-button-border-color: #4D70FF; |
|||
--el-button-hover-color: #0d84ff; |
|||
--el-button-active-font-color: #e6e6e6; |
|||
--el-button-active-background-color: #0d84ff; |
|||
--el-button-active-border-color: #0d84ff; |
|||
} |
|||
|
|||
:root { |
|||
--el-color-primary: #4D70FF; |
|||
} |
|||
|
|||
.gva-search-box { |
|||
.el-collapse { |
|||
border: none; |
|||
.el-collapse-item__header, |
|||
.el-collapse-item__wrap { |
|||
border-bottom: none; |
|||
} |
|||
} |
|||
padding: 24px; |
|||
padding-bottom: 2px; |
|||
background-color: #fff; |
|||
border-radius: 2px; |
|||
margin-bottom: 12px; |
|||
.el-form { |
|||
.el-form-item { |
|||
padding-right: 28px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.gva-form-box { |
|||
padding: 24px; |
|||
background-color: #fff; |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
.gva-table-box { |
|||
padding: 24px; |
|||
background-color: #fff; |
|||
border-radius: 2px; |
|||
} |
|||
|
|||
.gva-pagination { |
|||
display: flex; |
|||
justify-content: flex-end; |
|||
.el-pagination__editor { |
|||
.el-input__inner { |
|||
height: 32px; |
|||
} |
|||
} |
|||
.el-pagination__total { |
|||
line-height: 32px !important; |
|||
} |
|||
.btn-prev { |
|||
padding-right: 6px; |
|||
display: inline-flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 32px; |
|||
height: 32px; |
|||
} |
|||
.number { |
|||
display: inline-flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 32px; |
|||
height: 32px; |
|||
} |
|||
.btn-quicknext { |
|||
display: inline-flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 32px; |
|||
height: 32px; |
|||
} |
|||
.btn-next { |
|||
padding-left: 6px; |
|||
width: 32px; |
|||
height: 32px; |
|||
display: inline-flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
.active { |
|||
background: #4D70FF; |
|||
border-radius: 2px; |
|||
color: #ffffff !important; |
|||
} |
|||
.el-pager li.active+li { |
|||
border-left: 1px solid #ddd !important; |
|||
} |
|||
.el-pagination__sizes { |
|||
.el-input { |
|||
.el-input__suffix { |
|||
margin-top: 2px; |
|||
} |
|||
} |
|||
} |
|||
.el-pagination__jump { |
|||
.el-pagination__editor {} |
|||
} |
|||
} |
|||
|
|||
.el-button--mini { |
|||
min-height: 32px; |
|||
} |
|||
|
|||
.el-button { |
|||
padding: 8px 16px; |
|||
border-radius: 2px; |
|||
&.el-button--text { |
|||
padding: 8px 0; |
|||
} |
|||
} |
|||
|
|||
.el-dialog { |
|||
padding: 12px; |
|||
.el-dialog__body { |
|||
padding: 12px 6px; |
|||
} |
|||
.el-dialog__header { |
|||
.el-dialog__title { |
|||
font-size: 14px; |
|||
font-weight: 500; |
|||
} |
|||
padding: 2px 20px 12px 20px; |
|||
border-bottom: 1px solid #E4E4E4; |
|||
} |
|||
.el-dialog__headerbtn { |
|||
top: 16px; |
|||
} |
|||
.el-dialog__footer { |
|||
margin-top: -12px; |
|||
padding: 0 0 16px 0; |
|||
.dialog-footer { |
|||
.el-button { |
|||
padding-left: 24px; |
|||
padding-right: 24px; |
|||
} |
|||
.el-button+.el-button { |
|||
margin-left: 30px; |
|||
} |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue