6 Commits
role ... uesr

21 changed files with 119 additions and 246 deletions

View File

@@ -5,8 +5,6 @@ platform:
os: linux
arch: arm64
steps:
- name: build-package
image: node:16.20.0
volumes:
@@ -25,16 +23,17 @@ steps:
- npm -v
- mkdir -p ./node_modules
- export NODE_MODULES_PATH=`pwd`/node_modules
# - npm config set registry https://registry.npmmirror.com
#- npm config set registry https://registry.npm.taobao.org
#- set NODE_OPTIONS=--openssl-legacy-provider
# - npm install
# - npm install
- npm run build
- ls /app/build/$DRONE_REPO_NAME/
- echo $NODE_MODULES_PATH
- cp -r dist /app/build/$DRONE_REPO_NAME
- name: build-docker-prod # 制作docker镜像
- name: build-docker # 制作docker镜像
image: docker # 使用官方docker镜像
volumes: # 将容器内目录挂载到宿主机
- name: docker
@@ -56,9 +55,6 @@ steps:
- sed -i 's/$REGISTRY_NAMESPACE/'"$REGISTRY_NAMESPACE"'/' deployment.yml
- sed -i 's/$DRONE_REPO_NAME/'"$DRONE_REPO_NAME"'/' deployment.yml
- sed -i 's/$DRONE_COMMIT/'"$DRONE_COMMIT"'/' deployment.yml
- sed -i 's/$PORTS_NAME/'"dasdafas"'/' deployment.yml
- sed -i 's/$PORTS_PORT/'"8081"'/' deployment.yml
- sed -i 's/$PROFILES/'"mosr"'/' nginx.conf
# docker登录,不能在脚本中登录,并且不能使用docker login -u -p
- echo $DOCKER_PASSWORD | docker login $REGISTRY --username $DOCKER_USERNAME --password-stdin
- chmod +x docker.sh
@@ -66,47 +62,9 @@ steps:
- sh docker.sh
# 执行完脚本删除本次制作的docker镜像,避免多次后当前runner空间不足
- docker rmi -f $(docker images | grep $DRONE_REPO_NAME | awk '{print $3}')
when:
branch:
- prod
- name: build-docker-dm # 制作docker镜像
image: docker # 使用官方docker镜像
volumes: # 将容器内目录挂载到宿主机
- name: docker
path: /var/run/docker.sock # 挂载宿主机的docker
- name: config
path: /config
environment: # 获取到密文的docker用户名和密码
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
REGISTRY:
from_secret: registry
REGISTRY_NAMESPACE:
from_secret: registry_namespace
commands: # 定义在Docker容器中执行的shell命令
- cat Dockerfile
- sed -i 's/$REGISTRY/'"$REGISTRY"'/' deployment.yml
- sed -i 's/$REGISTRY_NAMESPACE/'"$REGISTRY_NAMESPACE"'/' deployment.yml
- sed -i 's/$DRONE_REPO_NAME/'"$DRONE_REPO_NAME"'/' deployment.yml
- sed -i 's/$DRONE_COMMIT/'"$DRONE_COMMIT"'/' deployment.yml
- sed -i 's/$PORTS_NAME/'"dasdafas"'/' deployment.yml
- sed -i 's/$PORTS_PORT/'"8082"'/' deployment.yml
- sed -i 's/$PROFILES/'"mosr-dm"'/' nginx.conf
# docker登录,不能在脚本中登录,并且不能使用docker login -u -p
- echo $DOCKER_PASSWORD | docker login $REGISTRY --username $DOCKER_USERNAME --password-stdin
- chmod +x docker.sh
- cat docker.sh
- sh docker.sh
# 执行完脚本删除本次制作的docker镜像,避免多次后当前runner空间不足
- docker rmi -f $(docker images | grep $DRONE_REPO_NAME | awk '{print $3}')
when:
branch:
- dm
- name: drone-rancher-prod # rancher运行
- name: drone-rancher # rancher运行
image: bitnami/kubectl:1.26.13-debian-11-r1
volumes: # 将容器内目录挂载到宿主机
- name: config
@@ -114,24 +72,6 @@ steps:
commands: # 定义在Docker容器中执行的shell命令
# 将deployment中定义的变量替换为drone中的内置变量
- kubectl apply -f deployment.yml -n mosr --kubeconfig=/app/config/base-taishan-kubectl.yml
when:
branch:
- prod
- name: drone-rancher-dm # rancher运行
image: bitnami/kubectl:1.26.13-debian-11-r1
volumes: # 将容器内目录挂载到宿主机
- name: config
path: /app/config # 将kubectl 配置文件挂载出来
commands: # 定义在Docker容器中执行的shell命令
# 将deployment中定义的变量替换为drone中的内置变量
- kubectl apply -f deployment.yml -n mosr-dm --kubeconfig=/app/config/base-taishan-kubectl.yml
when:
branch:
- dm
volumes:
- name: cache
@@ -144,10 +84,8 @@ volumes:
host:
path: /var/run/docker.sock
load:
trigger:
branch:
- prod
- dm
event:
- push

2
package-lock.json generated
View File

@@ -13,7 +13,7 @@
"axios": "^1.4.0",
"d3": "^7.8.5",
"echarts": "^5.4.2",
"element-plus": "^2.6.0",
"element-plus": "^2.3.5",
"highlight.js": "9.18.5",
"jquery": "^3.6.0",
"js-cookie": "^3.0.5",

View File

@@ -13,7 +13,7 @@
"axios": "^1.4.0",
"d3": "^7.8.5",
"echarts": "^5.4.2",
"element-plus": "^2.6.0",
"element-plus": "^2.3.5",
"highlight.js": "9.18.5",
"jquery": "^3.6.0",
"js-cookie": "^3.0.5",

View File

@@ -14,14 +14,6 @@ export const getRoleOption = () => {
method: "get"
});
};
export const getTemRoleOption = () => {
return request({
url: '/admin/role/option/template',
method: "get"
});
};
//查询角色信息
export const getRoleDetail = (roleId) => {
return request({

View File

@@ -46,6 +46,15 @@ export const getUserDetail = (userId) => {
method: "get"
});
};
// 操作
export const operate = (data, type) => {
console.log(type ,'type');
if(data.userId && type !== '0') return editUser(data)
else if(type == '0') return editUserOA(data)
return addUser(data)
}
// 新增用户
export const addUser = (data) => {
return request({
@@ -63,6 +72,15 @@ export const editUser = (data) => {
})
}
// 修改OA用户
export const editUserOA = (data) => {
return request({
url: '/admin/mosr/user/oa',
method: 'put',
data
})
}
//删除用户信息
export const deleteUser = (userId) => {
return request({

View File

@@ -15,7 +15,7 @@ const props = defineProps({
default: []
},
modelValue: {
type: [Number, String, Boolean],
type: [Number, String],
default: ''
},
cacheKey: {

View File

@@ -65,6 +65,8 @@ const filterConfig = computed(()=>{
return arr.length >= 4 && showMore.value ? arr : arr.slice(0, 3)
})
console.log(filterConfig.value, 'filterConfig');
// 搜索功能表单元素默认值
const setDefaultFormValues = () => {
filterConfig.value.forEach(item=>{

View File

@@ -49,7 +49,7 @@ import { isVNode } from 'vue'
if(column && column?.formatter) {
return column.formatter(row, column, value, $index) || '--'
}
return value !== null && value !== undefined ? value.toString() : '--'
return value ? value.toString() : '--'
}
</script>

View File

@@ -27,10 +27,8 @@ import Hamburger from './Hamburger.vue';
import {useAuthStore} from '@/stores/userstore.js'
import BellSocket from "./BellSocket.vue";
import {getUserInfo} from "../../api/login";
import {usePermisstionStroe} from '@/stores/permisstion'
const authStore = useAuthStore()
const permisstionStore = usePermisstionStroe()
const userInfo = ref({})
const visitedP = ref(false)
const router = useRouter()
@@ -60,7 +58,6 @@ const handleToAuth = () => {
const handleLogout = () => {
visitedP.value = !visitedP.value
authStore.userLogout()
permisstionStore.removeMenu()
router.push('/login')
}
</script>

View File

@@ -188,8 +188,7 @@ router.beforeEach(async (to, form, next) => {
next()
NProgress.done()
} else {
sessionStorage.setItem('toView', JSON.stringify(to))
next({path: '/cas/login'})
next({path: '/login'})
}
} else {
if (to.path === '/login'|| to.path === '/cas/login') {

View File

@@ -10,17 +10,7 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
const asyncRouters = ref([])
//定义是否加载路由变量
const isLoadRoutes = ref(false)
const menuList = ref([
{
name: 'home',
path: '/home',
icon: 'home',
title: '首页',
meta: {
breadcrumb: true
}
}
])
const menuList = ref([])
const setIsLoadRoutes = (status) => {
return isLoadRoutes.value = status
@@ -31,7 +21,7 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
const sRouter = JSON.parse(JSON.stringify(res.data))
const mData = JSON.parse(JSON.stringify(res.data))
asyncRouters.value = formatAsyncRouters(sRouter)
menuList.value = [...menuList.value, ...generateMenu(mData)]
menuList.value = generateMenu(mData)
addAsyncRouters(asyncRouters.value)
isLoadRoutes.value = false
} else {
@@ -106,18 +96,12 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
}
}
const removeMenu = () => {
menuList.value.length = 0
asyncRouters.value.length = 0
}
return {
asyncRouters,
menuList,
isLoadRoutes,
setAsyncRouters,
setIsLoadRoutes,
removeMenu
setIsLoadRoutes
}
})

View File

@@ -1,6 +1,6 @@
import axios from "axios";
import { AxiosCanceler } from "./axiosCanceler";
import { ElMessageBox, ElNotification } from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
import { getToken, removeToken } from "./auth";
axios.defaults.headers['Content-Type']='application/json'
@@ -48,45 +48,21 @@ serveice.interceptors.response.use(response=>{
case 402:
break;
case 403:
console.log(response)
ElNotification({
title: '系统提示',
message: response.data.msg,
type: 'warning'
})
break;
case 404:
ElNotification({
title: '系统提示',
message: '不存在的地址',
type: 'error'
})
break;
case 405:
ElNotification({
title: '系统提示',
message: '传输格式错误,请检查',
type: 'error'
})
break;
case 511:
ElNotification({
title: '系统提示',
message: '禁止访问',
type: 'error'
})
ElMessage.warning('禁止访问')
removeToken()
window.location = '/forbidden'
break;
case 404:
ElMessage.warning('不存在的地址')
break;
case 405:
ElMessage.warning('传输格式错误,请检查')
break;
case 500:
if (response.data){
return response.data
}else {
ElNotification({
title: '系统提示',
message: '系统未知错误',
type: 'error'
})
ElMessage.error('系统未知错误')
break;
}
}

View File

@@ -51,9 +51,6 @@
import * as echarts from 'echarts'
import homeImage from "@/assets/home/home.png"
import coffee from "@/assets/home/coffee.png"
import { useRouter } from 'vue-router';
const router = useRouter()
const list=ref([
{
title: '在线用户量',
@@ -175,22 +172,8 @@ const init = () => {
data.pieCharts = echarts.init(document.getElementById('pie3')).setOption(pieOption)
}
const redirectView = () => {
const toView = sessionStorage.getItem('toView')
console.log(toView, 'toView');
toView ?
router.push({
path: JSON.parse(toView).path,
query: {
...JSON.parse(toView).query
}
}) :
null
}
onMounted(() => {
init()
redirectView()
})
window.addEventListener('resize', () => {

View File

@@ -37,7 +37,7 @@ import {User, Lock, Key} from '@element-plus/icons-vue'
const router = useRouter()
const authStore = useAuthStore()
const loginForm = reactive({
username: 'superAdmin',
username: 'admin',
password: '123456',
code: '',
uuid: ''

View File

@@ -39,7 +39,7 @@
@select="handleSelect"
v-tabh
>
<el-table-column type="selection" width="55" fixed="left" />
<el-table-column type="selection" width="55"/>
<el-table-column label="序号" type="index" align="center" width="60"/>
<el-table-column prop="roleName" label="角色名称" align="center"/>
<el-table-column prop="roleKey" label="角色标识符" align="center"/>
@@ -59,7 +59,7 @@
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center" width="180px"/>
<el-table-column label="操作" align="center" fixed="right">
<el-table-column label="操作" align="center">
<template #default="scope">
<popover-delete :name="scope.row.roleName" :type="'角色'" :btn-text="'取消授权'"
@delete="handleCancelAuthorization([scope.row.roleId])"/>
@@ -98,7 +98,7 @@
v-loading="dialogLoading"
@select="handleDialogSelect"
>
<el-table-column type="selection" width="55" fixed="left" />
<el-table-column type="selection" width="55"/>
<el-table-column label="序号" type="index" align="center" width="60"/>
<el-table-column prop="roleName" label="角色名称" align="center"/>
<el-table-column prop="roleKey" label="角色标识符" align="center"/>
@@ -117,7 +117,7 @@
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center" width="180px"/>
<el-table-column label="操作" align="center" fixed="right">
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button type="primary" size="mini"
@click="handleSubmit(scope.row.roleId)" link>添加

View File

@@ -16,7 +16,7 @@
</el-form-item>
</el-form>
<div class="table-header-btn">
<el-button type="primary" @click="handleAdd" :icon="Plus" v-perm="['admin:menu:add']">新增</el-button>
<el-button type="primary" @click="handleAdd" :icon="Plus">新增</el-button>
<el-button type="info" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
</div>
@@ -42,13 +42,15 @@
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间"/>
<el-table-column label="操作" prop="operation" align="right">
<el-table-column label="操作" prop="operation">
<template #default="scope">
<el-button type="primary" v-if="scope.row.menuType!=='B'" @click="handleAdd(scope.row)" link v-perm="['admin:menu:add']">新增
<el-button type="primary" v-if="scope.row.menuType!=='B'" size="mini" @click="handleAdd(scope.row)" link>新增
</el-button>
<el-button type="primary" @click="handleEdit(scope.row.menuId)" link v-perm="['admin:menu:edit']">修改</el-button>
<!-- <el-button type="primary" @click="handleAssignRoles(scope.row)" link>分配角色</el-button> -->
<popover-delete :name="scope.row.menuName" :type="'菜单'" @delete="handleDel(scope.row.menuId)" :perm="['admin:menu:del']" />
<div v-else style="display: inline-block">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<el-button type="primary" size="mini" @click="handleEdit(scope.row.menuId)" link>修改</el-button>
<el-button type="primary" size="mini" @click="handleAssignRoles(scope.row)" link>分配角色</el-button>
<popover-delete :name="scope.row.menuName" :type="'菜单'" @delete="handleDel(scope.row.menuId)"/>
</template>
</el-table-column>
</el-table>

View File

@@ -2,16 +2,7 @@
<div v-loading="loading">
<baseTitle title="角色信息录入"></baseTitle>
<fvForm :schema="schame" @getInstance="getInstance" :rules="rules"></fvForm>
<div class="assign-menu-title" >
<baseTitle title="分配菜单"></baseTitle>
<fvSelect
:options="localData.tempRoleOpt"
v-model="localData.tempRoleSelect"
style="width: 200px;"
placeholder="请选择模版角色"
@change="roleTempChange"
/>
</div>
<baseTitle title="分配菜单"></baseTitle>
<fvCheckbox :options="localData.checkOptions" v-model="localData.checkList" @change="checkBoxChange" />
<el-input v-model="localData.filterText" placeholder="请输入关键词" style="width: 400px;" />
<div class="menu-assign">
@@ -20,7 +11,7 @@
:data="localData.menuData"
:filter-node-method="filterMenu"
:props="localData.menuTreeProps"
:check-strictly="!localData.checkStrictly"
:check-strictly="localData.checkStrictly"
show-checkbox
node-key="menuId"
@check-change="checkChange"
@@ -39,7 +30,7 @@ import { useAuthStore } from '@/stores/userstore.js'
import fvRadio from '@/fvcomponents/fvRadio/index.vue'
import { ElLoading, ElNotification } from 'element-plus';
import { getMenuList } from '@/api/system/menuman.js'
import { getRoleDetail, operate, getTemRoleOption } from "@/api/role/role";
import { getRoleDetail, operate} from "@/api/role/role";
const tagsViewStore = useTagsView()
const authStore = useAuthStore()
@@ -59,7 +50,7 @@ const localData = reactive({
label: 'menuName',
children: 'children'
},
checkStrictly: true,
checkStrictly: false,
checkList: ['3'],
checkOptions: [
{
@@ -74,9 +65,7 @@ const localData = reactive({
label: '父子联动',
value: '3'
},
],
tempRoleOpt: [],
tempRoleSelect: ''
]
})
const schame = computed(()=>{
@@ -126,7 +115,7 @@ const schame = computed(()=>{
}
},
]
return !authStore.roles.includes('superAdmin') ? arr.slice(0, arr.length - 1) : arr
return !authStore.roles.includes('superAdmin') ? arr.slice(-1) : arr
})
const rules = reactive({
@@ -141,8 +130,6 @@ const getInstance = (e) => {
const init = async () => {
form.value.setValues({state: '1', template: false})
const res = await getTemRoleOption()
localData.tempRoleOpt = res.data
const { data } = await getMenuList()
localData.menuData = data
}
@@ -153,25 +140,12 @@ const getInfo = async () => {
data.menuIds.forEach(key=>{
menuTree.value.setChecked(key, true, false)
})
form.value.setValues(data)
}
const roleTempChange = async (val) => {
try {
loading.value = true
const { data } = await getRoleDetail(val.value)
data.menuIds.forEach(key=>{
menuTree.value.setChecked(key, true, false)
})
if(route.query.isAdd) {
delete data.roleId
delete data.roleName
delete data.roleKey
form.value.setValues(data)
loading.value = false
} catch (error) {
loading.value = false
}
form.value.setValues(data)
}
const filterMenu = (value, data) => {
@@ -248,14 +222,6 @@ onMounted( async ()=>{
</script>
<style lang="scss" scoped>
.assign-menu-title {
display: flex;
justify-content: flex-start;
align-items: center;
>div:first-child {
margin-right: 15px;
}
}
.menu-assign {
width: 400px;
max-height: 500px;

View File

@@ -129,10 +129,17 @@ const tableConfig = reactive({
prop: 'oper',
label: '操作',
align: 'right',
fixed: 'right',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = [{label: '修改', auth: auths.edit, func: ()=>handleEdit(row) , type: 'primary'}]
row.template ?
btn.push(
{
label: '使用模版',
auth: auths.edit,
func: ()=>handleUseTemp(row),
type: 'primary'
}
) :
btn.push(
{
label: '分配用户',
@@ -214,6 +221,16 @@ const handleEdit = (row) => {
})
}
const handleUseTemp = (row) => {
router.push({
path: '/system/roleadd',
query: {
id: row.roleId,
isAdd: 1
}
})
}
const handleAssign = (row) => {
}

View File

@@ -10,7 +10,7 @@
</template>
<script setup lang="jsx">
import { addUser, editUser } from '@/api/user/user.js'
import { operate } from '@/api/user/user.js'
import { ElLoading, ElNotification } from 'element-plus';
import { useTagsView } from '@/stores/tagsview.js'
import { useAuthStore } from '@/stores/userstore.js'
@@ -43,7 +43,8 @@ const schame = computed(()=>{
clearable: true,
filterable: true,
checkStrictly: true,
data: localData.subCompanyIdOpt
data: localData.subCompanyIdOpt,
disabled: route.query.userType == 0 ? true : false
},
on: {
change: async (val) => {
@@ -61,7 +62,8 @@ const schame = computed(()=>{
clearable: true,
data: localData.departmentIdOpt,
filterable: true,
checkStrictly: true
checkStrictly: true,
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -69,7 +71,8 @@ const schame = computed(()=>{
prop: 'userName',
component: 'el-input',
props: {
placeholder: '请输入'
placeholder: '请输入',
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -77,7 +80,8 @@ const schame = computed(()=>{
prop: 'nickName',
component: 'el-input',
props: {
placeholder: '请输入'
placeholder: '请输入',
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -86,7 +90,7 @@ const schame = computed(()=>{
component: 'el-input',
props: {
placeholder: '请输入',
type: 'password'
type: 'password',
}
},
{
@@ -97,7 +101,8 @@ const schame = computed(()=>{
placeholder: '请选择',
filterable: true,
checkStrictly: true,
data: localData.jobOpt
data: localData.jobOpt,
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -116,7 +121,8 @@ const schame = computed(()=>{
component: 'el-tree-select',
props: {
placeholder: '请选择',
data: cacheStore.getDict('user_sex')
data: cacheStore.getDict('user_sex'),
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -125,7 +131,8 @@ const schame = computed(()=>{
component: 'el-tree-select',
props: {
placeholder: '请选择',
data: cacheStore.getDict('normal_disable')
data: cacheStore.getDict('normal_disable'),
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -133,7 +140,8 @@ const schame = computed(()=>{
prop: 'mobile',
component: 'el-input',
props: {
placeholder: '请输入'
placeholder: '请输入',
disabled: route.query.userType == 0 ? true : false
}
},
{
@@ -141,7 +149,8 @@ const schame = computed(()=>{
prop: 'email',
component: 'el-input',
props: {
placeholder: '请输入'
placeholder: '请输入',
disabled: route.query.userType == 0 ? true : false
}
},
]
@@ -198,30 +207,20 @@ const getInfo = async () => {
const handleSubmit = async () => {
const loading = ElLoading.service({fullscreen: true})
try {
const { isValidate } = await form.value.validate()
if(!isValidate) return Promise.reject()
const values = form.value.getValues()
let message
if(route.query.isAdd) {
const { code, msg } = await addUser(values)
code === 1000 ? message = msg : null
} else {
const { code, msg } = await editUser(values)
code === 1000 ? message = msg : null
}
const { isValidate } = await form.value.validate()
if(!isValidate) return Promise.reject()
const values = form.value.getValues()
operate(values, route.query.userType).then(res=>{
ElNotification({
title: route.query.isAdd ? '新增' : '编辑',
message: message,
type: 'success'
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
loading.close()
tagsViewStore.delViewAndGoView('/system/user')
} catch {
res.code === 1000 ? tagsViewStore.delViewAndGoView('/system/user') : null
}).finally(()=>{
loading.close()
return Promise.reject()
}
})
}
const handleBack = () => {

View File

@@ -119,14 +119,13 @@ const tableConfig = reactive({
currentRender: ({row, index}) => {
return (
<div>
<el-button type="primary" link onClick={()=>handleEdit(row)}>编辑</el-button>
{
row.userType == 0 ?
'--' :
<div>
<el-button type="primary" link onClick={()=>handleEdit(row)}>编辑</el-button>
<el-button type="danger" link onClick={()=>handleDel(row)}>删除</el-button>
</div>
row.userType != 0 ?
<el-button type="danger" link onClick={()=>handleDel(row)}>删除</el-button> :
null
}
</div>
)
}
@@ -171,7 +170,8 @@ const handleEdit = (row) => {
router.push({
path: '/system/useredit',
query: {
id: row.userId
id: row.userId,
userType: row.userType
}
})
}

View File

@@ -59,7 +59,7 @@ export default defineConfig({
terserOptions: {
compress: {
drop_console: false, // 生产环境移除log
drop_debugger: true // 生产环境禁用debugger
drop_debugger: false // 生产环境禁用debugger
}
}
},