├── static └── text1.txt ├── .gitignore ├── src ├── websocket │ └── mod.rs ├── mapper │ ├── user_post_mapper.rs │ ├── captcha_mapper.rs │ ├── mod.rs │ ├── xml │ │ ├── role_menu_xml.html │ │ ├── user_role_xml.html │ │ ├── excel_xml.html │ │ ├── menu_xml.html │ │ ├── dept_xml.html │ │ ├── post_xml.html │ │ └── notice_xml.html │ ├── role_menu_mapper.rs │ ├── excel_mapper.rs │ ├── user_role_mapper.rs │ ├── menu_mapper.rs │ ├── dept_mapper.rs │ ├── post_mapper.rs │ ├── notice_mapper.rs │ └── user_mapper.rs ├── utils │ ├── mod.rs │ ├── md5.rs │ ├── mysql.rs │ ├── captcha.rs │ ├── redis.rs │ ├── webtoken.rs │ └── system.rs ├── model │ ├── swagger_model.rs │ ├── mod.rs │ ├── chat_model.rs │ ├── common_model.rs │ ├── excel_model.rs │ ├── post_model.rs │ ├── notice_model.rs │ ├── monitor_model.rs │ └── dept_model.rs ├── entity │ ├── sys_role_menu_entity.rs │ ├── sys_user_post_entity.rs │ ├── sys_user_role_entity.rs │ ├── sys_captcha_entity.rs │ ├── mod.rs │ ├── excel_entity.rs │ ├── sys_post_entity.rs │ ├── sys_notice_entity.rs │ ├── sys_dept_entity.rs │ ├── sys_menu_entity.rs │ ├── sys_role_entity.rs │ ├── sys_dict_type_entity.rs │ └── sys_dict_data_entity.rs ├── service │ ├── mod.rs │ └── monitor_service.rs ├── router │ ├── monitor_router.rs │ ├── post_router.rs │ ├── notice_router.rs │ ├── dept_router.rs │ ├── excel_router.rs │ ├── menu_router.rs │ ├── dict_router.rs │ └── role_router.rs ├── controller │ ├── mod.rs │ └── monitor_controller.rs └── main.rs ├── ui ├── src │ ├── store │ │ ├── index.js │ │ └── modules │ │ │ ├── app.js │ │ │ ├── dict.js │ │ │ └── settings.js │ ├── components │ │ ├── ParentView │ │ │ └── index.vue │ │ ├── IconSelect │ │ │ ├── requireIcons.js │ │ │ └── index.vue │ │ ├── RuoYi │ │ │ ├── Doc │ │ │ │ └── index.vue │ │ │ └── Git │ │ │ │ └── index.vue │ │ ├── SvgIcon │ │ │ ├── svgicon.js │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── iFrame │ │ │ └── index.vue │ │ ├── DictTag │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── SizeSelect │ │ │ └── index.vue │ │ └── Breadcrumb │ │ │ └── index.vue │ ├── assets │ │ ├── logo │ │ │ └── logo.png │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── images │ │ │ ├── profile.jpg │ │ │ └── login-background.jpg │ │ ├── icons │ │ │ └── svg │ │ │ │ ├── chart.svg │ │ │ │ ├── size.svg │ │ │ │ ├── link.svg │ │ │ │ ├── guide.svg │ │ │ │ ├── money.svg │ │ │ │ ├── email.svg │ │ │ │ ├── drag.svg │ │ │ │ ├── documentation.svg │ │ │ │ ├── fullscreen.svg │ │ │ │ ├── user.svg │ │ │ │ ├── lock.svg │ │ │ │ ├── excel.svg │ │ │ │ ├── example.svg │ │ │ │ ├── slider.svg │ │ │ │ ├── star.svg │ │ │ │ ├── table.svg │ │ │ │ ├── search.svg │ │ │ │ ├── education.svg │ │ │ │ ├── tab.svg │ │ │ │ ├── message.svg │ │ │ │ ├── switch.svg │ │ │ │ ├── theme.svg │ │ │ │ ├── code.svg │ │ │ │ ├── druid.svg │ │ │ │ ├── peoples.svg │ │ │ │ ├── input.svg │ │ │ │ ├── server.svg │ │ │ │ ├── textarea.svg │ │ │ │ ├── time.svg │ │ │ │ ├── edit.svg │ │ │ │ ├── nested.svg │ │ │ │ ├── row.svg │ │ │ │ ├── monitor.svg │ │ │ │ ├── tree-table.svg │ │ │ │ ├── eye.svg │ │ │ │ ├── build.svg │ │ │ │ ├── clipboard.svg │ │ │ │ ├── list.svg │ │ │ │ ├── download.svg │ │ │ │ ├── icon.svg │ │ │ │ ├── international.svg │ │ │ │ ├── question.svg │ │ │ │ ├── wechat.svg │ │ │ │ ├── skill.svg │ │ │ │ ├── people.svg │ │ │ │ ├── post.svg │ │ │ │ ├── checkbox.svg │ │ │ │ ├── language.svg │ │ │ │ ├── eye-open.svg │ │ │ │ ├── validCode.svg │ │ │ │ ├── radio.svg │ │ │ │ ├── select.svg │ │ │ │ ├── upload.svg │ │ │ │ ├── 404.svg │ │ │ │ ├── zip.svg │ │ │ │ ├── phone.svg │ │ │ │ ├── log.svg │ │ │ │ ├── bug.svg │ │ │ │ ├── github.svg │ │ │ │ ├── pdf.svg │ │ │ │ ├── logininfor.svg │ │ │ │ ├── rate.svg │ │ │ │ ├── job.svg │ │ │ │ ├── exit-fullscreen.svg │ │ │ │ ├── tree.svg │ │ │ │ ├── swagger.svg │ │ │ │ └── password.svg │ │ └── styles │ │ │ ├── transition.scss │ │ │ ├── mixin.scss │ │ │ ├── element-ui.scss │ │ │ ├── btn.scss │ │ │ └── variables.module.scss │ ├── utils │ │ ├── errorCode.js │ │ ├── auth.js │ │ ├── dynamicTitle.js │ │ ├── dict.js │ │ ├── jsencrypt.js │ │ ├── permission.js │ │ ├── theme.js │ │ └── scroll-to.js │ ├── api │ │ ├── menu.js │ │ ├── monitor │ │ │ ├── server.js │ │ │ ├── online.js │ │ │ ├── operlog.js │ │ │ ├── jobLog.js │ │ │ ├── logininfor.js │ │ │ ├── cache.js │ │ │ └── job.js │ │ ├── tool │ │ │ ├── excel.js │ │ │ └── gen.js │ │ ├── system │ │ │ ├── post.js │ │ │ ├── notice.js │ │ │ ├── dept.js │ │ │ ├── dict │ │ │ │ ├── data.js │ │ │ │ └── type.js │ │ │ ├── menu.js │ │ │ └── config.js │ │ └── login.js │ ├── layout │ │ └── components │ │ │ ├── index.js │ │ │ ├── InnerLink │ │ │ └── index.vue │ │ │ ├── IframeToggle │ │ │ └── index.vue │ │ │ ├── Sidebar │ │ │ └── Link.vue │ │ │ └── AppMain.vue │ ├── views │ │ ├── tool │ │ │ ├── build │ │ │ │ └── index.vue │ │ │ ├── swagger │ │ │ │ └── index.vue │ │ │ └── gen │ │ │ │ └── basicInfoForm.vue │ │ ├── monitor │ │ │ └── druid │ │ │ │ └── index.vue │ │ ├── redirect │ │ │ └── index.vue │ │ ├── error │ │ │ └── 401.vue │ │ └── system │ │ │ └── user │ │ │ └── profile │ │ │ └── userInfo.vue │ ├── directive │ │ ├── index.js │ │ ├── permission │ │ │ ├── hasRole.js │ │ │ └── hasPermi.js │ │ └── common │ │ │ └── copyText.js │ ├── App.vue │ ├── plugins │ │ ├── index.js │ │ ├── auth.js │ │ ├── cache.js │ │ └── modal.js │ ├── settings.js │ └── permission.js ├── .github │ └── FUNDING.yml ├── bin │ ├── build.bat │ ├── package.bat │ └── run-web.bat ├── public │ └── favicon.ico ├── .env.development ├── vite │ └── plugins │ │ ├── setup-extend.js │ │ ├── auto-import.js │ │ ├── svg-icon.js │ │ ├── index.js │ │ └── compression.js ├── .env.staging ├── .env.production ├── .gitignore ├── package.json └── vite.config.js ├── sql └── tool_excel.sql ├── Cargo.toml └── README.md /static/text1.txt: -------------------------------------------------------------------------------- 1 | 测试静态文件 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /.idea 3 | -------------------------------------------------------------------------------- /src/websocket/mod.rs: -------------------------------------------------------------------------------- 1 | 2 | pub mod excel_websocket; -------------------------------------------------------------------------------- /ui/src/store/index.js: -------------------------------------------------------------------------------- 1 | const store = createPinia() 2 | 3 | export default store -------------------------------------------------------------------------------- /ui/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html 2 | -------------------------------------------------------------------------------- /ui/bin/build.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/bin/build.bat -------------------------------------------------------------------------------- /ui/bin/package.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/bin/package.bat -------------------------------------------------------------------------------- /ui/bin/run-web.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/bin/run-web.bat -------------------------------------------------------------------------------- /ui/src/components/ParentView/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/public/favicon.ico -------------------------------------------------------------------------------- /ui/src/assets/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/logo/logo.png -------------------------------------------------------------------------------- /ui/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /ui/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/404_images/404.png -------------------------------------------------------------------------------- /ui/src/assets/images/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/images/profile.jpg -------------------------------------------------------------------------------- /ui/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /ui/src/assets/images/login-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyqgit/salvo-admin/HEAD/ui/src/assets/images/login-background.jpg -------------------------------------------------------------------------------- /ui/.env.development: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VITE_APP_TITLE = 若依管理系统 3 | 4 | # 开发环境配置 5 | VITE_APP_ENV = 'development' 6 | 7 | # 若依管理系统/开发环境 8 | VITE_APP_BASE_API = '/dev-api' 9 | -------------------------------------------------------------------------------- /ui/src/utils/errorCode.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | 'default': '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /src/mapper/user_post_mapper.rs: -------------------------------------------------------------------------------- 1 | use rbatis::crud; 2 | use crate::entity::sys_user_post_entity::SysUserPostEntity; 3 | 4 | crud!(SysUserPostEntity{},"sys_user_post"); 5 | -------------------------------------------------------------------------------- /src/utils/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod captcha; 2 | pub mod webtoken; 3 | pub mod res; 4 | pub mod md5; 5 | pub mod redis; 6 | pub mod func; 7 | pub mod mysql; 8 | 9 | pub mod system; -------------------------------------------------------------------------------- /src/utils/md5.rs: -------------------------------------------------------------------------------- 1 | use md5::compute; 2 | 3 | #[allow(dead_code)] 4 | pub fn create_md5(dig:String)->String{ 5 | let digest = compute(dig); 6 | return format!("{:x}",digest) 7 | } -------------------------------------------------------------------------------- /ui/vite/plugins/setup-extend.js: -------------------------------------------------------------------------------- 1 | import setupExtend from 'vite-plugin-vue-setup-extend' 2 | 3 | export default function createSetupExtend() { 4 | return setupExtend() 5 | } 6 | -------------------------------------------------------------------------------- /ui/src/api/menu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取路由 4 | export const getRouters = () => { 5 | return request({ 6 | url: '/getRouters', 7 | method: 'get' 8 | }) 9 | } -------------------------------------------------------------------------------- /src/model/swagger_model.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | 3 | #[derive(Debug,Serialize,Deserialize)] 4 | pub struct SwaggerAuth{ 5 | pub username:String, 6 | pub password:String, 7 | } 8 | -------------------------------------------------------------------------------- /src/entity/sys_role_menu_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | 3 | #[derive(Debug,Serialize,Deserialize,Clone)] 4 | pub struct SysRoleMenuEntity{ 5 | pub role_id:i64, 6 | pub menu_id:i64, 7 | } -------------------------------------------------------------------------------- /ui/src/api/monitor/server.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取服务信息 4 | export function getServer() { 5 | return request({ 6 | url: '/monitor/server', 7 | method: 'get' 8 | }) 9 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/entity/sys_user_post_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | 3 | #[derive(Debug,Serialize,Deserialize,Clone)] 4 | pub struct SysUserPostEntity { 5 | pub user_id: i64, 6 | pub post_id: i64, 7 | } -------------------------------------------------------------------------------- /src/entity/sys_user_role_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | 3 | #[derive(Debug,Serialize,Deserialize,Clone)] 4 | pub struct SysUserRoleEntity { 5 | pub user_id: i64, 6 | pub role_id: i64, 7 | } -------------------------------------------------------------------------------- /ui/.env.staging: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VITE_APP_TITLE = 若依管理系统 3 | 4 | # 生产环境配置 5 | VITE_APP_ENV = 'staging' 6 | 7 | # 若依管理系统/生产环境 8 | VITE_APP_BASE_API = '/stage-api' 9 | 10 | # 是否在打包时开启压缩,支持 gzip 和 brotli 11 | VITE_BUILD_COMPRESS = gzip -------------------------------------------------------------------------------- /ui/.env.production: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VITE_APP_TITLE = 若依管理系统 3 | 4 | # 生产环境配置 5 | VITE_APP_ENV = 'production' 6 | 7 | # 若依管理系统/生产环境 8 | VITE_APP_BASE_API = '/prod-api' 9 | 10 | # 是否在打包时开启压缩,支持 gzip 和 brotli 11 | VITE_BUILD_COMPRESS = gzip -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/mysql.rs: -------------------------------------------------------------------------------- 1 | use crate::GLOBAL_DB; 2 | 3 | // 连接数据库 4 | pub async fn init_db() { 5 | GLOBAL_DB.link( 6 | rbdc_mysql::driver::MysqlDriver {}, 7 | "mysql://root:123456@localhost/ry-vue", 8 | ).await.expect("数据库连接失败"); 9 | } -------------------------------------------------------------------------------- /ui/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export { default as Settings } from './Settings' 4 | export { default as TagsView } from './TagsView/index.vue' 5 | -------------------------------------------------------------------------------- /src/mapper/captcha_mapper.rs: -------------------------------------------------------------------------------- 1 | use crate::entity::sys_captcha_entity::SysCaptcha; 2 | use rbatis::{crud,impl_select}; 3 | 4 | crud!(SysCaptcha{},"sys_captcha"); 5 | 6 | impl_select!(SysCaptcha{select_captcha_by_code(code:String)=>"`where code = #{code} limit 1`"}); -------------------------------------------------------------------------------- /src/service/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod user_service; 2 | pub mod role_service; 3 | pub mod menu_service; 4 | pub mod dict_service; 5 | pub mod dept_service; 6 | pub mod post_service; 7 | pub mod monitor_service; 8 | pub mod excel_service; 9 | pub mod notice_service; 10 | -------------------------------------------------------------------------------- /ui/src/components/IconSelect/requireIcons.js: -------------------------------------------------------------------------------- 1 | let icons = [] 2 | const modules = import.meta.glob('./../../assets/icons/svg/*.svg'); 3 | for (const path in modules) { 4 | const p = path.split('assets/icons/svg/')[1].split('.svg')[0]; 5 | icons.push(p); 6 | } 7 | 8 | export default icons -------------------------------------------------------------------------------- /src/router/monitor_router.rs: -------------------------------------------------------------------------------- 1 | use salvo::Router; 2 | use crate::controller::monitor_controller; 3 | 4 | pub fn init_router()->Router{ 5 | let router = Router::new(); 6 | router.push( 7 | Router::with_path("/monitor/server").get(monitor_controller::get_server_info) 8 | ) 9 | } -------------------------------------------------------------------------------- /ui/src/views/tool/build/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/entity/sys_captcha_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | use rbatis::rbdc::datetime::DateTime; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct SysCaptcha{ 6 | pub id:i64, 7 | pub code:String, 8 | pub create_time:DateTime, 9 | pub expire_time:i128, 10 | } -------------------------------------------------------------------------------- /ui/src/components/RuoYi/Doc/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /ui/src/views/tool/swagger/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/model/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod common_model; 2 | pub mod user_model; 3 | pub mod menu_model; 4 | pub mod dict_model; 5 | pub mod role_model; 6 | pub mod dept_model; 7 | pub mod post_model; 8 | pub mod chat_model; 9 | pub mod swagger_model; 10 | pub mod monitor_model; 11 | pub mod excel_model; 12 | pub mod notice_model; -------------------------------------------------------------------------------- /ui/src/components/RuoYi/Git/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /ui/vite/plugins/auto-import.js: -------------------------------------------------------------------------------- 1 | import autoImport from 'unplugin-auto-import/vite' 2 | 3 | export default function createAutoImport() { 4 | return autoImport({ 5 | imports: [ 6 | 'vue', 7 | 'vue-router', 8 | 'pinia' 9 | ], 10 | dts: false 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /ui/src/directive/index.js: -------------------------------------------------------------------------------- 1 | import hasRole from './permission/hasRole' 2 | import hasPermi from './permission/hasPermi' 3 | import copyText from './common/copyText' 4 | 5 | export default function directive(app){ 6 | app.directive('hasRole', hasRole) 7 | app.directive('hasPermi', hasPermi) 8 | app.directive('copyText', copyText) 9 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mapper/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod captcha_mapper; 2 | pub mod user_mapper; 3 | pub mod role_mapper; 4 | pub mod menu_mapper; 5 | pub mod dict_mapper; 6 | pub mod role_menu_mapper; 7 | pub mod dept_mapper; 8 | pub mod post_mapper; 9 | pub mod user_role_mapper; 10 | pub mod user_post_mapper; 11 | 12 | pub mod excel_mapper; 13 | pub mod notice_mapper; 14 | -------------------------------------------------------------------------------- /ui/src/views/monitor/druid/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /ui/src/components/SvgIcon/svgicon.js: -------------------------------------------------------------------------------- 1 | import * as components from '@element-plus/icons-vue' 2 | 3 | export default { 4 | install: (app) => { 5 | for (const key in components) { 6 | const componentConfig = components[key]; 7 | app.component(componentConfig.name, componentConfig); 8 | } 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'Admin-Token' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } 16 | -------------------------------------------------------------------------------- /ui/src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /src/model/chat_model.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize,Serialize}; 2 | use salvo::oapi::{ToSchema}; 3 | 4 | #[derive(Debug,Deserialize)] 5 | pub struct ChatRxMsg{ 6 | pub token:String, 7 | pub name:String, 8 | pub msg:String, 9 | } 10 | 11 | #[derive(Debug,Serialize,ToSchema)] 12 | pub struct ChatTxMsg{ 13 | pub name:String, 14 | pub msg:String, 15 | } 16 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/service/monitor_service.rs: -------------------------------------------------------------------------------- 1 | use crate::utils::system; 2 | use crate::model::monitor_model::ServerInfo; 3 | 4 | pub async fn get_sys_info()->Result{ 5 | Ok(ServerInfo{ 6 | cpu:system::get_cpu_info(), 7 | mem:system::get_mem_info(), 8 | sys:system::get_sys_info(), 9 | sys_files: system::get_disk_info(), 10 | }) 11 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/controller/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod common_controller; 2 | pub mod user_controller; 3 | pub mod dict_controller; 4 | pub mod menu_controller; 5 | pub mod role_controller; 6 | pub mod dept_controller; 7 | pub mod post_controller; 8 | pub mod chat_controller; 9 | pub mod swagger_controller; 10 | pub mod monitor_controller; 11 | 12 | pub mod excel_controller; 13 | pub mod notice_controller; -------------------------------------------------------------------------------- /src/model/common_model.rs: -------------------------------------------------------------------------------- 1 | use salvo::oapi::{ToSchema}; 2 | use serde::{Serialize}; 3 | 4 | #[derive(Debug,Serialize,ToSchema)] 5 | pub struct ResObj{ 6 | pub code:i32, 7 | pub data:Option, 8 | pub msg:String 9 | } 10 | 11 | #[derive(Debug,Serialize,ToSchema)] 12 | pub struct Page{ 13 | pub rows:Vec, 14 | pub total:u64, 15 | } -------------------------------------------------------------------------------- /ui/vite/plugins/svg-icon.js: -------------------------------------------------------------------------------- 1 | import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' 2 | import path from 'path' 3 | 4 | export default function createSvgIcon(isBuild) { 5 | return createSvgIconsPlugin({ 6 | iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')], 7 | symbolId: 'icon-[dir]-[name]', 8 | svgoOptions: isBuild 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | pnpm-lock.yaml 24 | yarn.lock 25 | -------------------------------------------------------------------------------- /src/entity/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod sys_user_entity; 2 | pub mod sys_captcha_entity; 3 | pub mod sys_role_entity; 4 | pub mod sys_menu_entity; 5 | pub mod sys_dict_data_entity; 6 | pub mod sys_dict_type_entity; 7 | pub mod sys_role_menu_entity; 8 | pub mod sys_dept_entity; 9 | pub mod sys_post_entity; 10 | pub mod sys_user_role_entity; 11 | pub mod sys_user_post_entity; 12 | pub mod excel_entity; 13 | pub mod sys_notice_entity; -------------------------------------------------------------------------------- /ui/src/api/monitor/online.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询在线用户列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/online/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 强退用户 13 | export function forceLogout(tokenId) { 14 | return request({ 15 | url: '/monitor/online/' + tokenId, 16 | method: 'delete' 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /src/entity/excel_entity.rs: -------------------------------------------------------------------------------- 1 | use rbatis::rbdc::datetime::DateTime; 2 | use serde::{Serialize, Deserialize}; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct ToolExcelEntity{ 6 | pub excel_id:Option, 7 | pub excel_name:Option, 8 | pub excel_data:Option, 9 | pub user_id:Option, 10 | pub create_time:Option, 11 | pub update_time:Option, 12 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sql/tool_excel.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `tool_excel` ( 2 | `excel_id` longtext COLLATE utf8_unicode_ci NOT NULL, 3 | `excel_name` text COLLATE utf8_unicode_ci NOT NULL, 4 | `excel_data` longtext COLLATE utf8_unicode_ci, 5 | `user_id` bigint(20) NOT NULL, 6 | `create_time` datetime DEFAULT NULL, 7 | `update_time` datetime DEFAULT NULL, 8 | PRIMARY KEY (`excel_id`(100)) USING BTREE 9 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='在线文档'; -------------------------------------------------------------------------------- /src/utils/captcha.rs: -------------------------------------------------------------------------------- 1 | use captcha::Captcha; 2 | use captcha::filters::Noise; 3 | 4 | #[allow(dead_code)] 5 | pub fn create_captcha()->(String,Option){ 6 | let mut captcha_obj = Captcha::new(); 7 | captcha_obj.add_chars(5) 8 | .apply_filter(Noise::new(0.1)) 9 | .view(300, 120); 10 | // .save(Path::new("static/captcha.png")) 11 | // .expect("save failed"); 12 | (captcha_obj.chars_as_string(),captcha_obj.as_base64()) 13 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/utils/dynamicTitle.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | import defaultSettings from '@/settings' 3 | import useSettingsStore from '@/store/modules/settings' 4 | 5 | /** 6 | * 动态修改标题 7 | */ 8 | export function useDynamicTitle() { 9 | const settingsStore = useSettingsStore(); 10 | if (settingsStore.dynamicTitle) { 11 | document.title = settingsStore.title + ' - ' + defaultSettings.title; 12 | } else { 13 | document.title = defaultSettings.title; 14 | } 15 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/controller/monitor_controller.rs: -------------------------------------------------------------------------------- 1 | use salvo::{oapi::endpoint}; 2 | use crate::utils::res::{ match_ok_common_result_no_error, Res, ResObj}; 3 | use crate::service::monitor_service; 4 | use crate::model::monitor_model::ServerInfo; 5 | 6 | #[endpoint( 7 | tags("系统"), 8 | responses( 9 | (status_code = 200,body=ResObj,description ="部门列表") 10 | ), 11 | )] 12 | pub async fn get_server_info()->Res{ 13 | match_ok_common_result_no_error(monitor_service::get_sys_info().await) 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/mapper/xml/role_menu_xml.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | `delete from sys_role_menu` 6 | 7 | `role_id in ( ${role_id} )` 8 | 9 | 10 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /ui/src/layout/components/InnerLink/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | -------------------------------------------------------------------------------- /ui/src/plugins/index.js: -------------------------------------------------------------------------------- 1 | import tab from './tab' 2 | import auth from './auth' 3 | import cache from './cache' 4 | import modal from './modal' 5 | import download from './download' 6 | 7 | export default function installPlugins(app){ 8 | // 页签操作 9 | app.config.globalProperties.$tab = tab 10 | // 认证对象 11 | app.config.globalProperties.$auth = auth 12 | // 缓存对象 13 | app.config.globalProperties.$cache = cache 14 | // 模态框对象 15 | app.config.globalProperties.$modal = modal 16 | // 下载文件 17 | app.config.globalProperties.$download = download 18 | } 19 | -------------------------------------------------------------------------------- /src/router/post_router.rs: -------------------------------------------------------------------------------- 1 | use salvo::Router; 2 | use crate::controller::post_controller; 3 | 4 | pub fn init_router() ->Router{ 5 | let router = Router::new(); 6 | router.push( 7 | Router::with_path("/system/post/list").get(post_controller::get_post_page) 8 | ).push( 9 | Router::with_path("/system/post").post(post_controller::post_add_post).put(post_controller::put_edit_post) 10 | ).push( 11 | Router::with_path("/system/post/").get(post_controller::get_post_by_id).delete(post_controller::del_post_by_id) 12 | ) 13 | } -------------------------------------------------------------------------------- /src/entity/sys_post_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | use rbatis::rbdc::datetime::DateTime; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct SysPostEntity{ 6 | pub post_id:Option, 7 | pub post_code:Option, 8 | pub post_name:Option, 9 | pub post_sort:Option, 10 | pub status:Option, 11 | pub create_by:Option, 12 | pub create_time:Option, 13 | pub update_by:Option, 14 | pub update_time:Option, 15 | pub remark:Option, 16 | } -------------------------------------------------------------------------------- /ui/src/components/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ui/src/api/monitor/operlog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询操作日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/operlog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除操作日志 13 | export function delOperlog(operId) { 14 | return request({ 15 | url: '/monitor/operlog/' + operId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空操作日志 21 | export function cleanOperlog() { 22 | return request({ 23 | url: '/monitor/operlog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/slider.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/api/monitor/jobLog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询调度日志列表 4 | export function listJobLog(query) { 5 | return request({ 6 | url: '/monitor/jobLog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除调度日志 13 | export function delJobLog(jobLogId) { 14 | return request({ 15 | url: '/monitor/jobLog/' + jobLogId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空调度日志 21 | export function cleanJobLog() { 22 | return request({ 23 | url: '/monitor/jobLog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /src/entity/sys_notice_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | use rbatis::rbdc::datetime::DateTime; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct SysNoticeEntity{ 6 | pub notice_id:Option, 7 | pub notice_title:Option, 8 | pub notice_type:Option, 9 | pub notice_content:Option, 10 | pub status:Option, 11 | pub create_by:Option, 12 | pub create_time:Option, 13 | pub update_by:Option, 14 | pub update_time:Option, 15 | pub remark:Option, 16 | } -------------------------------------------------------------------------------- /src/router/notice_router.rs: -------------------------------------------------------------------------------- 1 | use salvo::Router; 2 | use crate::controller::notice_controller; 3 | 4 | pub fn init_router() ->Router{ 5 | let router = Router::new(); 6 | router.push( 7 | Router::with_path("/system/notice/list").get(notice_controller::get_notice_page) 8 | ).push( 9 | Router::with_path("/system/notice").post(notice_controller::notice_add_notice).put(notice_controller::put_edit_notice) 10 | ).push( 11 | Router::with_path("/system/notice/").get(notice_controller::get_notice_by_id).delete(notice_controller::del_notice_by_id) 12 | ) 13 | } -------------------------------------------------------------------------------- /ui/vite/plugins/index.js: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue' 2 | 3 | import createAutoImport from './auto-import' 4 | import createSvgIcon from './svg-icon' 5 | import createCompression from './compression' 6 | import createSetupExtend from './setup-extend' 7 | 8 | export default function createVitePlugins(viteEnv, isBuild = false) { 9 | const vitePlugins = [vue()] 10 | vitePlugins.push(createAutoImport()) 11 | vitePlugins.push(createSetupExtend()) 12 | vitePlugins.push(createSvgIcon(isBuild)) 13 | isBuild && vitePlugins.push(...createCompression(viteEnv)) 14 | return vitePlugins 15 | } 16 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mapper/role_menu_mapper.rs: -------------------------------------------------------------------------------- 1 | use rbatis::{crud,html_sql}; 2 | use rbatis::executor::Executor; 3 | use rbatis::rbdc::db::ExecResult; 4 | use crate::entity::sys_role_menu_entity::SysRoleMenuEntity; 5 | 6 | #[html_sql("src/mapper/xml/role_menu_xml.html")] 7 | pub async fn del_role_menu_by_role_id(rb: &mut dyn Executor,role_id:String)->rbatis::Result{ 8 | impled!() 9 | } 10 | 11 | #[html_sql("src/mapper/xml/role_menu_xml.html")] 12 | pub async fn get_menu_id_by_role_id(rb: &mut dyn Executor,role_id:i32)->rbatis::Result>{ 13 | impled!() 14 | } 15 | 16 | crud!(SysRoleMenuEntity{},"sys_role_menu"); -------------------------------------------------------------------------------- /ui/src/layout/components/IframeToggle/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/education.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/router/dept_router.rs: -------------------------------------------------------------------------------- 1 | use salvo::Router; 2 | use crate::controller::{dept_controller}; 3 | 4 | pub fn init_router()->Router{ 5 | let router = Router::new(); 6 | router.push( 7 | Router::with_path("/system/dept/list").get(dept_controller::get_dept_list) 8 | ).push( 9 | Router::with_path("/system/dept").post(dept_controller::post_add_dept).put(dept_controller::put_edit_dept) 10 | ).push( 11 | Router::with_path("/system/dept/").get(dept_controller::get_dept_by_id).delete(dept_controller::del_dept_by_id) 12 | ).push( 13 | Router::with_path("/system/dept/list/exclude/").get(dept_controller::get_dept_list_exclude_id) 14 | ) 15 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/switch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/entity/sys_dept_entity.rs: -------------------------------------------------------------------------------- 1 | use rbatis::rbdc::datetime::DateTime; 2 | use serde::{Serialize, Deserialize}; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct SysDeptEntity{ 6 | pub dept_id:Option, 7 | pub parent_id:Option, 8 | pub ancestors:Option, 9 | pub dept_name:Option, 10 | pub order_num:Option, 11 | pub leader:Option, 12 | pub phone:Option, 13 | pub email:Option, 14 | pub status:Option, 15 | pub del_flag:Option, 16 | pub create_by:Option, 17 | pub create_time:Option, 18 | pub update_by:Option, 19 | pub update_time:Option, 20 | } -------------------------------------------------------------------------------- /src/utils/redis.rs: -------------------------------------------------------------------------------- 1 | use redis::{Client,Commands,ToRedisArgs,RedisResult,FromRedisValue}; 2 | use crate::GLOBAL_REDIS; 3 | 4 | #[allow(dead_code)] 5 | pub fn set_ex(key:K,value:V,second:usize)->RedisResult<()>{ 6 | let _:() = Client::set_ex(&mut GLOBAL_REDIS.clone(),key,value,second)?; 7 | Ok(()) 8 | } 9 | 10 | #[allow(dead_code)] 11 | pub fn get(key:K)->RedisResult{ 12 | let t:T = Client::get(&mut GLOBAL_REDIS.clone(),key)?; 13 | Ok(t) 14 | } 15 | 16 | #[allow(dead_code)] 17 | #[allow(unused_must_use)] 18 | pub fn del(key:K)->RedisResult<()>{ 19 | let _:() = Client::del(&mut GLOBAL_REDIS.clone(),key)?; 20 | Ok(()) 21 | } -------------------------------------------------------------------------------- /src/entity/sys_menu_entity.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize,Deserialize}; 2 | use rbatis::rbdc::datetime::DateTime; 3 | 4 | #[derive(Debug,Serialize,Deserialize,Clone)] 5 | pub struct SysMenu{ 6 | pub menu_id:i64, 7 | pub menu_name:String, 8 | pub parent_id:i64, 9 | pub order_num:i64, 10 | pub path:String, 11 | pub component:Option, 12 | pub query:Option, 13 | pub is_frame:i8, 14 | pub is_cache:i8, 15 | pub menu_type:String, 16 | pub visible:String, 17 | pub status:String, 18 | pub perms:Option, 19 | pub icon:String, 20 | pub create_by:String, 21 | pub create_time:DateTime, 22 | pub update_by:String, 23 | pub update_time:Option, 24 | pub remark:String, 25 | } -------------------------------------------------------------------------------- /ui/src/api/tool/excel.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 创建excel 4 | export function addExcel(data) { 5 | return request({ 6 | url: '/tool/excel/add', 7 | method: 'post', 8 | data 9 | }) 10 | } 11 | 12 | // 修改excel 13 | export function editExcel(data) { 14 | return request({ 15 | url: '/tool/excel/edit', 16 | method: 'post', 17 | data 18 | }) 19 | } 20 | 21 | // 获取excel列表 22 | export function getExcelList() { 23 | return request({ 24 | url: '/tool/excel/list', 25 | method: 'get' 26 | }) 27 | } 28 | 29 | // 获取excel列表 30 | export function getExcelById(excelIdd) { 31 | return request({ 32 | url: '/tool/excel/'+excelIdd, 33 | method: 'get' 34 | }) 35 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/druid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/router/excel_router.rs: -------------------------------------------------------------------------------- 1 | use salvo::Router; 2 | use crate::controller::excel_controller; 3 | 4 | pub fn init_router()->Router{ 5 | let router = Router::new(); 6 | router.push( 7 | Router::with_path("/tool/excel/add").post(excel_controller::post_add_excel) 8 | ).push( 9 | Router::with_path("/tool/excel/edit").post(excel_controller::post_edit_excel) 10 | ).push( 11 | Router::with_path("/tool/excel/user/list").get(excel_controller::get_excel_list_by_user_id) 12 | ).push( 13 | Router::with_path("/tool/excel/list").get(excel_controller::get_excel_list) 14 | ).push( 15 | Router::with_path("/tool/excel/").get(excel_controller::get_excel_detail_by_excel_id) 16 | ) 17 | } -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/input.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/server.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/directive/permission/hasRole.js: -------------------------------------------------------------------------------- 1 | /** 2 | * v-hasRole 角色权限处理 3 | * Copyright (c) 2019 ruoyi 4 | */ 5 | 6 | import useUserStore from '@/store/modules/user' 7 | 8 | export default { 9 | mounted(el, binding, vnode) { 10 | const { value } = binding 11 | const super_admin = "admin"; 12 | const roles = useUserStore().roles 13 | 14 | if (value && value instanceof Array && value.length > 0) { 15 | const roleFlag = value 16 | 17 | const hasRole = roles.some(role => { 18 | return super_admin === role || roleFlag.includes(role) 19 | }) 20 | 21 | if (!hasRole) { 22 | el.parentNode && el.parentNode.removeChild(el) 23 | } 24 | } else { 25 | throw new Error(`请设置角色权限标签值`) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ui/src/api/monitor/logininfor.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询登录日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/logininfor/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除登录日志 13 | export function delLogininfor(infoId) { 14 | return request({ 15 | url: '/monitor/logininfor/' + infoId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 解锁用户登录状态 21 | export function unlockLogininfor(userName) { 22 | return request({ 23 | url: '/monitor/logininfor/unlock/' + userName, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 清空登录日志 29 | export function cleanLogininfor() { 30 | return request({ 31 | url: '/monitor/logininfor/clean', 32 | method: 'delete' 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /src/mapper/excel_mapper.rs: -------------------------------------------------------------------------------- 1 | use rbatis::{crud,html_sql}; 2 | use rbatis::executor::Executor; 3 | use crate::entity::excel_entity::ToolExcelEntity; 4 | use crate::model::excel_model::{ExcelList,ExcelDetail}; 5 | 6 | #[html_sql("src/mapper/xml/excel_xml.html")] 7 | pub async fn get_excel_list_by_id(rb: &mut dyn Executor,user_id:i32)->rbatis::Result>{ 8 | impled!() 9 | } 10 | 11 | #[html_sql("src/mapper/xml/excel_xml.html")] 12 | pub async fn get_excel_list(rb: &mut dyn Executor)->rbatis::Result>{ 13 | impled!() 14 | } 15 | 16 | #[html_sql("src/mapper/xml/excel_xml.html")] 17 | pub async fn get_excel_detail_by_id(rb: &mut dyn Executor,excel_id:String)->rbatis::Result>{ 18 | impled!() 19 | } 20 | 21 | crud!(ToolExcelEntity{},"tool_excel"); -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/textarea.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/assets/icons/svg/time.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/src/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 41 | -------------------------------------------------------------------------------- /ui/src/components/iFrame/index.vue: -------------------------------------------------------------------------------- 1 |