人力资源智能化管理项目(day09:权限应用)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject

搭建页面结构

<template>
  <div class="container">
    <div class="app-container">
      <el-button class="btn-add" type="primary" size="mini">添加权限</el-button>
      <el-table>
        <el-table-column label="名称" />
        <el-table-column label="标识" />
        <el-table-column label="描述" />
        <el-table-column label="操作">
          <el-button type="text">添加</el-button>
          <el-button type="text">编辑</el-button>
          <el-button type="text">删除</el-button>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script>
export default {
  name: 'Permission'
}
</script>
<style>
.btn-add {
  margin: 10px;
}
</style>

获取数据转化树形

import request from '@/utils/request'

/**
 *
 * 获取权限列表
 *
 */
export function getPermissionList () {
  return request({
    url: '/sys/permission',
    method: 'GET'
  })
}

  <template>
  <div class="container">
    <div class="app-container">
      <el-button class="btn-add" type="primary" size="mini">添加权限</el-button>
      <el-table default-expand-all :data="list" row-key="id">
        <el-table-column prop="name" label="名称" />
        <el-table-column prop="code" label="标识" />
        <el-table-column prop="description" label="描述" />
        <el-table-column label="操作">
          <template v-slot="{ row }">
            <el-button v-if="row.type === 1" size="mini" type="text"
              >添加</el-button
            >
            <el-button type="text" size="mini">编辑</el-button>
            <el-button type="text" size="mini">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script>
import { getPermissionList } from '@/api/permission'
import { transListToTreeData } from '@/utils/index'
export default {
  name: 'Permission',
  data () {
    return {
      list: []
    }
  },
  created () {
    this.getPermissionList()
  },
  methods: {
    async getPermissionList () {
      this.list = transListToTreeData(await getPermissionList(), 0)
      console.log(this.list)
    }
  }
}
</script>
<style>
.btn-add {
  margin: 10px;
}
</style>

作业 ( 基于权限接口和线上效果完成 权限点的新增- 删除- 编辑 )

本次作业我封装了一个添加组件

子组件:

<template>
  <el-dialog :title="showTitle" :visible="showDialog" @close="close">
    <!-- 放置弹层内容 -->
    <el-form ref="addDept" label-width="120px" :model="formData" :rules="rules">
      <el-form-item label="权限名称" prop="name">
        <el-input v-model="formData.name" style="width: 80%" size="mini" />
      </el-form-item>
      <el-form-item label="权限标识" prop="code">
        <el-input v-model="formData.code" style="width: 80%" size="mini" />
      </el-form-item>
      <el-form-item label="权限描述" prop="description">
        <el-input
          v-model="formData.description"
          style="width: 80%"
          size="mini"
        />
      </el-form-item>
      <!-- 如果不需要校验,就不需要写prop属性 -->
      <!-- 重置表单数据,需要prop属性 -->
      <el-form-item label="启用" prop="enVisible">
        <el-switch
          v-model="formData.enVisible"
          :active-value="1"
          :inactive-value="0"
          size="mini"
        />
      </el-form-item>
      <el-form-item>
        <el-row type="flex" justify="center">
          <el-col :span="12">
            <el-button type="primary" size="mini" @click="btnOk"
              >确定</el-button
            >
            <el-button size="mini" @click="close">取消</el-button>
          </el-col>
        </el-row>
      </el-form-item>
    </el-form>
  </el-dialog>
</template>

<script>
import {
  addPermission,
  getPermissionDetail,
  editPermission
} from '@/api/permission'
export default {
  props: {
    showDialog: {
      type: Boolean,
      default: false
    },
    pid: {
      // 获取主组件传递的id,根据这个id进行第二级权限的添加
      type: Number,
      default: null
    },
    sonId: {
      // 获取主组件传递的id,根据这个id进行权限的编辑
      type: Number,
      default: null
    }
  },
  data () {
    return {
      list: [],
      formData: {
        name: '', // 权限点名字
        code: '', // 权限点标识
        description: '', // 权限点描述
        enVisible: '', // 权限点开启状态
        type: null, // 权限点类型
        pid: null // 权限点父级id
      },
      rules: {
        name: [
          { required: true, message: '权限点名字不能为空', trigger: 'blur' }
        ], // 权限点名字
        code: [
          { required: true, message: '权限点标识不能为空', trigger: 'blur' }
        ] // 权限点标识
      }
    }
  },
  computed: {
    // 标题不是表单所以不能绑定v-model事件,使用计算属性进行更新
    showTitle () {
      return this.sonId ? '编辑权限点' : '新增权限点'
    }
  },
  watch: {
    sonId: function () {
      this.getPermissionDetail()
    }
  },
  methods: {
    close () {
      // 修改父组件的值,子传父
      // .sync会自动监听update:showDialog事件
      // resetFields只能重置在模板中绑定的数据
      this.formData = {
        name: '', // 权限点名字
        code: '', // 权限点标识
        description: '', // 权限点描述
        enVisible: '0', // 权限点开启状态
        type: null, // 权限点类型
        pid: null // 权限点父级id
      }
      this.$refs.addDept.resetFields() // 重置表单
      this.$emit('clearId')
      this.$emit('update:showDialog', false)
    },
    btnOk () {
      this.$refs.addDept.validate(async isOk => {
        if (isOk) {
          let msg = '新增'
          if (this.sonId == null) {
            // 如果父组件传id回来了,应该是二级组件
            if (this.pid != null) {
              this.formData.pid = this.pid
            }
            // 判断是否是一级添加
            if (this.formData.pid == null) {
              this.formData.type = 1
              this.formData.pid = 0
              await addPermission(this.formData)
              console.log('一级添加')
            } else {
              this.formData.type = 2
              await addPermission(this.formData)
              console.log('二级添加')
            }
          } else {
            msg = '修改'
            await editPermission(this.formData)
          }
          // 通知父组件更新
          this.$emit('updatePermission')
          // 提示信息
          this.$message.success(`${msg}权限点成功`)
          this.close()
        }
      })
    },
    async getPermissionDetail () {
      if (this.sonId != null) {
        this.formData = await getPermissionDetail(this.sonId)
      }
    } // 获取权限点的详情
  }
}
</script>

<style></style>

api接口:

import request from '@/utils/request'

/**
 *
 * 获取权限列表
 *
 */
export function getPermissionList () {
  return request({
    url: '/sys/permission',
    method: 'GET'
  })
}

/**
 *
 * 删除-权限点
 *
 */
export function delPermission (id) {
  return request({
    url: `/sys/permission/${id}`,
    method: 'DELETE'
  })
}

/**
 *
 * 新增-权限点
 *
 */
export function addPermission (data) {
  return request({
    url: '/sys/permission',
    method: 'POST',
    data
  })
}

/**
 *
 * 获取-权限点详情
 *
 */
export function getPermissionDetail (id) {
  return request({
    url: `/sys/permission/${id}`,
    method: 'GET'
  })
}

/**
 *
 * 修改-权限点详情
 *
 */
export function editPermission (data) {
  return request({
    url: `/sys/permission/${data.id}`,
    method: 'PUT',
    data
  })
}

父组件:

<template>
  <div class="container">
    <div class="app-container">
      <el-button
        class="btn-add"
        type="primary"
        size="mini"
        @click="showDialog = true"
        >添加权限</el-button
      >
      <el-table default-expand-all :data="list" row-key="id">
        <el-table-column prop="name" label="名称" />
        <el-table-column prop="code" label="标识" />
        <el-table-column prop="description" label="描述" />
        <el-table-column label="操作">
          <template v-slot="{ row }">
            <el-button
              v-if="row.type === 1"
              size="mini"
              type="text"
              @click="addPermissionSecond(row.id)"
              >添加</el-button
            >
            <el-button type="text" size="mini" @click="editPermission(row.id)"
              >编辑</el-button
            >
            <el-button type="text" size="mini" @click="delPermission(row.id)"
              >删除</el-button
            >
          </template>
        </el-table-column>
      </el-table>
    </div>
    <addPermission
      :son-id="id"
      :show-dialog.sync="showDialog"
      :pid="fatherId"
      @updatePermission="getPermissionList"
      @clearId="clearId"
    />
  </div>
</template>
<script>
import { getPermissionList, delPermission } from '@/api/permission'
import { transListToTreeData } from '@/utils/index'
import addPermission from './components/add-permission.vue'
export default {
  name: 'Permission',
  components: { addPermission },
  data () {
    return {
      list: [],
      showDialog: false, // 控制弹层的显隐
      fatherId: null, // 传递父节点的id给子组件用于增加二级权限点
      id: null // 传递父节点的id给子组件用于编辑权限点
    }
  },
  created () {
    this.getPermissionList()
  },
  methods: {
    async getPermissionList () {
      this.list = transListToTreeData(await getPermissionList(), 0)
    },
    // 删除权限点
    delPermission (id) {
      this.$confirm('此操作将永久删除该部门, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(async () => {
          await delPermission(id)
          this.$message({
            type: 'success',
            message: '删除成功!'
          })
          this.getPermissionList()
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          })
        })
    },
    // 增加二级权限点
    addPermissionSecond (id) {
      this.showDialog = true
      this.fatherId = id
    },
    // 编辑权限点
    editPermission (id) {
      this.showDialog = true
      this.id = id
    },
    clearId () {
      this.id = null
    }
  }
}
</script>
<style>
.btn-add {
  margin: 10px;
}
</style>

权限概念

分配过程

员工分配角色-弹出层

 /**
 *
 * 获取-已启用的角色列表
 *
 */
export function getEnableRoleList () {
  return request({
    url: '/sys/role/list/enabled',
    method: 'GET'
  })
}

 showRoleDialog: false, // 控制角色弹层的显隐
      roleList: [], // 接收角色列表
      roleIds: [], // 用于多选框数据双向绑定,存储选中的id

       // 点击角色按钮弹出层
    async btnRole () {
      this.roleList = await getEnableRoleList()
      this.showRoleDialog = true
    },

    <!-- 放置角色弹层 -->
    <el-dialog :visible.sync="showRoleDialog" title="分配角色">
      <!-- 内容 -->
      <el-checkbox-group v-model="roleIds">
        <!-- 要执行checkbox的存储值 item.id -->
        <el-checkbox v-for="item in roleList" :key="item.id" :label="item.id">
          {{ item.name }}</el-checkbox
        >
      </el-checkbox-group>
 </el-dialog>

   
 <el-button size="mini" type="text" @click="btnRole">角色</el-button>

员工分配角色-回显数据并提交

/**
 *
 * 获取-员工-基本信息
 *
 */
export function getEmployeeDetail (id) {
  return request({
    url: `/sys/user/${id}`,
    method: 'GET'
  })
}

/**
 *
 * 获取-已启用的角色列表
 *
 */
export function assignRole (data) {
  return request({
    url: '/sys/user/assignRoles',
    method: 'PUT',
    data
  })
}

    // 点击角色按钮弹出层
    async btnRole (id) {
      this.roleList = await getEnableRoleList()
      // 记录当前点击的id 因为后边 确定取消要存取给对应的用户
      this.currentUserId = id
      const { roleIds } = await getEmployeeDetail(id)
      this.roleIds = roleIds
      this.showRoleDialog = true
    },
    // 点击角色的确定
    async btnRoleOk () {
      await assignRole({
        id: this.currentUserId,
        roleIds: this.roleIds
      })
      this.$message.success('分配用户角色成功')
      this.showRoleDialog = false
    }

    <!-- 放置角色弹层 -->
    <el-dialog :visible.sync="showRoleDialog" title="分配角色">
      <!-- 内容 -->
      <el-checkbox-group v-model="roleIds">
        <!-- 要执行checkbox的存储值 item.id -->
        <el-checkbox v-for="item in roleList" :key="item.id" :label="item.id">
          {{ item.name }}</el-checkbox
        >
      </el-checkbox-group>
      <el-row slot="footer" type="flex" justify="center">
        <el-col :span="6">
          <el-button
            type="primary"
            size="mini"
            justify="center"
            @click="btnRoleOk"
            >确定</el-button
          >
          <el-button size="mini" @click="showRoleDialog = false"
            >取消</el-button
          >
        </el-col>
      </el-row>
    </el-dialog>

<el-button size="mini" type="text" @click="btnRole(row.id)"
                >角色</el-button
              >

给角色分配权限-弹出层

      showPermissionDialog: false, // 控制权限弹层的显隐
      permissionData: [] // 接收权限树数据

<el-button size="mini" type="text" @click="btnPermission"
                >分配权限</el-button>

  <!-- 放置权限弹层 -->
    <el-dialog :visible.sync="showPermissionDialog" title="分配权限">
      <!-- 内容 -->
      <el-tree
        :data="permissionData"
        :props="{ label: 'name' }"
        show-checkbox
        default-expand-all=""
      />
    </el-dialog>

    // 分配权限
    async btnPermission () {
      this.showPermissionDialog = true
      this.permissionData = transListToTreeData(await getPermissionList(), 0)
    }

角色分配权限-显示已有权限数据

/**
 *
 * 获取-角色详情
 *
 */
export function getRoleDetail (id) {
  return request({
    url: `/sys/role/${id}`,
    method: 'GET'
  })
}

    // 分配权限
    async btnPermission (id) {
      this.currentRoleId = id
      const { permIds } = await getRoleDetail(id)
      this.permIds = permIds
      this.permissionData = transListToTreeData(await getPermissionList(), 0)
      this.showPermissionDialog = true
    }

      <!-- 内容 -->
      <el-tree
        node-key="id"
        :data="permissionData"
        :props="{ label: 'name' }"
        show-checkbox
        default-expand-all
        :default-checked-keys="permIds"
      />

角色分配权限-确定提交

/**
 *
 * 分配权限-角色
 *
 */
export function assignPrem (data) {
  return request({
    url: '/sys/role/assignPrem',
    method: 'PUT',
    data
  })
}

<el-row slot="footer" type="flex" justify="center">
        <el-col :span="6">
          <el-button type="primary" size="mini" @click="btnPermissionOk"
            >确定</el-button
          >
          <el-button size="mini" @click="showPermissionDialog = false"
            >取消</el-button
          >
        </el-col>
      </el-row>

    async btnPermissionOk () {
      await assignPrem({
        id: this.currentRoleId,
        permIds: this.$refs.permTree.getCheckedKeys()
      })
      this.$message.success('角色分配权限成功')
      this.showPermissionDialog = false
    }

拆分静态路由和动态路由

// 静态路由
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('@/views/dashboard/index'),
        meta: { title: '首页', icon: 'dashboard' }
      }
    ]
  },
  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]
// 动态路由
export const asyncRoutes = [
  department,
  role,
  employee,
  permission,
  attendance,
  approval,
  salary,
  social
]
const createRouter = () =>
  new Router({
    // mode: 'history', // require service support
    scrollBehavior: () => ({ y: 0 }),
    routes: constantRoutes // 默认引入静态路由
  })

根据用户权限添加动态路由

permission完整代码

router.beforeEach(async (to, from, next) => {
  nprogress.start() // 开启进度条
  // 判断是否有token
  if (store.getters.token) {
    // 如果有token,则判断是否是登录页
    if (to.path === '/login') {
      // 如果是则跳转到主页
      next('/')
      // next有地址的话并没有执行后置守卫,所以要手动调用一下进度条关闭
      nprogress.done()
    } else {
      // 如果不是则放过
      // 判断是否获取过资料
      if (!store.getters.userId) {
        // 如果没有则获取资料
        const { roles } = await store.dispatch('user/getUserInfo')
        const filterRoutes = asyncRoutes.filter(item => {
          return roles.menus.includes(item.name)
        }) // 筛选后的路由
        router.addRoutes([
          ...filterRoutes,
          { path: '*', redirect: '/404', hidden: true }
        ]) // 添加动态路由信息到路由表
        // router添加动态路由之后 需要转发一下
        next(to.path) // 目的是让路由拥有信息 router的已知缺陷
      } else {
        next() // 放过
      }
    }
  } else {
    // 判断是否在白名单里面
    if (whiteList.includes(to.path)) {
      // 如果在就放过
      next()
    } else {
      // 如果不在,就跳转到登录
      next('/login')
      nprogress.done()
    }
  }
})
// 静态路由
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('@/views/dashboard/index'),
        meta: { title: '首页', icon: 'dashboard' }
      }
    ]
  }
  // 404 page must be placed at the end !!!
]
// 动态路由
export const asyncRoutes = [
  department,
  role,
  employee,
  permission,
  attendance,
  approval,
  salary,
  social
]
const createRouter = () =>
  new Router({
    // mode: 'history', // require service support
    scrollBehavior: () => ({ y: 0 }),
    routes: constantRoutes // 默认引入静态路由
  })
// 获取用户的基本资料
  async getUserInfo (context) {
    const result = await getUserInfo()
    context.commit('setUserInfo', result)
    return result // 返回数据
  }

这里以approval路由为例,其他路由都要添加name属性

import layout from '@/layout'
export default {
  path: '/approval',
  name: 'approval',
  component: layout,
  children: [
    {
      path: '',
      name: 'approval',
      component: () => import('@/views/approval'),
      meta: {
        title: '审批',
        icon: 'tree-table'
      }
    }
  ]
}

根据权限显示左侧菜单

import { constantRoutes } from '@/router'

// 存放数据
const state = {
  routes: constantRoutes // 存储路由信息,默认存储的是静态路由
}
// 修改数据
const mutations = {
  setRoutes (state, newRoutes) {
    state.routes = [...constantRoutes, ...newRoutes] // 静态路由+动态路由
  }
}
const getters = {
  routes: state => state.user.routes
}
// getters编辑访问
export default getters

        const { roles } = await store.dispatch('user/getUserInfo')
        const filterRoutes = asyncRoutes.filter(item => {
          return roles.menus.includes(item.name)
        }) // 筛选后的路由
        store.commit('user/setRoutes', filterRoutes)
        router.addRoutes([
          ...filterRoutes,
          { path: '*', redirect: '/404', hidden: true }
        ]) // 添加动态路由信息到路由表
computed: {
    ...mapGetters(['sidebar', 'routes']),
    // 路由信息的计算属性
    // routes () {
    //   // 当前路由的所有信息
    //   return this.$router.options.routes
    // },
      }

退出登录重置路由

import { resetRouter } from '@/router'
// 异步操作
const actions = {
  // 退出登录
  logout (context) {
    // 1.删除token
    context.commit('removeToken')
    // 2.删除用户信息
    context.commit('setUserInfo', {})
    // 重置路由
    resetRouter()
  }
}

功能权限-按钮权限标识

自定义指令应用功能权限

代码层面:

// 注册自定义指令,控制功能权限
Vue.directive('permission', {
  // 会在指令作用的元素插入dom之后执行
  inserted (el, binding) {
    // el是当前指令作用的dom元素的对象
    // binding是v-permission="表达式"的信息
    const points = store.state.user.userInfo?.roles?.points || []
    // 判断当前登录用户(数组)是否包含权限点,不存在就要将对应的按钮删除或禁用
    if (!points.includes(binding.value)) {
      // 删除
      el.remove()
      // 禁用
      // el.disabled = true
    }
  }
})
<el-button
            v-permission="add - employee"
            size="mini"
            type="primary"
            @click="$router.push('/employee/detail')"
            >添加员工</el-button
          >

页面层面(标识要和代码一致):

其他模块-集成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/396930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型导师坚鹏:政府数字化转型之数字化新技术解析与应用

政府数字化转型之数字化新技术解析与应用 课程背景&#xff1a; 数字化背景下&#xff0c;很多政府存在以下问题&#xff1a; 不清楚新技术的发展现状&#xff1f; 不清楚新技术的重要应用&#xff1f; 不清楚新技术的成功案例&#xff1f; 课程特色&#xff1a; 有…

OpenAI 全新发布文生视频模型 Sora,支持 60s 超长长度,有哪些突破?将带来哪些影响?

Sora大模型简介 OpenAI 的官方解释了在视频数据基础上进行大规模训练生成模型的方法。 我们下面会摘取其中的关键部分罗列让大家快速get重点。 喜欢钻研的伙伴可以到官网查看技术报告&#xff1a; https://openai.com/research/video-generation-models-as-world-simulator…

数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(二)

上接&#xff1a;数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(一&#xff09; &#xff08;六&#xff09;模型选择与建立——聚类分析&#xff0c;关联规则 针对抖音用户浏览行为数据&#xff0c;我们可以选择使用各种适应的数据挖掘模型或算法&#xff0c;如关联规则…

TRS 2024 论文阅读 | 基于点云处理和点Transformer网络的人体活动连续识别

无线感知/雷达成像部分最新工作<持续更新>: 链接地址 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学…

【机器学习笔记】 9 集成学习

集成学习方法概述 Bagging 从训练集中进行子抽样组成每个基模型所需要的子训练集&#xff0c;对所有基模型预测的结果进行综合产生最终的预测结果&#xff1a; 假设一个班级每个人的成绩都不太好&#xff0c;每个人单独做的考卷分数都不高&#xff0c;但每个人都把自己会做的…

一键彻底清理!解密如何清理电脑C盘垃圾的绝佳方法

随着我们在电脑上进行各种活动&#xff0c;C盘往往会逐渐积累大量的垃圾文件&#xff0c;这可能导致系统运行缓慢、启动时间延长以及存储空间被占用。对于许多用户而言&#xff0c;如何高效而一键地清理电脑C盘的垃圾成为一个备受关注的问题。如何清理电脑c盘垃圾&#xff1f;在…

树与二叉树

树与二叉树 文章目录 树与二叉树一、树的概念及结构1.、树的概念2、树的相关概念1.3 树的表示 二、二叉树1.概念2、特殊的二叉树3、二叉树的性质4、二叉树的存储结构 三、二叉树的顺序结构及实现1、二叉树的顺序结构2、堆的概念及结构3、堆的实现 四、二叉树链式结构的实现1、遍…

【Unity2019.4.35f1】配置JDK、NDK、SDK、Gradle

目录 JDK NDK SDK 环境变量 Gradle JDK JDK&#xff1a;jdk-1.8版本Java Downloads | Oracle 下载要登录&#xff0c;搜索JDK下载公用账号&#xff1a;Oracle官网 JDK下载 注册登录公共账号和密码_oracle下载账号-CSDN博客 路径&#xff1a;C:\Program Files\Java\jd…

RichAF 中文版(下)

原文&#xff1a;Rich AF : The Winning Money Mindset That Will Change Your Life 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 五、我出生时不是富人&#xff0c;但我的孩子会是 投资部分 当涉及投资时&#xff0c;我有三个关于致富的真相要分享&#xff1a; …

外贸人大部分都复工了吧

这几天是属于国家规定的节后上班时间&#xff0c;估计大部分人都已经开始复工了。作为粤西地区小伙伴中的一员&#xff0c;表示虽然身在广州&#xff0c;心却还在高州&#xff0c;毕竟年例在这些天才刚刚开始&#xff0c;我们那边每年最热闹的时候就是年例了&#xff01; 由于…

AI破局俱乐部,你要了解的都在这里

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)

阅读导航 引言一、生产者消费者模型二、环形队列简介三、基于环形队列的生产者消费者模型&#xff08;C 代码模拟实现&#xff09;⭕Makefile文件⭕ . h 头文件✅sem.hpp✅ringQueue.hpp ⭕ . cpp 文件✅testMain.cpp 温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了…

S32 Design Studio PE工具配置Watch Dog

配置操作 在一个component下面可以创建多个看门狗&#xff0c;一般会有个限制&#xff0c;就是不能创建多个 看门狗比较简单&#xff0c;在configurations list里面新建软件看门狗&#xff0c;配置里面的名字、超时时间等配置即可。 代码对应 生成的代码在watchdog1.c和 wat…

CV论文--2024.2.19

1、Self-Play Fine-Tuning of Diffusion Models for Text-to-Image Generation 中文标题&#xff1a;自我对弈微调扩散模型&#xff0c;用于文本到图像生成 简介&#xff1a;在生成人工智能&#xff08;GenAI&#xff09;领域&#xff0c;微调扩散模型仍然是一个未被充分探索的…

搭建本地git仓库 gogs本地大家 CentOS搭建本地git仓库 CentOS部署gogs

运行环境 操作系统:CentOS7.8 64位 使用mysql5.7.44数据库 选用依赖 yum install vim wget unzip -y本文选择使用WLNMP集成环境 第一步 配置epel源(必须) yum install epel-release第二步 添加wlnmp源 这里选择自动脚本 curl -fsSL "https://sh.wlnmp.com/wlnmp…

算法模板 7.拓扑排序

拓扑排序 用来解决循环依赖相关问题&#xff01;&#xff01;&#xff01; 一个有向无环图一定存在一个拓扑序列&#xff01;一定存在至少一个入度为0的点 有向无环图也被称作拓扑图 先把入度为0的点压入队列&#xff0c;然后进行广度优先搜索&#xff08;找到队头&#xf…

遥感影像数据处理分析软件与ChatGPT集成、多光谱数据分析与实践、高光谱数据分析与实践

目录 第一章 遥感科学与AI基础 第二章 遥感影像数据处理分析软件与ChatGPT集成 第三章 多光谱数据分析与实践专题 第四章 高光谱分析与实践专题 更多应用 将最新的人工智能技术与实际的遥感应用相结合&#xff0c;提供不仅是理论上的&#xff0c;而且是适用和可靠的工具和…

【天锐绿盾】| 数据防泄漏软件——防止公司核心文件数据\资料外泄、泄露!

数据防泄漏软件 数据防泄漏&#xff08;DLP&#xff09;软件是一种专门设计用于保护企业和组织内部敏感信息的网络安全工具。 PC端&#xff1a;https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 它们通常包含以下核心功能&#xff1a; 文件加密…

2、windows环境下vscode开发c/c++环境配置(一)

前言&#xff1a;VSCode是微软出的一款轻量级编辑器&#xff0c;它本身只是一款文本编辑器而已&#xff0c;并不是一个集成开发环境(IDE)&#xff0c;几乎所有功能都是以插件扩展的形式所存在的。因此&#xff0c;我们想用它编程&#xff0c;不只是把vscode下载下来就行&#x…

C语言系列(所需基础:大学C语言及格)-3-字符串/ASCII码表

文章目录 一、字符串二、ASCII码表 一、字符串 用" "来定义字符串&#xff1a; #include <stdio.h>int main() {"";//空字符串"hkl";//由""定义的字符串return(0); }用数组来存储字符串&#xff0c;并打印&#xff1a; #incl…