From 8eb583397d28585ad44969c06cb7de74c9d8224d Mon Sep 17 00:00:00 2001 From: xiangheng <11675084@qq.com> Date: Fri, 24 Nov 2023 16:46:30 +0800 Subject: [PATCH] init --- .gitignore | 22 + LICENSE | 21 + README.md | 54 ++ admin/.editorconfig | 14 + admin/.env.development.example | 4 + admin/.env.production.example | 4 + admin/.eslintrc.cjs | 43 + admin/.gitignore | 36 + admin/.prettierrc | 11 + admin/.vscode/extensions.json | 3 + admin/.vscode/settings.json | 11 + admin/README.md | 46 + admin/global.d.ts | 1 + admin/index.html | 66 ++ admin/package.json | 63 ++ admin/postcss.config.js | 6 + admin/scripts/build.mjs | 37 + admin/src/App.vue | 59 ++ admin/src/api/app.ts | 11 + admin/src/api/article.ts | 69 ++ admin/src/api/article_collect.ts | 26 + admin/src/api/channel/h5.ts | 11 + admin/src/api/channel/weapp.ts | 11 + admin/src/api/channel/wx_dev.ts | 11 + admin/src/api/channel/wx_oa.ts | 112 +++ admin/src/api/consumer.ts | 16 + admin/src/api/decoration.ts | 26 + admin/src/api/file.ts | 39 + admin/src/api/message.ts | 31 + admin/src/api/org/department.ts | 26 + admin/src/api/org/post.ts | 30 + admin/src/api/perms/admin.ts | 31 + admin/src/api/perms/menu.ts | 26 + admin/src/api/perms/role.ts | 29 + admin/src/api/setting/dict.ts | 61 ++ admin/src/api/setting/search.ts | 27 + admin/src/api/setting/storage.ts | 21 + admin/src/api/setting/system.ts | 16 + admin/src/api/setting/user.ts | 42 + admin/src/api/setting/website.ts | 27 + admin/src/api/tools/code.ts | 66 ++ admin/src/api/user.ts | 27 + admin/src/assets/icons/Androidfanhui.svg | 1 + admin/src/assets/icons/KMSguanli.svg | 1 + admin/src/assets/icons/KTVyuding.svg | 1 + admin/src/assets/icons/a-tixingdengpao.svg | 1 + admin/src/assets/icons/anquan.svg | 1 + admin/src/assets/icons/anquan_mian.svg | 1 + admin/src/assets/icons/anquan_mian1.svg | 1 + admin/src/assets/icons/banxing_mian.svg | 1 + admin/src/assets/icons/baoxian.svg | 1 + admin/src/assets/icons/bendishenghuodaxue.svg | 1 + admin/src/assets/icons/bianji.svg | 1 + admin/src/assets/icons/biaoqing.svg | 1 + admin/src/assets/icons/bukejian.svg | 1 + admin/src/assets/icons/caipinguanli.svg | 1 + admin/src/assets/icons/caiwu.svg | 1 + admin/src/assets/icons/caiwu_jifen.svg | 1 + admin/src/assets/icons/caiwu_tixian.svg | 1 + admin/src/assets/icons/canyinfuwu.svg | 1 + admin/src/assets/icons/carryout.svg | 1 + admin/src/assets/icons/chexiao.svg | 1 + admin/src/assets/icons/chihuohongbao.svg | 1 + admin/src/assets/icons/chuangyiwuliao.svg | 1 + admin/src/assets/icons/close.svg | 1 + admin/src/assets/icons/daiyunying.svg | 1 + admin/src/assets/icons/danwei.svg | 1 + admin/src/assets/icons/danxuankuang.svg | 1 + admin/src/assets/icons/danxuanxuanzhong.svg | 1 + admin/src/assets/icons/dayin.svg | 1 + admin/src/assets/icons/dayin_mian.svg | 1 + admin/src/assets/icons/del.svg | 1 + admin/src/assets/icons/diancanshezhi.svg | 1 + admin/src/assets/icons/dianhua.svg | 1 + admin/src/assets/icons/dianhua_mian.svg | 1 + admin/src/assets/icons/dianpu_fengge.svg | 1 + admin/src/assets/icons/dianputuijian.svg | 1 + admin/src/assets/icons/dianzifapiao.svg | 1 + admin/src/assets/icons/dingcan.svg | 1 + admin/src/assets/icons/dingdan.svg | 1 + admin/src/assets/icons/dingdan1.svg | 1 + admin/src/assets/icons/dingdan_mian.svg | 1 + admin/src/assets/icons/dingwei.svg | 1 + admin/src/assets/icons/dingwei_mian.svg | 1 + admin/src/assets/icons/ditu.svg | 1 + admin/src/assets/icons/ditu_mian.svg | 1 + admin/src/assets/icons/duizhang.svg | 1 + admin/src/assets/icons/elemo.svg | 1 + admin/src/assets/icons/ezhanggui.svg | 1 + admin/src/assets/icons/falvfuwubaoxiaohei.svg | 1 + admin/src/assets/icons/fengniaopaotui.svg | 1 + admin/src/assets/icons/fenxiang.svg | 1 + admin/src/assets/icons/fukuan.svg | 1 + admin/src/assets/icons/fukuan_mian.svg | 1 + admin/src/assets/icons/fullscreen-exit.svg | 1 + admin/src/assets/icons/fullscreen.svg | 1 + admin/src/assets/icons/fuwushichang.svg | 1 + admin/src/assets/icons/fuzhi.svg | 1 + admin/src/assets/icons/gaode.svg | 1 + admin/src/assets/icons/gengduo.svg | 1 + admin/src/assets/icons/gengduoandroid.svg | 1 + admin/src/assets/icons/gift.svg | 1 + admin/src/assets/icons/gongyingshang.svg | 1 + admin/src/assets/icons/goods.svg | 1 + admin/src/assets/icons/gou.svg | 1 + admin/src/assets/icons/gouwuche.svg | 1 + admin/src/assets/icons/gouxuan.svg | 1 + admin/src/assets/icons/gouxuan_mian.svg | 1 + admin/src/assets/icons/guanbi.svg | 1 + admin/src/assets/icons/guanli.svg | 1 + admin/src/assets/icons/guanli_mian.svg | 1 + admin/src/assets/icons/gukefapiao.svg | 1 + admin/src/assets/icons/haibaosheji.svg | 1 + admin/src/assets/icons/heshoujilu.svg | 1 + admin/src/assets/icons/heshoujilu1.svg | 1 + admin/src/assets/icons/hexiao_order.svg | 1 + admin/src/assets/icons/hide-2.svg | 1 + admin/src/assets/icons/hide.svg | 1 + admin/src/assets/icons/hongbao.svg | 1 + admin/src/assets/icons/huiche.svg | 1 + admin/src/assets/icons/huiyuanyingxiao.svg | 1 + admin/src/assets/icons/huodongbaoming.svg | 1 + admin/src/assets/icons/huodongguanli.svg | 1 + admin/src/assets/icons/huodongzhongxin.svg | 1 + admin/src/assets/icons/huojian.svg | 1 + admin/src/assets/icons/huojian_mian.svg | 1 + admin/src/assets/icons/huolala.svg | 1 + admin/src/assets/icons/iOSfanhui.svg | 1 + admin/src/assets/icons/jia.svg | 1 + admin/src/assets/icons/jia_mian.svg | 1 + admin/src/assets/icons/jian.svg | 1 + admin/src/assets/icons/jian_mian.svg | 1 + admin/src/assets/icons/jianpan.svg | 1 + admin/src/assets/icons/jianpanshanchu.svg | 1 + admin/src/assets/icons/jianshao.svg | 1 + admin/src/assets/icons/jiaopeiwangputong.svg | 1 + admin/src/assets/icons/jiaoyi.svg | 1 + admin/src/assets/icons/jiedan.svg | 1 + admin/src/assets/icons/jiekuan.svg | 1 + admin/src/assets/icons/jingshi.svg | 1 + admin/src/assets/icons/jingshi_mian.svg | 1 + admin/src/assets/icons/jingshi_mian1.svg | 1 + admin/src/assets/icons/jingyin.svg | 1 + admin/src/assets/icons/jingyin_mian.svg | 1 + admin/src/assets/icons/jingying.svg | 1 + admin/src/assets/icons/jingying_mian.svg | 1 + admin/src/assets/icons/jingyinggonglve.svg | 1 + admin/src/assets/icons/jingzhunyingxiao.svg | 1 + admin/src/assets/icons/jinhuo.svg | 1 + admin/src/assets/icons/kaitongwaimai.svg | 1 + admin/src/assets/icons/kanjia.svg | 1 + admin/src/assets/icons/kefu.svg | 1 + admin/src/assets/icons/kejian.svg | 1 + admin/src/assets/icons/kejian_mian.svg | 1 + admin/src/assets/icons/keziyuyue.svg | 1 + admin/src/assets/icons/kezizhongxin.svg | 1 + admin/src/assets/icons/koubei.svg | 1 + admin/src/assets/icons/kuaijiehuifu.svg | 1 + admin/src/assets/icons/ladu_mian.svg | 1 + admin/src/assets/icons/lanyadingwei.svg | 1 + admin/src/assets/icons/list-2.svg | 1 + admin/src/assets/icons/mendiandongtai.svg | 1 + admin/src/assets/icons/mishiyuding.svg | 1 + admin/src/assets/icons/mishiyuding1.svg | 1 + admin/src/assets/icons/notice_buyer.svg | 1 + admin/src/assets/icons/open.svg | 1 + admin/src/assets/icons/paiduiquhao.svg | 1 + admin/src/assets/icons/paimai.svg | 1 + admin/src/assets/icons/pingjia.svg | 1 + admin/src/assets/icons/pingtaifapiao.svg | 1 + admin/src/assets/icons/pinpai.svg | 1 + admin/src/assets/icons/qianbao.svg | 1 + admin/src/assets/icons/qianbao_mian.svg | 1 + admin/src/assets/icons/qiehuan.svg | 1 + admin/src/assets/icons/qingchu.svg | 1 + admin/src/assets/icons/qingchu_mian.svg | 1 + admin/src/assets/icons/qishoupeisong.svg | 1 + admin/src/assets/icons/qiyedingcan.svg | 1 + admin/src/assets/icons/qiyedingcan1.svg | 1 + admin/src/assets/icons/quanbu.svg | 1 + admin/src/assets/icons/quanping.svg | 1 + admin/src/assets/icons/qudao.svg | 1 + admin/src/assets/icons/qudao_xiaochengxu.svg | 1 + admin/src/assets/icons/rencaizhaopin.svg | 1 + admin/src/assets/icons/rili.svg | 1 + admin/src/assets/icons/rili2.svg | 1 + admin/src/assets/icons/rizhi.svg | 1 + admin/src/assets/icons/saoma.svg | 1 + admin/src/assets/icons/set_pay.svg | 1 + admin/src/assets/icons/set_peisong.svg | 1 + admin/src/assets/icons/set_user.svg | 1 + admin/src/assets/icons/set_weihu.svg | 1 + admin/src/assets/icons/shanchu.svg | 1 + admin/src/assets/icons/shanchu_mian.svg | 1 + admin/src/assets/icons/shangchuan.svg | 1 + admin/src/assets/icons/shangchuanzhaopian.svg | 1 + admin/src/assets/icons/shangpinguanli.svg | 1 + admin/src/assets/icons/shangpinzhushou.svg | 1 + admin/src/assets/icons/shangpuyuding.svg | 1 + admin/src/assets/icons/shebeiguanli.svg | 1 + admin/src/assets/icons/shengfuwangputong.svg | 1 + admin/src/assets/icons/shengyin.svg | 1 + admin/src/assets/icons/shengyin_mian.svg | 1 + admin/src/assets/icons/shezhi.svg | 1 + admin/src/assets/icons/shezhi_mian.svg | 1 + admin/src/assets/icons/shichang.svg | 1 + admin/src/assets/icons/shichang_mian.svg | 1 + admin/src/assets/icons/shijian.svg | 1 + admin/src/assets/icons/shijian_mian.svg | 1 + admin/src/assets/icons/shoudan.svg | 1 + admin/src/assets/icons/shouqi.svg | 1 + admin/src/assets/icons/shouqi_mian.svg | 1 + admin/src/assets/icons/shouye.svg | 1 + admin/src/assets/icons/shouye_mian.svg | 1 + admin/src/assets/icons/shouyiren.svg | 1 + admin/src/assets/icons/show.svg | 1 + .../assets/icons/shuangjiantouxiangyou.svg | 1 + .../assets/icons/shuangjiantouxiangzuo.svg | 1 + admin/src/assets/icons/shuaxin.svg | 1 + admin/src/assets/icons/shuju.svg | 1 + admin/src/assets/icons/shuju2.svg | 1 + admin/src/assets/icons/shuju_liuliang.svg | 1 + admin/src/assets/icons/shuju_mian.svg | 1 + admin/src/assets/icons/sort.svg | 1 + admin/src/assets/icons/sousuo.svg | 1 + admin/src/assets/icons/sucai.svg | 1 + admin/src/assets/icons/tianjia.svg | 1 + admin/src/assets/icons/tishi.svg | 1 + admin/src/assets/icons/tishi_mian.svg | 1 + admin/src/assets/icons/tongxunlu_mian.svg | 1 + admin/src/assets/icons/tongzhi.svg | 1 + admin/src/assets/icons/tongzhi_mian.svg | 1 + admin/src/assets/icons/tuichuquanping.svg | 1 + admin/src/assets/icons/tuiguang.svg | 1 + admin/src/assets/icons/tuiguang_mian.svg | 1 + admin/src/assets/icons/tupian.svg | 1 + admin/src/assets/icons/tupian_mian.svg | 1 + admin/src/assets/icons/user_biaoqian.svg | 1 + admin/src/assets/icons/user_gaikuang.svg | 1 + admin/src/assets/icons/user_guanli.svg | 1 + admin/src/assets/icons/wangpudiandan.svg | 1 + admin/src/assets/icons/weixin.svg | 1 + admin/src/assets/icons/weixin_mian.svg | 1 + admin/src/assets/icons/wode.svg | 1 + admin/src/assets/icons/wode_mian.svg | 1 + admin/src/assets/icons/xiangji.svg | 1 + admin/src/assets/icons/xiaoxi.svg | 1 + admin/src/assets/icons/xiazai.svg | 1 + admin/src/assets/icons/xitongquanxian.svg | 1 + admin/src/assets/icons/yingxiao_qipao.svg | 1 + admin/src/assets/icons/yingyezizhi.svg | 1 + admin/src/assets/icons/yinhangka.svg | 1 + admin/src/assets/icons/yiwen.svg | 1 + admin/src/assets/icons/youhui.svg | 1 + admin/src/assets/icons/youjian.svg | 1 + admin/src/assets/icons/youjiantou.svg | 1 + admin/src/assets/icons/yulibao.svg | 1 + admin/src/assets/icons/yuyin.svg | 1 + admin/src/assets/icons/yuyueguanli.svg | 1 + admin/src/assets/icons/yuyueguanlishezhi.svg | 1 + admin/src/assets/icons/zhankai.svg | 1 + admin/src/assets/icons/zhankai_mian.svg | 1 + admin/src/assets/icons/zhibo.svg | 1 + admin/src/assets/icons/zhibo_mian.svg | 1 + admin/src/assets/icons/zhuangxiu.svg | 1 + admin/src/assets/icons/zhuangxiu_mian.svg | 1 + admin/src/assets/icons/zhuoweiguanli.svg | 1 + admin/src/assets/icons/zichanzhuanrang.svg | 1 + admin/src/assets/icons/zuliao.svg | 1 + admin/src/assets/icons/zuliaoyuding.svg | 1 + admin/src/assets/images/icon_folder.png | Bin 0 -> 605 bytes admin/src/assets/images/no_perms.png | Bin 0 -> 14619 bytes admin/src/assets/images/theme_black.png | Bin 0 -> 2564 bytes admin/src/assets/images/theme_white.png | Bin 0 -> 2559 bytes admin/src/components/app-link/index.vue | 38 + admin/src/components/color-picker/index.vue | 33 + .../src/components/daterange-picker/index.vue | 44 + admin/src/components/del-wrap/index.vue | 51 ++ admin/src/components/dict-value/index.vue | 30 + admin/src/components/editor/index.vue | 143 +++ admin/src/components/footer-btns/index.vue | 30 + admin/src/components/icon/index.ts | 19 + admin/src/components/icon/index.vue | 49 ++ admin/src/components/icon/picker.vue | 185 ++++ admin/src/components/icon/svg-icon.vue | 38 + admin/src/components/image-contain/index.vue | 46 + admin/src/components/link/custom-link.vue | 42 + admin/src/components/link/index.ts | 11 + admin/src/components/link/index.vue | 96 ++ admin/src/components/link/picker.vue | 84 ++ admin/src/components/link/shop-pages.vue | 101 +++ admin/src/components/material/file.vue | 55 ++ admin/src/components/material/hook.ts | 208 +++++ admin/src/components/material/index.vue | 584 +++++++++++++ admin/src/components/material/picker.vue | 303 +++++++ admin/src/components/material/preview.vue | 72 ++ .../src/components/overflow-tooltip/index.vue | 47 + admin/src/components/pagination/index.vue | 50 ++ admin/src/components/popover-input/index.vue | 130 +++ admin/src/components/popup/index.vue | 133 +++ admin/src/components/upload/index.vue | 148 ++++ admin/src/components/video-player/index.vue | 72 ++ admin/src/config/index.ts | 10 + admin/src/config/setting.ts | 18 + admin/src/enums/appEnums.ts | 40 + admin/src/enums/cacheEnums.ts | 8 + admin/src/enums/pageEnum.ts | 9 + admin/src/enums/requestEnums.ts | 28 + admin/src/hooks/useDictOptions.ts | 69 ++ admin/src/hooks/useLockFn.ts | 21 + admin/src/hooks/useMultipleTabs.ts | 47 + admin/src/hooks/usePaging.ts | 62 ++ admin/src/hooks/useWatchRoute.ts | 17 + admin/src/install/directives/copy.ts | 28 + admin/src/install/directives/perms.ts | 28 + admin/src/install/index.ts | 27 + admin/src/install/plugins/element.ts | 11 + admin/src/install/plugins/pinia.ts | 6 + admin/src/install/plugins/router.ts | 6 + admin/src/layout/Empty.vue | 20 + admin/src/layout/components/footer.vue | 22 + .../default/components/header/breadcrumb.vue | 20 + .../layout/default/components/header/fold.vue | 15 + .../default/components/header/full-screen.vue | 10 + .../default/components/header/index.vue | 55 ++ .../components/header/multiple-tabs.vue | 122 +++ .../default/components/header/refresh.vue | 14 + .../components/header/user-drop-down.vue | 34 + admin/src/layout/default/components/main.vue | 26 + .../default/components/setting/drawer.vue | 220 +++++ .../default/components/setting/index.vue | 19 + .../default/components/sidebar/index.vue | 44 + .../default/components/sidebar/logo.vue | 61 ++ .../default/components/sidebar/menu-item.vue | 87 ++ .../default/components/sidebar/menu.vue | 101 +++ .../default/components/sidebar/side.vue | 66 ++ admin/src/layout/default/index.vue | 22 + admin/src/main.ts | 10 + admin/src/permission.ts | 84 ++ admin/src/router/index.ts | 110 +++ admin/src/router/routes.ts | 59 ++ admin/src/stores/index.ts | 3 + admin/src/stores/modules/app.ts | 51 ++ admin/src/stores/modules/multipleTabs.ts | 169 ++++ admin/src/stores/modules/setting.ts | 55 ++ admin/src/stores/modules/user.ts | 96 ++ admin/src/styles/dark.css | 49 ++ admin/src/styles/element.scss | 145 +++ admin/src/styles/index.scss | 6 + admin/src/styles/public.scss | 18 + admin/src/styles/tailwind.css | 3 + admin/src/styles/var.css | 48 + admin/src/utils/auth.ts | 18 + admin/src/utils/cache.ts | 50 ++ admin/src/utils/echart.ts | 65 ++ admin/src/utils/env.ts | 13 + admin/src/utils/feedback.ts | 95 ++ admin/src/utils/file.ts | 16 + admin/src/utils/request/axios.ts | 165 ++++ admin/src/utils/request/cancel.ts | 31 + admin/src/utils/request/index.ts | 130 +++ admin/src/utils/request/type.d.ts | 38 + admin/src/utils/theme.ts | 74 ++ admin/src/utils/util.ts | 171 ++++ admin/src/utils/validate.ts | 7 + admin/src/views/account/images/login_bg.png | Bin 0 -> 59273 bytes admin/src/views/account/login.vue | 130 +++ admin/src/views/article/column/edit.vue | 95 ++ admin/src/views/article/column/index.vue | 114 +++ admin/src/views/article/lists/edit.vue | 175 ++++ admin/src/views/article/lists/index.vue | 168 ++++ admin/src/views/article_collect/edit.vue | 116 +++ admin/src/views/article_collect/index.vue | 108 +++ admin/src/views/channel/h5.vue | 61 ++ admin/src/views/channel/weapp.vue | 177 ++++ admin/src/views/channel/wx_dev.vue | 62 ++ admin/src/views/channel/wx_oa/config.vue | 195 +++++ admin/src/views/channel/wx_oa/menu.vue | 45 + .../views/channel/wx_oa/menu_com/oa-attr.vue | 85 ++ .../wx_oa/menu_com/oa-menu-form-edit.vue | 73 ++ .../channel/wx_oa/menu_com/oa-menu-form.vue | 107 +++ .../views/channel/wx_oa/menu_com/oa-phone.vue | 121 +++ .../views/channel/wx_oa/menu_com/useMenuOa.ts | 164 ++++ .../channel/wx_oa/reply/default_reply.vue | 128 +++ admin/src/views/channel/wx_oa/reply/edit.vue | 189 ++++ .../channel/wx_oa/reply/follow_reply.vue | 129 +++ .../channel/wx_oa/reply/keyword_reply.vue | 145 +++ admin/src/views/consumer/lists/detail.vue | 134 +++ admin/src/views/consumer/lists/index.vue | 94 ++ .../views/decoration/component/add-nav.vue | 79 ++ .../decoration/component/decoration-img.vue | 59 ++ .../component/pages/attr-setting.vue | 28 + .../views/decoration/component/pages/menu.vue | 44 + .../decoration/component/pages/preview.vue | 67 ++ .../component/widgets/banner/attr.vue | 79 ++ .../component/widgets/banner/content.vue | 33 + .../component/widgets/banner/index.ts | 8 + .../component/widgets/banner/options.ts | 15 + .../widgets/customer-service/attr.vue | 38 + .../widgets/customer-service/content.vue | 39 + .../widgets/customer-service/index.ts | 8 + .../widgets/customer-service/options.ts | 11 + .../decoration/component/widgets/index.ts | 14 + .../component/widgets/my-service/attr.vue | 38 + .../component/widgets/my-service/content.vue | 59 ++ .../component/widgets/my-service/index.ts | 8 + .../component/widgets/my-service/options.ts | 16 + .../decoration/component/widgets/nav/attr.vue | 36 + .../component/widgets/nav/content.vue | 32 + .../decoration/component/widgets/nav/index.ts | 8 + .../component/widgets/nav/options.ts | 15 + .../component/widgets/news/attr.vue | 20 + .../component/widgets/news/content.vue | 70 ++ .../component/widgets/news/index.ts | 8 + .../component/widgets/news/options.ts | 7 + .../component/widgets/search/attr.vue | 20 + .../component/widgets/search/content.vue | 23 + .../component/widgets/search/index.ts | 8 + .../component/widgets/search/options.ts | 7 + .../component/widgets/user-banner/attr.vue | 79 ++ .../component/widgets/user-banner/content.vue | 32 + .../component/widgets/user-banner/index.ts | 8 + .../component/widgets/user-banner/options.ts | 15 + .../component/widgets/user-info/attr.vue | 20 + .../component/widgets/user-info/content.vue | 16 + .../user-info/images/default_avatar.png | Bin 0 -> 6093 bytes .../widgets/user-info/images/my_topbg.png | Bin 0 -> 142469 bytes .../component/widgets/user-info/index.ts | 8 + .../component/widgets/user-info/options.ts | 7 + admin/src/views/decoration/pages/index.vue | 105 +++ admin/src/views/decoration/tabbar.vue | 221 +++++ admin/src/views/dev_tools/code/edit.vue | 388 ++++++++ admin/src/views/dev_tools/code/index.vue | 246 ++++++ .../dev_tools/components/code-preview.vue | 73 ++ .../views/dev_tools/components/data-table.vue | 102 +++ admin/src/views/error/403.vue | 15 + admin/src/views/error/404.vue | 9 + admin/src/views/error/components/error.vue | 57 ++ admin/src/views/material/index.vue | 62 ++ admin/src/views/message/notice/edit.vue | 122 +++ admin/src/views/message/notice/index.vue | 95 ++ admin/src/views/message/short_letter/edit.vue | 130 +++ .../src/views/message/short_letter/index.vue | 56 ++ .../views/organization/department/edit.vue | 182 ++++ .../views/organization/department/index.vue | 166 ++++ admin/src/views/organization/post/edit.vue | 127 +++ admin/src/views/organization/post/index.vue | 128 +++ admin/src/views/permission/admin/edit.vue | 289 ++++++ admin/src/views/permission/admin/index.vue | 181 ++++ admin/src/views/permission/menu/edit.vue | 315 +++++++ admin/src/views/permission/menu/index.vue | 157 ++++ admin/src/views/permission/role/auth.vue | 154 ++++ admin/src/views/permission/role/edit.vue | 114 +++ admin/src/views/permission/role/index.vue | 108 +++ admin/src/views/setting/dict/data/edit.vue | 129 +++ admin/src/views/setting/dict/data/index.vue | 144 +++ admin/src/views/setting/dict/type/edit.vue | 111 +++ admin/src/views/setting/dict/type/index.vue | 135 +++ admin/src/views/setting/search/index.vue | 180 ++++ admin/src/views/setting/storage/edit.vue | 196 +++++ admin/src/views/setting/storage/index.vue | 53 ++ admin/src/views/setting/system/cache.vue | 261 ++++++ .../src/views/setting/system/environment.vue | 148 ++++ admin/src/views/setting/system/journal.vue | 128 +++ .../src/views/setting/user/login_register.vue | 180 ++++ admin/src/views/setting/user/setup.vue | 65 ++ admin/src/views/setting/website/filing.vue | 93 ++ .../src/views/setting/website/information.vue | 150 ++++ admin/src/views/setting/website/protocol.vue | 58 ++ admin/src/views/user/setting.vue | 162 ++++ .../workbench/image/customer_service.png | Bin 0 -> 85609 bytes .../src/views/workbench/image/menu_admin.png | Bin 0 -> 3197 bytes admin/src/views/workbench/image/menu_auth.png | Bin 0 -> 2969 bytes admin/src/views/workbench/image/menu_dept.png | Bin 0 -> 3047 bytes admin/src/views/workbench/image/menu_dict.png | Bin 0 -> 2162 bytes admin/src/views/workbench/image/menu_file.png | Bin 0 -> 2672 bytes .../views/workbench/image/menu_generator.png | Bin 0 -> 3264 bytes admin/src/views/workbench/image/menu_role.png | Bin 0 -> 4173 bytes admin/src/views/workbench/image/menu_web.png | Bin 0 -> 2156 bytes admin/src/views/workbench/image/qq_group.png | Bin 0 -> 33733 bytes admin/src/views/workbench/index.vue | 264 ++++++ admin/tailwind.config.js | 119 +++ admin/tsconfig.json | 19 + admin/typings/index.d.ts | 3 + admin/typings/router.d.ts | 14 + admin/vite.config.ts | 59 ++ docs/1.go-打包.md | 13 + docs/2.go-运行.md | 34 + docs/3.go-nginx配置.md | 27 + docs/assets/genCode.png | Bin 0 -> 300676 bytes docs/assets/work.png | Bin 0 -> 339639 bytes server.code-workspace | 14 + server/.env.example | 15 + server/.gitignore | 60 ++ server/.goreleaser.yaml | 46 + server/.vscode/launch.json | 15 + server/.vscode/settings.json | 10 + .../article_collect/article_collect_ctl.go | 64 ++ .../article_collect/article_collect_schema.go | 41 + .../article_collect_service.go | 122 +++ server/admin/article_collect_route.go | 26 + server/admin/common/album/route.go | 116 +++ server/admin/common/album/schema.go | 103 +++ server/admin/common/album/service.go | 225 +++++ server/admin/common/index/index.go | 41 + server/admin/common/index/service.go | 101 +++ server/admin/common/upload/service.go | 53 ++ server/admin/common/upload/upload.go | 60 ++ server/admin/entry.go | 47 + server/admin/monitor/monitor.go | 48 + server/admin/setting/copyright/copyright.go | 38 + server/admin/setting/copyright/schema.go | 7 + server/admin/setting/copyright/service.go | 44 + server/admin/setting/dict_data/dict_data.go | 96 ++ server/admin/setting/dict_data/schema.go | 55 ++ server/admin/setting/dict_data/service.go | 153 ++++ server/admin/setting/dict_type/dict_type.go | 92 ++ server/admin/setting/dict_type/schema.go | 48 + server/admin/setting/dict_type/service.go | 133 +++ server/admin/setting/protocol/protocol.go | 45 + server/admin/setting/protocol/schema.go | 13 + server/admin/setting/protocol/service.go | 67 ++ server/admin/setting/storage/schema.go | 23 + server/admin/setting/storage/service.go | 103 +++ server/admin/setting/storage/storage.go | 66 ++ server/admin/setting/website/schema.go | 11 + server/admin/setting/website/service.go | 66 ++ server/admin/setting/website/website.go | 45 + server/admin/system/admin/admin.go | 114 +++ server/admin/system/admin/schema.go | 102 +++ server/admin/system/admin/service.go | 407 +++++++++ server/admin/system/dept/dept.go | 86 ++ server/admin/system/dept/schema.go | 53 ++ server/admin/system/dept/service.go | 151 ++++ server/admin/system/enter.go | 51 ++ server/admin/system/log/log.go | 59 ++ server/admin/system/log/schema.go | 54 ++ server/admin/system/log/service.go | 122 +++ server/admin/system/login/login.go | 49 ++ server/admin/system/login/schema.go | 39 + server/admin/system/login/service.go | 148 ++++ server/admin/system/menu/menu.go | 88 ++ server/admin/system/menu/schema.go | 69 ++ server/admin/system/menu/service.go | 141 +++ server/admin/system/post/post.go | 92 ++ server/admin/system/post/schema.go | 51 ++ server/admin/system/post/service.go | 157 ++++ server/admin/system/role/authPermService.go | 116 +++ server/admin/system/role/role.go | 86 ++ server/admin/system/role/schema.go | 55 ++ server/admin/system/role/service.go | 186 ++++ server/config/admin.go | 96 ++ server/config/config.go | 122 +++ server/config/gen.go | 17 + server/core/db.go | 76 ++ server/core/logger.go | 21 + server/core/redis.go | 29 + server/core/request/common.go | 7 + server/core/response/common.go | 9 + server/core/response/error.go | 15 + server/core/response/response.go | 208 +++++ server/core/time.go | 53 ++ server/core/uaparser.go | 5 + server/generator/enter.go | 11 + server/generator/gen/gen.go | 161 ++++ server/generator/gen/schema.go | 179 ++++ server/generator/gen/service.go | 448 ++++++++++ .../templates/gocode/controller.go copy.tpl | 82 ++ .../templates/gocode/controller.go.tpl | 64 ++ .../generator/templates/gocode/model.go.tpl | 10 + .../generator/templates/gocode/route.go.tpl | 25 + .../generator/templates/gocode/schema.go.tpl | 57 ++ .../generator/templates/gocode/service.go.tpl | 141 +++ server/generator/templates/vue/api.ts.tpl | 26 + server/generator/templates/vue/edit.vue.tpl | 252 ++++++ .../templates/vue/index-tree.vue.tpl | 222 +++++ server/generator/templates/vue/index.vue.tpl | 183 ++++ server/generator/tpl_utils/constants.go | 93 ++ server/generator/tpl_utils/tpl.go | 279 ++++++ server/generator/tpl_utils/utils.go | 214 +++++ server/go.mod | 74 ++ server/go.sum | 647 ++++++++++++++ server/main.go | 69 ++ server/middleware/auth.go | 149 ++++ server/middleware/cors.go | 17 + server/middleware/error.go | 37 + server/middleware/log.go | 129 +++ server/middleware/show.go | 24 + server/model/article_collect.go | 12 + server/model/common/album.go | 30 + server/model/gen/gen.go | 48 + server/model/setting/dict_data.go | 16 + server/model/setting/dict_type.go | 14 + server/model/system/system.go | 130 +++ server/plugin/storage.go | 134 +++ server/routers/enter.go | 13 + server/static/backend_avatar.png | Bin 0 -> 158102 bytes server/static/backend_backdrop.png | Bin 0 -> 85612 bytes server/static/backend_favicon.ico | Bin 0 -> 5253 bytes server/static/backend_logo.png | Bin 0 -> 8604 bytes server/util/array.go | 38 + server/util/config.go | 75 ++ server/util/convert.go | 27 + server/util/ip.go | 23 + server/util/redis.go | 214 +++++ server/util/server.go | 171 ++++ server/util/string.go | 34 + server/util/tools.go | 97 ++ server/util/url.go | 63 ++ server/util/verify.go | 71 ++ sql/x_admin.sql | 826 ++++++++++++++++++ 611 files changed, 28854 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 admin/.editorconfig create mode 100644 admin/.env.development.example create mode 100644 admin/.env.production.example create mode 100644 admin/.eslintrc.cjs create mode 100644 admin/.gitignore create mode 100644 admin/.prettierrc create mode 100644 admin/.vscode/extensions.json create mode 100644 admin/.vscode/settings.json create mode 100644 admin/README.md create mode 100644 admin/global.d.ts create mode 100644 admin/index.html create mode 100644 admin/package.json create mode 100644 admin/postcss.config.js create mode 100644 admin/scripts/build.mjs create mode 100644 admin/src/App.vue create mode 100644 admin/src/api/app.ts create mode 100644 admin/src/api/article.ts create mode 100644 admin/src/api/article_collect.ts create mode 100644 admin/src/api/channel/h5.ts create mode 100644 admin/src/api/channel/weapp.ts create mode 100644 admin/src/api/channel/wx_dev.ts create mode 100644 admin/src/api/channel/wx_oa.ts create mode 100644 admin/src/api/consumer.ts create mode 100644 admin/src/api/decoration.ts create mode 100644 admin/src/api/file.ts create mode 100644 admin/src/api/message.ts create mode 100644 admin/src/api/org/department.ts create mode 100644 admin/src/api/org/post.ts create mode 100644 admin/src/api/perms/admin.ts create mode 100644 admin/src/api/perms/menu.ts create mode 100644 admin/src/api/perms/role.ts create mode 100644 admin/src/api/setting/dict.ts create mode 100644 admin/src/api/setting/search.ts create mode 100644 admin/src/api/setting/storage.ts create mode 100644 admin/src/api/setting/system.ts create mode 100644 admin/src/api/setting/user.ts create mode 100644 admin/src/api/setting/website.ts create mode 100644 admin/src/api/tools/code.ts create mode 100644 admin/src/api/user.ts create mode 100644 admin/src/assets/icons/Androidfanhui.svg create mode 100644 admin/src/assets/icons/KMSguanli.svg create mode 100644 admin/src/assets/icons/KTVyuding.svg create mode 100644 admin/src/assets/icons/a-tixingdengpao.svg create mode 100644 admin/src/assets/icons/anquan.svg create mode 100644 admin/src/assets/icons/anquan_mian.svg create mode 100644 admin/src/assets/icons/anquan_mian1.svg create mode 100644 admin/src/assets/icons/banxing_mian.svg create mode 100644 admin/src/assets/icons/baoxian.svg create mode 100644 admin/src/assets/icons/bendishenghuodaxue.svg create mode 100644 admin/src/assets/icons/bianji.svg create mode 100644 admin/src/assets/icons/biaoqing.svg create mode 100644 admin/src/assets/icons/bukejian.svg create mode 100644 admin/src/assets/icons/caipinguanli.svg create mode 100644 admin/src/assets/icons/caiwu.svg create mode 100644 admin/src/assets/icons/caiwu_jifen.svg create mode 100644 admin/src/assets/icons/caiwu_tixian.svg create mode 100644 admin/src/assets/icons/canyinfuwu.svg create mode 100644 admin/src/assets/icons/carryout.svg create mode 100644 admin/src/assets/icons/chexiao.svg create mode 100644 admin/src/assets/icons/chihuohongbao.svg create mode 100644 admin/src/assets/icons/chuangyiwuliao.svg create mode 100644 admin/src/assets/icons/close.svg create mode 100644 admin/src/assets/icons/daiyunying.svg create mode 100644 admin/src/assets/icons/danwei.svg create mode 100644 admin/src/assets/icons/danxuankuang.svg create mode 100644 admin/src/assets/icons/danxuanxuanzhong.svg create mode 100644 admin/src/assets/icons/dayin.svg create mode 100644 admin/src/assets/icons/dayin_mian.svg create mode 100644 admin/src/assets/icons/del.svg create mode 100644 admin/src/assets/icons/diancanshezhi.svg create mode 100644 admin/src/assets/icons/dianhua.svg create mode 100644 admin/src/assets/icons/dianhua_mian.svg create mode 100644 admin/src/assets/icons/dianpu_fengge.svg create mode 100644 admin/src/assets/icons/dianputuijian.svg create mode 100644 admin/src/assets/icons/dianzifapiao.svg create mode 100644 admin/src/assets/icons/dingcan.svg create mode 100644 admin/src/assets/icons/dingdan.svg create mode 100644 admin/src/assets/icons/dingdan1.svg create mode 100644 admin/src/assets/icons/dingdan_mian.svg create mode 100644 admin/src/assets/icons/dingwei.svg create mode 100644 admin/src/assets/icons/dingwei_mian.svg create mode 100644 admin/src/assets/icons/ditu.svg create mode 100644 admin/src/assets/icons/ditu_mian.svg create mode 100644 admin/src/assets/icons/duizhang.svg create mode 100644 admin/src/assets/icons/elemo.svg create mode 100644 admin/src/assets/icons/ezhanggui.svg create mode 100644 admin/src/assets/icons/falvfuwubaoxiaohei.svg create mode 100644 admin/src/assets/icons/fengniaopaotui.svg create mode 100644 admin/src/assets/icons/fenxiang.svg create mode 100644 admin/src/assets/icons/fukuan.svg create mode 100644 admin/src/assets/icons/fukuan_mian.svg create mode 100644 admin/src/assets/icons/fullscreen-exit.svg create mode 100644 admin/src/assets/icons/fullscreen.svg create mode 100644 admin/src/assets/icons/fuwushichang.svg create mode 100644 admin/src/assets/icons/fuzhi.svg create mode 100644 admin/src/assets/icons/gaode.svg create mode 100644 admin/src/assets/icons/gengduo.svg create mode 100644 admin/src/assets/icons/gengduoandroid.svg create mode 100644 admin/src/assets/icons/gift.svg create mode 100644 admin/src/assets/icons/gongyingshang.svg create mode 100644 admin/src/assets/icons/goods.svg create mode 100644 admin/src/assets/icons/gou.svg create mode 100644 admin/src/assets/icons/gouwuche.svg create mode 100644 admin/src/assets/icons/gouxuan.svg create mode 100644 admin/src/assets/icons/gouxuan_mian.svg create mode 100644 admin/src/assets/icons/guanbi.svg create mode 100644 admin/src/assets/icons/guanli.svg create mode 100644 admin/src/assets/icons/guanli_mian.svg create mode 100644 admin/src/assets/icons/gukefapiao.svg create mode 100644 admin/src/assets/icons/haibaosheji.svg create mode 100644 admin/src/assets/icons/heshoujilu.svg create mode 100644 admin/src/assets/icons/heshoujilu1.svg create mode 100644 admin/src/assets/icons/hexiao_order.svg create mode 100644 admin/src/assets/icons/hide-2.svg create mode 100644 admin/src/assets/icons/hide.svg create mode 100644 admin/src/assets/icons/hongbao.svg create mode 100644 admin/src/assets/icons/huiche.svg create mode 100644 admin/src/assets/icons/huiyuanyingxiao.svg create mode 100644 admin/src/assets/icons/huodongbaoming.svg create mode 100644 admin/src/assets/icons/huodongguanli.svg create mode 100644 admin/src/assets/icons/huodongzhongxin.svg create mode 100644 admin/src/assets/icons/huojian.svg create mode 100644 admin/src/assets/icons/huojian_mian.svg create mode 100644 admin/src/assets/icons/huolala.svg create mode 100644 admin/src/assets/icons/iOSfanhui.svg create mode 100644 admin/src/assets/icons/jia.svg create mode 100644 admin/src/assets/icons/jia_mian.svg create mode 100644 admin/src/assets/icons/jian.svg create mode 100644 admin/src/assets/icons/jian_mian.svg create mode 100644 admin/src/assets/icons/jianpan.svg create mode 100644 admin/src/assets/icons/jianpanshanchu.svg create mode 100644 admin/src/assets/icons/jianshao.svg create mode 100644 admin/src/assets/icons/jiaopeiwangputong.svg create mode 100644 admin/src/assets/icons/jiaoyi.svg create mode 100644 admin/src/assets/icons/jiedan.svg create mode 100644 admin/src/assets/icons/jiekuan.svg create mode 100644 admin/src/assets/icons/jingshi.svg create mode 100644 admin/src/assets/icons/jingshi_mian.svg create mode 100644 admin/src/assets/icons/jingshi_mian1.svg create mode 100644 admin/src/assets/icons/jingyin.svg create mode 100644 admin/src/assets/icons/jingyin_mian.svg create mode 100644 admin/src/assets/icons/jingying.svg create mode 100644 admin/src/assets/icons/jingying_mian.svg create mode 100644 admin/src/assets/icons/jingyinggonglve.svg create mode 100644 admin/src/assets/icons/jingzhunyingxiao.svg create mode 100644 admin/src/assets/icons/jinhuo.svg create mode 100644 admin/src/assets/icons/kaitongwaimai.svg create mode 100644 admin/src/assets/icons/kanjia.svg create mode 100644 admin/src/assets/icons/kefu.svg create mode 100644 admin/src/assets/icons/kejian.svg create mode 100644 admin/src/assets/icons/kejian_mian.svg create mode 100644 admin/src/assets/icons/keziyuyue.svg create mode 100644 admin/src/assets/icons/kezizhongxin.svg create mode 100644 admin/src/assets/icons/koubei.svg create mode 100644 admin/src/assets/icons/kuaijiehuifu.svg create mode 100644 admin/src/assets/icons/ladu_mian.svg create mode 100644 admin/src/assets/icons/lanyadingwei.svg create mode 100644 admin/src/assets/icons/list-2.svg create mode 100644 admin/src/assets/icons/mendiandongtai.svg create mode 100644 admin/src/assets/icons/mishiyuding.svg create mode 100644 admin/src/assets/icons/mishiyuding1.svg create mode 100644 admin/src/assets/icons/notice_buyer.svg create mode 100644 admin/src/assets/icons/open.svg create mode 100644 admin/src/assets/icons/paiduiquhao.svg create mode 100644 admin/src/assets/icons/paimai.svg create mode 100644 admin/src/assets/icons/pingjia.svg create mode 100644 admin/src/assets/icons/pingtaifapiao.svg create mode 100644 admin/src/assets/icons/pinpai.svg create mode 100644 admin/src/assets/icons/qianbao.svg create mode 100644 admin/src/assets/icons/qianbao_mian.svg create mode 100644 admin/src/assets/icons/qiehuan.svg create mode 100644 admin/src/assets/icons/qingchu.svg create mode 100644 admin/src/assets/icons/qingchu_mian.svg create mode 100644 admin/src/assets/icons/qishoupeisong.svg create mode 100644 admin/src/assets/icons/qiyedingcan.svg create mode 100644 admin/src/assets/icons/qiyedingcan1.svg create mode 100644 admin/src/assets/icons/quanbu.svg create mode 100644 admin/src/assets/icons/quanping.svg create mode 100644 admin/src/assets/icons/qudao.svg create mode 100644 admin/src/assets/icons/qudao_xiaochengxu.svg create mode 100644 admin/src/assets/icons/rencaizhaopin.svg create mode 100644 admin/src/assets/icons/rili.svg create mode 100644 admin/src/assets/icons/rili2.svg create mode 100644 admin/src/assets/icons/rizhi.svg create mode 100644 admin/src/assets/icons/saoma.svg create mode 100644 admin/src/assets/icons/set_pay.svg create mode 100644 admin/src/assets/icons/set_peisong.svg create mode 100644 admin/src/assets/icons/set_user.svg create mode 100644 admin/src/assets/icons/set_weihu.svg create mode 100644 admin/src/assets/icons/shanchu.svg create mode 100644 admin/src/assets/icons/shanchu_mian.svg create mode 100644 admin/src/assets/icons/shangchuan.svg create mode 100644 admin/src/assets/icons/shangchuanzhaopian.svg create mode 100644 admin/src/assets/icons/shangpinguanli.svg create mode 100644 admin/src/assets/icons/shangpinzhushou.svg create mode 100644 admin/src/assets/icons/shangpuyuding.svg create mode 100644 admin/src/assets/icons/shebeiguanli.svg create mode 100644 admin/src/assets/icons/shengfuwangputong.svg create mode 100644 admin/src/assets/icons/shengyin.svg create mode 100644 admin/src/assets/icons/shengyin_mian.svg create mode 100644 admin/src/assets/icons/shezhi.svg create mode 100644 admin/src/assets/icons/shezhi_mian.svg create mode 100644 admin/src/assets/icons/shichang.svg create mode 100644 admin/src/assets/icons/shichang_mian.svg create mode 100644 admin/src/assets/icons/shijian.svg create mode 100644 admin/src/assets/icons/shijian_mian.svg create mode 100644 admin/src/assets/icons/shoudan.svg create mode 100644 admin/src/assets/icons/shouqi.svg create mode 100644 admin/src/assets/icons/shouqi_mian.svg create mode 100644 admin/src/assets/icons/shouye.svg create mode 100644 admin/src/assets/icons/shouye_mian.svg create mode 100644 admin/src/assets/icons/shouyiren.svg create mode 100644 admin/src/assets/icons/show.svg create mode 100644 admin/src/assets/icons/shuangjiantouxiangyou.svg create mode 100644 admin/src/assets/icons/shuangjiantouxiangzuo.svg create mode 100644 admin/src/assets/icons/shuaxin.svg create mode 100644 admin/src/assets/icons/shuju.svg create mode 100644 admin/src/assets/icons/shuju2.svg create mode 100644 admin/src/assets/icons/shuju_liuliang.svg create mode 100644 admin/src/assets/icons/shuju_mian.svg create mode 100644 admin/src/assets/icons/sort.svg create mode 100644 admin/src/assets/icons/sousuo.svg create mode 100644 admin/src/assets/icons/sucai.svg create mode 100644 admin/src/assets/icons/tianjia.svg create mode 100644 admin/src/assets/icons/tishi.svg create mode 100644 admin/src/assets/icons/tishi_mian.svg create mode 100644 admin/src/assets/icons/tongxunlu_mian.svg create mode 100644 admin/src/assets/icons/tongzhi.svg create mode 100644 admin/src/assets/icons/tongzhi_mian.svg create mode 100644 admin/src/assets/icons/tuichuquanping.svg create mode 100644 admin/src/assets/icons/tuiguang.svg create mode 100644 admin/src/assets/icons/tuiguang_mian.svg create mode 100644 admin/src/assets/icons/tupian.svg create mode 100644 admin/src/assets/icons/tupian_mian.svg create mode 100644 admin/src/assets/icons/user_biaoqian.svg create mode 100644 admin/src/assets/icons/user_gaikuang.svg create mode 100644 admin/src/assets/icons/user_guanli.svg create mode 100644 admin/src/assets/icons/wangpudiandan.svg create mode 100644 admin/src/assets/icons/weixin.svg create mode 100644 admin/src/assets/icons/weixin_mian.svg create mode 100644 admin/src/assets/icons/wode.svg create mode 100644 admin/src/assets/icons/wode_mian.svg create mode 100644 admin/src/assets/icons/xiangji.svg create mode 100644 admin/src/assets/icons/xiaoxi.svg create mode 100644 admin/src/assets/icons/xiazai.svg create mode 100644 admin/src/assets/icons/xitongquanxian.svg create mode 100644 admin/src/assets/icons/yingxiao_qipao.svg create mode 100644 admin/src/assets/icons/yingyezizhi.svg create mode 100644 admin/src/assets/icons/yinhangka.svg create mode 100644 admin/src/assets/icons/yiwen.svg create mode 100644 admin/src/assets/icons/youhui.svg create mode 100644 admin/src/assets/icons/youjian.svg create mode 100644 admin/src/assets/icons/youjiantou.svg create mode 100644 admin/src/assets/icons/yulibao.svg create mode 100644 admin/src/assets/icons/yuyin.svg create mode 100644 admin/src/assets/icons/yuyueguanli.svg create mode 100644 admin/src/assets/icons/yuyueguanlishezhi.svg create mode 100644 admin/src/assets/icons/zhankai.svg create mode 100644 admin/src/assets/icons/zhankai_mian.svg create mode 100644 admin/src/assets/icons/zhibo.svg create mode 100644 admin/src/assets/icons/zhibo_mian.svg create mode 100644 admin/src/assets/icons/zhuangxiu.svg create mode 100644 admin/src/assets/icons/zhuangxiu_mian.svg create mode 100644 admin/src/assets/icons/zhuoweiguanli.svg create mode 100644 admin/src/assets/icons/zichanzhuanrang.svg create mode 100644 admin/src/assets/icons/zuliao.svg create mode 100644 admin/src/assets/icons/zuliaoyuding.svg create mode 100644 admin/src/assets/images/icon_folder.png create mode 100644 admin/src/assets/images/no_perms.png create mode 100644 admin/src/assets/images/theme_black.png create mode 100644 admin/src/assets/images/theme_white.png create mode 100644 admin/src/components/app-link/index.vue create mode 100644 admin/src/components/color-picker/index.vue create mode 100644 admin/src/components/daterange-picker/index.vue create mode 100644 admin/src/components/del-wrap/index.vue create mode 100644 admin/src/components/dict-value/index.vue create mode 100644 admin/src/components/editor/index.vue create mode 100644 admin/src/components/footer-btns/index.vue create mode 100644 admin/src/components/icon/index.ts create mode 100644 admin/src/components/icon/index.vue create mode 100644 admin/src/components/icon/picker.vue create mode 100644 admin/src/components/icon/svg-icon.vue create mode 100644 admin/src/components/image-contain/index.vue create mode 100644 admin/src/components/link/custom-link.vue create mode 100644 admin/src/components/link/index.ts create mode 100644 admin/src/components/link/index.vue create mode 100644 admin/src/components/link/picker.vue create mode 100644 admin/src/components/link/shop-pages.vue create mode 100644 admin/src/components/material/file.vue create mode 100644 admin/src/components/material/hook.ts create mode 100644 admin/src/components/material/index.vue create mode 100644 admin/src/components/material/picker.vue create mode 100644 admin/src/components/material/preview.vue create mode 100644 admin/src/components/overflow-tooltip/index.vue create mode 100644 admin/src/components/pagination/index.vue create mode 100644 admin/src/components/popover-input/index.vue create mode 100644 admin/src/components/popup/index.vue create mode 100644 admin/src/components/upload/index.vue create mode 100644 admin/src/components/video-player/index.vue create mode 100644 admin/src/config/index.ts create mode 100644 admin/src/config/setting.ts create mode 100644 admin/src/enums/appEnums.ts create mode 100644 admin/src/enums/cacheEnums.ts create mode 100644 admin/src/enums/pageEnum.ts create mode 100644 admin/src/enums/requestEnums.ts create mode 100644 admin/src/hooks/useDictOptions.ts create mode 100644 admin/src/hooks/useLockFn.ts create mode 100644 admin/src/hooks/useMultipleTabs.ts create mode 100644 admin/src/hooks/usePaging.ts create mode 100644 admin/src/hooks/useWatchRoute.ts create mode 100644 admin/src/install/directives/copy.ts create mode 100644 admin/src/install/directives/perms.ts create mode 100644 admin/src/install/index.ts create mode 100644 admin/src/install/plugins/element.ts create mode 100644 admin/src/install/plugins/pinia.ts create mode 100644 admin/src/install/plugins/router.ts create mode 100644 admin/src/layout/Empty.vue create mode 100644 admin/src/layout/components/footer.vue create mode 100644 admin/src/layout/default/components/header/breadcrumb.vue create mode 100644 admin/src/layout/default/components/header/fold.vue create mode 100644 admin/src/layout/default/components/header/full-screen.vue create mode 100644 admin/src/layout/default/components/header/index.vue create mode 100644 admin/src/layout/default/components/header/multiple-tabs.vue create mode 100644 admin/src/layout/default/components/header/refresh.vue create mode 100644 admin/src/layout/default/components/header/user-drop-down.vue create mode 100644 admin/src/layout/default/components/main.vue create mode 100644 admin/src/layout/default/components/setting/drawer.vue create mode 100644 admin/src/layout/default/components/setting/index.vue create mode 100644 admin/src/layout/default/components/sidebar/index.vue create mode 100644 admin/src/layout/default/components/sidebar/logo.vue create mode 100644 admin/src/layout/default/components/sidebar/menu-item.vue create mode 100644 admin/src/layout/default/components/sidebar/menu.vue create mode 100644 admin/src/layout/default/components/sidebar/side.vue create mode 100644 admin/src/layout/default/index.vue create mode 100644 admin/src/main.ts create mode 100644 admin/src/permission.ts create mode 100644 admin/src/router/index.ts create mode 100644 admin/src/router/routes.ts create mode 100644 admin/src/stores/index.ts create mode 100644 admin/src/stores/modules/app.ts create mode 100644 admin/src/stores/modules/multipleTabs.ts create mode 100644 admin/src/stores/modules/setting.ts create mode 100644 admin/src/stores/modules/user.ts create mode 100644 admin/src/styles/dark.css create mode 100644 admin/src/styles/element.scss create mode 100644 admin/src/styles/index.scss create mode 100644 admin/src/styles/public.scss create mode 100644 admin/src/styles/tailwind.css create mode 100644 admin/src/styles/var.css create mode 100644 admin/src/utils/auth.ts create mode 100644 admin/src/utils/cache.ts create mode 100644 admin/src/utils/echart.ts create mode 100644 admin/src/utils/env.ts create mode 100644 admin/src/utils/feedback.ts create mode 100644 admin/src/utils/file.ts create mode 100644 admin/src/utils/request/axios.ts create mode 100644 admin/src/utils/request/cancel.ts create mode 100644 admin/src/utils/request/index.ts create mode 100644 admin/src/utils/request/type.d.ts create mode 100644 admin/src/utils/theme.ts create mode 100644 admin/src/utils/util.ts create mode 100644 admin/src/utils/validate.ts create mode 100644 admin/src/views/account/images/login_bg.png create mode 100644 admin/src/views/account/login.vue create mode 100644 admin/src/views/article/column/edit.vue create mode 100644 admin/src/views/article/column/index.vue create mode 100644 admin/src/views/article/lists/edit.vue create mode 100644 admin/src/views/article/lists/index.vue create mode 100644 admin/src/views/article_collect/edit.vue create mode 100644 admin/src/views/article_collect/index.vue create mode 100644 admin/src/views/channel/h5.vue create mode 100644 admin/src/views/channel/weapp.vue create mode 100644 admin/src/views/channel/wx_dev.vue create mode 100644 admin/src/views/channel/wx_oa/config.vue create mode 100644 admin/src/views/channel/wx_oa/menu.vue create mode 100644 admin/src/views/channel/wx_oa/menu_com/oa-attr.vue create mode 100644 admin/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue create mode 100644 admin/src/views/channel/wx_oa/menu_com/oa-menu-form.vue create mode 100644 admin/src/views/channel/wx_oa/menu_com/oa-phone.vue create mode 100644 admin/src/views/channel/wx_oa/menu_com/useMenuOa.ts create mode 100644 admin/src/views/channel/wx_oa/reply/default_reply.vue create mode 100644 admin/src/views/channel/wx_oa/reply/edit.vue create mode 100644 admin/src/views/channel/wx_oa/reply/follow_reply.vue create mode 100644 admin/src/views/channel/wx_oa/reply/keyword_reply.vue create mode 100644 admin/src/views/consumer/lists/detail.vue create mode 100644 admin/src/views/consumer/lists/index.vue create mode 100644 admin/src/views/decoration/component/add-nav.vue create mode 100644 admin/src/views/decoration/component/decoration-img.vue create mode 100644 admin/src/views/decoration/component/pages/attr-setting.vue create mode 100644 admin/src/views/decoration/component/pages/menu.vue create mode 100644 admin/src/views/decoration/component/pages/preview.vue create mode 100644 admin/src/views/decoration/component/widgets/banner/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/banner/content.vue create mode 100644 admin/src/views/decoration/component/widgets/banner/index.ts create mode 100644 admin/src/views/decoration/component/widgets/banner/options.ts create mode 100644 admin/src/views/decoration/component/widgets/customer-service/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/customer-service/content.vue create mode 100644 admin/src/views/decoration/component/widgets/customer-service/index.ts create mode 100644 admin/src/views/decoration/component/widgets/customer-service/options.ts create mode 100644 admin/src/views/decoration/component/widgets/index.ts create mode 100644 admin/src/views/decoration/component/widgets/my-service/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/my-service/content.vue create mode 100644 admin/src/views/decoration/component/widgets/my-service/index.ts create mode 100644 admin/src/views/decoration/component/widgets/my-service/options.ts create mode 100644 admin/src/views/decoration/component/widgets/nav/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/nav/content.vue create mode 100644 admin/src/views/decoration/component/widgets/nav/index.ts create mode 100644 admin/src/views/decoration/component/widgets/nav/options.ts create mode 100644 admin/src/views/decoration/component/widgets/news/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/news/content.vue create mode 100644 admin/src/views/decoration/component/widgets/news/index.ts create mode 100644 admin/src/views/decoration/component/widgets/news/options.ts create mode 100644 admin/src/views/decoration/component/widgets/search/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/search/content.vue create mode 100644 admin/src/views/decoration/component/widgets/search/index.ts create mode 100644 admin/src/views/decoration/component/widgets/search/options.ts create mode 100644 admin/src/views/decoration/component/widgets/user-banner/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/user-banner/content.vue create mode 100644 admin/src/views/decoration/component/widgets/user-banner/index.ts create mode 100644 admin/src/views/decoration/component/widgets/user-banner/options.ts create mode 100644 admin/src/views/decoration/component/widgets/user-info/attr.vue create mode 100644 admin/src/views/decoration/component/widgets/user-info/content.vue create mode 100644 admin/src/views/decoration/component/widgets/user-info/images/default_avatar.png create mode 100644 admin/src/views/decoration/component/widgets/user-info/images/my_topbg.png create mode 100644 admin/src/views/decoration/component/widgets/user-info/index.ts create mode 100644 admin/src/views/decoration/component/widgets/user-info/options.ts create mode 100644 admin/src/views/decoration/pages/index.vue create mode 100644 admin/src/views/decoration/tabbar.vue create mode 100644 admin/src/views/dev_tools/code/edit.vue create mode 100644 admin/src/views/dev_tools/code/index.vue create mode 100644 admin/src/views/dev_tools/components/code-preview.vue create mode 100644 admin/src/views/dev_tools/components/data-table.vue create mode 100644 admin/src/views/error/403.vue create mode 100644 admin/src/views/error/404.vue create mode 100644 admin/src/views/error/components/error.vue create mode 100644 admin/src/views/material/index.vue create mode 100644 admin/src/views/message/notice/edit.vue create mode 100644 admin/src/views/message/notice/index.vue create mode 100644 admin/src/views/message/short_letter/edit.vue create mode 100644 admin/src/views/message/short_letter/index.vue create mode 100644 admin/src/views/organization/department/edit.vue create mode 100644 admin/src/views/organization/department/index.vue create mode 100644 admin/src/views/organization/post/edit.vue create mode 100644 admin/src/views/organization/post/index.vue create mode 100644 admin/src/views/permission/admin/edit.vue create mode 100644 admin/src/views/permission/admin/index.vue create mode 100644 admin/src/views/permission/menu/edit.vue create mode 100644 admin/src/views/permission/menu/index.vue create mode 100644 admin/src/views/permission/role/auth.vue create mode 100644 admin/src/views/permission/role/edit.vue create mode 100644 admin/src/views/permission/role/index.vue create mode 100644 admin/src/views/setting/dict/data/edit.vue create mode 100644 admin/src/views/setting/dict/data/index.vue create mode 100644 admin/src/views/setting/dict/type/edit.vue create mode 100644 admin/src/views/setting/dict/type/index.vue create mode 100644 admin/src/views/setting/search/index.vue create mode 100644 admin/src/views/setting/storage/edit.vue create mode 100644 admin/src/views/setting/storage/index.vue create mode 100644 admin/src/views/setting/system/cache.vue create mode 100644 admin/src/views/setting/system/environment.vue create mode 100644 admin/src/views/setting/system/journal.vue create mode 100644 admin/src/views/setting/user/login_register.vue create mode 100644 admin/src/views/setting/user/setup.vue create mode 100644 admin/src/views/setting/website/filing.vue create mode 100644 admin/src/views/setting/website/information.vue create mode 100644 admin/src/views/setting/website/protocol.vue create mode 100644 admin/src/views/user/setting.vue create mode 100644 admin/src/views/workbench/image/customer_service.png create mode 100644 admin/src/views/workbench/image/menu_admin.png create mode 100644 admin/src/views/workbench/image/menu_auth.png create mode 100644 admin/src/views/workbench/image/menu_dept.png create mode 100644 admin/src/views/workbench/image/menu_dict.png create mode 100644 admin/src/views/workbench/image/menu_file.png create mode 100644 admin/src/views/workbench/image/menu_generator.png create mode 100644 admin/src/views/workbench/image/menu_role.png create mode 100644 admin/src/views/workbench/image/menu_web.png create mode 100644 admin/src/views/workbench/image/qq_group.png create mode 100644 admin/src/views/workbench/index.vue create mode 100644 admin/tailwind.config.js create mode 100644 admin/tsconfig.json create mode 100644 admin/typings/index.d.ts create mode 100644 admin/typings/router.d.ts create mode 100644 admin/vite.config.ts create mode 100644 docs/1.go-打包.md create mode 100644 docs/2.go-运行.md create mode 100644 docs/3.go-nginx配置.md create mode 100644 docs/assets/genCode.png create mode 100644 docs/assets/work.png create mode 100644 server.code-workspace create mode 100644 server/.env.example create mode 100644 server/.gitignore create mode 100644 server/.goreleaser.yaml create mode 100644 server/.vscode/launch.json create mode 100644 server/.vscode/settings.json create mode 100644 server/admin/article_collect/article_collect_ctl.go create mode 100644 server/admin/article_collect/article_collect_schema.go create mode 100644 server/admin/article_collect/article_collect_service.go create mode 100644 server/admin/article_collect_route.go create mode 100644 server/admin/common/album/route.go create mode 100644 server/admin/common/album/schema.go create mode 100644 server/admin/common/album/service.go create mode 100644 server/admin/common/index/index.go create mode 100644 server/admin/common/index/service.go create mode 100644 server/admin/common/upload/service.go create mode 100644 server/admin/common/upload/upload.go create mode 100644 server/admin/entry.go create mode 100644 server/admin/monitor/monitor.go create mode 100644 server/admin/setting/copyright/copyright.go create mode 100644 server/admin/setting/copyright/schema.go create mode 100644 server/admin/setting/copyright/service.go create mode 100644 server/admin/setting/dict_data/dict_data.go create mode 100644 server/admin/setting/dict_data/schema.go create mode 100644 server/admin/setting/dict_data/service.go create mode 100644 server/admin/setting/dict_type/dict_type.go create mode 100644 server/admin/setting/dict_type/schema.go create mode 100644 server/admin/setting/dict_type/service.go create mode 100644 server/admin/setting/protocol/protocol.go create mode 100644 server/admin/setting/protocol/schema.go create mode 100644 server/admin/setting/protocol/service.go create mode 100644 server/admin/setting/storage/schema.go create mode 100644 server/admin/setting/storage/service.go create mode 100644 server/admin/setting/storage/storage.go create mode 100644 server/admin/setting/website/schema.go create mode 100644 server/admin/setting/website/service.go create mode 100644 server/admin/setting/website/website.go create mode 100644 server/admin/system/admin/admin.go create mode 100644 server/admin/system/admin/schema.go create mode 100644 server/admin/system/admin/service.go create mode 100644 server/admin/system/dept/dept.go create mode 100644 server/admin/system/dept/schema.go create mode 100644 server/admin/system/dept/service.go create mode 100644 server/admin/system/enter.go create mode 100644 server/admin/system/log/log.go create mode 100644 server/admin/system/log/schema.go create mode 100644 server/admin/system/log/service.go create mode 100644 server/admin/system/login/login.go create mode 100644 server/admin/system/login/schema.go create mode 100644 server/admin/system/login/service.go create mode 100644 server/admin/system/menu/menu.go create mode 100644 server/admin/system/menu/schema.go create mode 100644 server/admin/system/menu/service.go create mode 100644 server/admin/system/post/post.go create mode 100644 server/admin/system/post/schema.go create mode 100644 server/admin/system/post/service.go create mode 100644 server/admin/system/role/authPermService.go create mode 100644 server/admin/system/role/role.go create mode 100644 server/admin/system/role/schema.go create mode 100644 server/admin/system/role/service.go create mode 100644 server/config/admin.go create mode 100644 server/config/config.go create mode 100644 server/config/gen.go create mode 100644 server/core/db.go create mode 100644 server/core/logger.go create mode 100644 server/core/redis.go create mode 100644 server/core/request/common.go create mode 100644 server/core/response/common.go create mode 100644 server/core/response/error.go create mode 100644 server/core/response/response.go create mode 100644 server/core/time.go create mode 100644 server/core/uaparser.go create mode 100644 server/generator/enter.go create mode 100644 server/generator/gen/gen.go create mode 100644 server/generator/gen/schema.go create mode 100644 server/generator/gen/service.go create mode 100644 server/generator/templates/gocode/controller.go copy.tpl create mode 100644 server/generator/templates/gocode/controller.go.tpl create mode 100644 server/generator/templates/gocode/model.go.tpl create mode 100644 server/generator/templates/gocode/route.go.tpl create mode 100644 server/generator/templates/gocode/schema.go.tpl create mode 100644 server/generator/templates/gocode/service.go.tpl create mode 100644 server/generator/templates/vue/api.ts.tpl create mode 100644 server/generator/templates/vue/edit.vue.tpl create mode 100644 server/generator/templates/vue/index-tree.vue.tpl create mode 100644 server/generator/templates/vue/index.vue.tpl create mode 100644 server/generator/tpl_utils/constants.go create mode 100644 server/generator/tpl_utils/tpl.go create mode 100644 server/generator/tpl_utils/utils.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/main.go create mode 100644 server/middleware/auth.go create mode 100644 server/middleware/cors.go create mode 100644 server/middleware/error.go create mode 100644 server/middleware/log.go create mode 100644 server/middleware/show.go create mode 100644 server/model/article_collect.go create mode 100644 server/model/common/album.go create mode 100644 server/model/gen/gen.go create mode 100644 server/model/setting/dict_data.go create mode 100644 server/model/setting/dict_type.go create mode 100644 server/model/system/system.go create mode 100644 server/plugin/storage.go create mode 100644 server/routers/enter.go create mode 100644 server/static/backend_avatar.png create mode 100644 server/static/backend_backdrop.png create mode 100644 server/static/backend_favicon.ico create mode 100644 server/static/backend_logo.png create mode 100644 server/util/array.go create mode 100644 server/util/config.go create mode 100644 server/util/convert.go create mode 100644 server/util/ip.go create mode 100644 server/util/redis.go create mode 100644 server/util/server.go create mode 100644 server/util/string.go create mode 100644 server/util/tools.go create mode 100644 server/util/url.go create mode 100644 server/util/verify.go create mode 100644 sql/x_admin.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ae4f47 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Build and Release Folders +.idea +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +/public/uploads/* +!/public/uploads/index.html +frontend/* +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4742ef0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 likeadmin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d5f93f9 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +

likeadmin通用管理后台(Go)

+

🚀快速开发、✅后台多端自适应

+

+ + +
+

本仓库基于:https://gitee.com/likeadmin/likeadmin_go

+ +

+本仓库经过魔改精简。 +

+
+ +![](./docs/assets/work.png) + +
+
+ +## 👀 体验 + +### 管理后台 +本仓库演示地址:http://likeadmin.adtk.cn
+原仓库演示地址:https://go-admin.likeadmin.cn
+账号:admin 密码:123456 + +### 开发部署文档 +1. [go-打包.md](./docs/1.go-打包.md) +2. [go-运行.md](./docs/2.go-运行.md) +3. [go-nginx配置.md](./docs/3.go-nginx配置.md) + + +## 👨‍💻‍ 简介 + +我们希望能够为开源社区做出更多的贡献,推出永久免费开源的 likeadmin 通用前后端分离管理后台系统。遵循 MIT 开源许可协议,您可以免费使用,甚至允许把你基于 likeadmin 开发的软件应用开源、发布、销售。 +
+ +## 🧐 进一步了解 + +### 🧰 场景介绍 + +1.likeadmin 已经搭建好前后端分离的底层,包含程序安装、登录、登出、工作台、菜单权限控制、角色、管理员、部门管理、岗位管理、素材管理、网站设置、图库管理等基础功能,无需重复造轮子。 + +### 🐹 前端架构方面 + +#### 后台 + +1.使用最流性的前后端分离方案 typescript、vue3、vite 开发,保持了代码的简洁、一致和规范。
2.后台界面使用 element-plus UI 框架,简单精美的后台界面,丰富的组件库,方便快速开发,满足各种后台交互。 +
+ +#### 🛠️  代码生成器 + +一键生成前后端业务代码,大大提示开发效率。 +![](./docs/assets/genCode.png) diff --git a/admin/.editorconfig b/admin/.editorconfig new file mode 100644 index 0000000..f669cf1 --- /dev/null +++ b/admin/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/admin/.env.development.example b/admin/.env.development.example new file mode 100644 index 0000000..8cd4d01 --- /dev/null +++ b/admin/.env.development.example @@ -0,0 +1,4 @@ +NODE_ENV = 'development' + +# 请求域名 +VITE_APP_BASE_URL='http://127.0.0.1:8001' diff --git a/admin/.env.production.example b/admin/.env.production.example new file mode 100644 index 0000000..e841ff9 --- /dev/null +++ b/admin/.env.production.example @@ -0,0 +1,4 @@ +NODE_ENV = 'production' + +# 请求域名 +VITE_APP_BASE_URL='' \ No newline at end of file diff --git a/admin/.eslintrc.cjs b/admin/.eslintrc.cjs new file mode 100644 index 0000000..fa81252 --- /dev/null +++ b/admin/.eslintrc.cjs @@ -0,0 +1,43 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + ignorePatterns: ['/auto-imports.d.ts', '/components.d.ts'], + extends: [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-typescript/recommended', + '@vue/eslint-config-prettier', + './.eslintrc-auto-import.json' + ], + rules: { + 'prettier/prettier': [ + 'warn', + { + semi: false, + singleQuote: true, + printWidth: 100, + proseWrap: 'preserve', + bracketSameLine: false, + endOfLine: 'lf', + tabWidth: 4, + useTabs: false, + trailingComma: 'none' + } + ], + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + 'no-undef': 'off', + 'vue/prefer-import-from-vue': 'off', + 'no-prototype-builtins': 'off', + 'prefer-spread': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', + 'vue/no-mutating-props': 'off' + }, + globals: { + module: 'readonly' + } +} diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100644 index 0000000..d8c3f12 --- /dev/null +++ b/admin/.gitignore @@ -0,0 +1,36 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +pnpm-lock.yaml +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# unplugin-auto-import +auto-imports.d.ts +components.d.ts +.eslintrc-auto-import.json + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# .env +.env.development +.env.production diff --git a/admin/.prettierrc b/admin/.prettierrc new file mode 100644 index 0000000..f37c5f4 --- /dev/null +++ b/admin/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": false, + "singleQuote": true, + "printWidth": 100, + "proseWrap": "preserve", + "bracketSameLine": false, + "endOfLine": "lf", + "tabWidth": 4, + "useTabs": false, + "trailingComma": "none" +} diff --git a/admin/.vscode/extensions.json b/admin/.vscode/extensions.json new file mode 100644 index 0000000..91f12b2 --- /dev/null +++ b/admin/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/admin/.vscode/settings.json b/admin/.vscode/settings.json new file mode 100644 index 0000000..1b50e37 --- /dev/null +++ b/admin/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "editor.detectIndentation": false, + "editor.tabSize": 4, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "css.validate": false, + "less.validate": false, + "scss.validate": false +} diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 0000000..077a568 --- /dev/null +++ b/admin/README.md @@ -0,0 +1,46 @@ +# vue-project + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. + +If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: + +1. Disable the built-in TypeScript Extension + 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette + 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` +2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` diff --git a/admin/global.d.ts b/admin/global.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/admin/global.d.ts @@ -0,0 +1 @@ +/// diff --git a/admin/index.html b/admin/index.html new file mode 100644 index 0000000..71d3dbb --- /dev/null +++ b/admin/index.html @@ -0,0 +1,66 @@ + + + + + + + 后台管理系统 + + + +
+
+ + + +
+
+ + + diff --git a/admin/package.json b/admin/package.json new file mode 100644 index 0000000..5514b20 --- /dev/null +++ b/admin/package.json @@ -0,0 +1,63 @@ +{ + "name": "vue-project", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "dev": "vite", + "prod": "vite build", + "preview": "vite preview --port 4173", + "build": "node ./scripts/build.mjs", + "type-check": "vue-tsc --noEmit", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@highlightjs/vue-plugin": "^2.1.0", + "@vue/shared": "^3.3.8", + "@vueuse/core": "^10.6.1", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "axios": "^1.6.2", + "consola": "^3.2.3", + "css-color-function": "^1.3.3", + "echarts": "^5.4.3", + "element-plus": "^2.4.2", + "highlight.js": "^11.9.0", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "pinia": "^2.1.7", + "vue": "^3.3.8", + "vue-clipboard3": "^2.0.0", + "vue-echarts": "^6.6.1", + "vue-router": "^4.2.5", + "vue3-video-play": "^1.3.2", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.5.1", + "@types/lodash-es": "^4.17.11", + "@types/node": "^20.9.2", + "@types/nprogress": "^0.2.3", + "@vitejs/plugin-vue": "^4.5.0", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/eslint-config-prettier": "^8.0.0", + "@vue/eslint-config-typescript": "^12.0.0", + "@vue/tsconfig": "^0.4.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.54.0", + "eslint-plugin-vue": "^9.18.1", + "execa": "^8.0.1", + "fs-extra": "^11.1.1", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "sass": "^1.69.5", + "tailwindcss": "^3.3.5", + "typescript": "~5.2.2", + "unplugin-auto-import": "^0.16.7", + "unplugin-vue-components": "^0.25.2", + "vite": "^4.5.0", + "vite-plugin-style-import": "^2.0.0", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.8.22" + } +} diff --git a/admin/postcss.config.js b/admin/postcss.config.js new file mode 100644 index 0000000..ff8ef3c --- /dev/null +++ b/admin/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/admin/scripts/build.mjs b/admin/scripts/build.mjs new file mode 100644 index 0000000..e015484 --- /dev/null +++ b/admin/scripts/build.mjs @@ -0,0 +1,37 @@ +import { execaCommand } from 'execa' +import path from 'path' +import fsExtra from 'fs-extra' +const { existsSync, remove, copy } = fsExtra +const cwd = process.cwd() +//打包发布路径,谨慎改动 +const releaseRelativePath = '../frontend' +const distPath = path.resolve(cwd, 'dist') +const releasePath = path.resolve(cwd, releaseRelativePath) + +async function build() { + await execaCommand('vite build', { stdio: 'inherit', encoding: 'utf-8', cwd }) + if (existsSync(releasePath)) { + await remove(releasePath) + } + console.log(`文件正在复制 ==> ${releaseRelativePath}`) + try { + await copyFile(distPath, releasePath) + } catch (error) { + console.log(`\n ${error}`) + } + console.log(`文件已复制 ==> ${releaseRelativePath}`) +} + +function copyFile(sourceDir, targetDir) { + return new Promise((resolve, reject) => { + copy(sourceDir, targetDir, (err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) +} + +build() diff --git a/admin/src/App.vue b/admin/src/App.vue new file mode 100644 index 0000000..08cba46 --- /dev/null +++ b/admin/src/App.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/admin/src/api/app.ts b/admin/src/api/app.ts new file mode 100644 index 0000000..3036211 --- /dev/null +++ b/admin/src/api/app.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// 配置 +export function getConfig() { + return request.get({ url: '/common/index/config' }) +} + +// 工作台主页 +export function getWorkbench() { + return request.get({ url: '/common/index/console' }) +} diff --git a/admin/src/api/article.ts b/admin/src/api/article.ts new file mode 100644 index 0000000..30a1a85 --- /dev/null +++ b/admin/src/api/article.ts @@ -0,0 +1,69 @@ +import request from '@/utils/request' + +// 文章分类列表 +export function articleCateLists(params?: any) { + return request.get({ url: '/article/cate/list', params }) +} +// 文章分类列表 +export function articleCateAll(params?: any) { + return request.get({ url: '/article/cate/all', params }) +} + +// 添加文章分类 +export function articleCateAdd(params: any) { + return request.post({ url: '/article/cate/add', params }) +} + +// 编辑文章分类 +export function articleCateEdit(params: any) { + return request.post({ url: '/article/cate/edit', params }) +} + +// 删除文章分类 +export function articleCateDelete(params: any) { + return request.post({ url: '/article/cate/del', params }) +} + +// 文章分类详情 +export function articleCateDetail(params: any) { + return request.get({ url: '/article/cate/detail', params }) +} + +// 文章分类状态 +export function articleCateStatus(params: any) { + return request.post({ url: '/article/cate/change', params }) +} + +// 文章列表 +export function articleLists(params?: any) { + return request.get({ url: '/article/list', params }) +} +// 文章列表 +export function articleAll(params?: any) { + return request.get({ url: '/article/all', params }) +} + +// 添加文章 +export function articleAdd(params: any) { + return request.post({ url: '/article/add', params }) +} + +// 编辑文章 +export function articleEdit(params: any) { + return request.post({ url: '/article/edit', params }) +} + +// 删除文章 +export function articleDelete(params: any) { + return request.post({ url: '/article/del', params }) +} + +// 文章详情 +export function articleDetail(params: any) { + return request.get({ url: '/article/detail', params }) +} + +// 文章分类状态 +export function articleStatus(params: any) { + return request.post({ url: '/article/change', params }) +} diff --git a/admin/src/api/article_collect.ts b/admin/src/api/article_collect.ts new file mode 100644 index 0000000..30ebab7 --- /dev/null +++ b/admin/src/api/article_collect.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 文章收藏列表 +export function article_collect_lists(params?: Record) { + return request.get({ url: '/article_collect/list', params }) +} + +// 文章收藏详情 +export function article_collect_detail(params: Record) { + return request.get({ url: '/article_collect/detail', params }) +} + +// 文章收藏新增 +export function article_collect_add(params: Record) { + return request.post({ url: '/article_collect/add', params }) +} + +// 文章收藏编辑 +export function article_collect_edit(params: Record) { + return request.post({ url: '/article_collect/edit', params }) +} + +// 文章收藏删除 +export function article_collect_delete(params: Record) { + return request.post({ url: '/article_collect/del', params }) +} diff --git a/admin/src/api/channel/h5.ts b/admin/src/api/channel/h5.ts new file mode 100644 index 0000000..dfb5575 --- /dev/null +++ b/admin/src/api/channel/h5.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// H5渠道配置保存 +export function setH5Config(params: any) { + return request.post({ url: '/channel/h5/save', params }) +} + +// H5渠道配置详情 +export function getH5Config() { + return request.get({ url: '/channel/h5/detail' }) +} diff --git a/admin/src/api/channel/weapp.ts b/admin/src/api/channel/weapp.ts new file mode 100644 index 0000000..59ce0a7 --- /dev/null +++ b/admin/src/api/channel/weapp.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// 微信小程序配置保存 +export function setWeappConfig(params: any) { + return request.post({ url: '/channel/mp/save', params }) +} + +// 微信小程序配置详情 +export function getWeappConfig() { + return request.get({ url: '/channel/mp/detail' }) +} diff --git a/admin/src/api/channel/wx_dev.ts b/admin/src/api/channel/wx_dev.ts new file mode 100644 index 0000000..a39ca96 --- /dev/null +++ b/admin/src/api/channel/wx_dev.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// 微信开发平台配置保存 +export function setWxDevConfig(params: any) { + return request.post({ url: '/channel/wx/save', params }) +} + +// 微信开发平台配置详情 +export function getWxDevConfig() { + return request.get({ url: '/channel/wx/detail' }) +} diff --git a/admin/src/api/channel/wx_oa.ts b/admin/src/api/channel/wx_oa.ts new file mode 100644 index 0000000..67c8431 --- /dev/null +++ b/admin/src/api/channel/wx_oa.ts @@ -0,0 +1,112 @@ +import request from '@/utils/request' +import { firstToUpperCase } from '@/utils/util' + +// 微信公众号配置保存 +export function setOaConfig(params: any) { + return request.post({ url: '/channel/oa/save', params }) +} + +// 微信公众号配置详情 +export function getOaConfig() { + return request.get({ url: '/channel/oa/detail' }) +} + +export interface Menu { + name: string + menuType?: number + visitType?: string + url?: string + appId?: string + pagePath?: string + subButtons: Menu[] | any +} + +/** + * @return { Promise } + * @description 获取菜单 + */ +export function getOaMenu() { + return request.get({ url: '/channel/oaMenu/detail' }) +} + +/** + * @return { Promise } + * @param { Menu } Menu + * @description 菜单保存 + */ +export function setOaMenuSave(params: Menu | any) { + return request.post({ url: '/channel/oaMenu/save', params }) +} + +/** + * @return { Promise } + * @param { Menu } Menu + * @description 菜单发布 + */ +export function setOaMenuPublish(params: Menu | any) { + return request.post({ url: '/channel/oaMenu/publish', params }) +} + +/** + * @description 默认回复列表 + */ +export function getOaReplyList(params: any) { + const type = firstToUpperCase(params.type) + return request.get({ url: `/channel/oaReply${type}/list`, params }) +} + +/** + * @return { Promise } + * @param { number } id + * @description 回复列表删除 + */ +export function oaReplyDel(params: any) { + const type = firstToUpperCase(params.type) + return request.post({ url: `/channel/oaReply${type}/del`, params }) +} + +/** + * @return { Promise } + * @param { number } id + * @description 回复状态修改 + */ +export function changeOaReplyStatus(params: any) { + const type = firstToUpperCase(params.type) + return request.post({ url: `/channel/oaReply${type}/status`, params }) +} + +export interface Reply { + content: string // 内容 + contentType: number // 内容类型: 1=文本 + keyword?: string // 关键词 + matchingType?: number // 匹配方式: [1=全匹配, 2=模糊匹配] + name: string // 规则名称 + status: number // 状态: 1=开启, 0=关闭 + type: string // 类型: follow=关注, keyword=关键词, default=默认 + sort: number // 排序 +} +/** + * @return { Promise } + * @description 默认回复编辑 + */ +export function oaReplyAdd(params: Reply) { + const type = firstToUpperCase(params.type) + return request.post({ url: `/channel/oaReply${type}/add`, params }) +} + +/** + * @return { Promise } + * @description 默认回复编辑 + */ +export function oaReplyEdit(params: Reply) { + const type = firstToUpperCase(params.type) + return request.post({ url: `/channel/oaReply${type}/edit`, params }) +} + +/** + * @description 默认回复详情 + */ +export function getOaReplyDetail(params: any) { + const type = firstToUpperCase(params.type) + return request.get({ url: `/channel/oaReply${type}/detail`, params }) +} diff --git a/admin/src/api/consumer.ts b/admin/src/api/consumer.ts new file mode 100644 index 0000000..1057729 --- /dev/null +++ b/admin/src/api/consumer.ts @@ -0,0 +1,16 @@ +import request from '@/utils/request' + +// 用户列表 +export function getUserList(params: any) { + return request.get({ url: '/user/list', params }) +} + +// 用户详情 +export function getUserDetail(params: any) { + return request.get({ url: '/user/detail', params }) +} + +// 用户编辑 +export function userEdit(params: any) { + return request.post({ url: '/user/edit', params }) +} diff --git a/admin/src/api/decoration.ts b/admin/src/api/decoration.ts new file mode 100644 index 0000000..28d61e6 --- /dev/null +++ b/admin/src/api/decoration.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 页面装修详情 +export function getDecoratePages(params: any) { + return request.get({ url: '/decorate/pages/detail', params }, { ignoreCancelToken: true }) +} + +// 页面装修保存 +export function setDecoratePages(params: any) { + return request.post({ url: '/decorate/pages/save', params }) +} + +// 获取首页文章数据 +export function getDecorateArticle(params?: any) { + return request.get({ url: '/decorate/data/article', params }) +} + +// 底部导航详情 +export function getDecorateTabbar(params?: any) { + return request.get({ url: '/decorate/tabbar/detail', params }) +} + +// 底部导航保存 +export function setDecorateTabbar(params: any) { + return request.post({ url: '/decorate/tabbar/save', params }) +} diff --git a/admin/src/api/file.ts b/admin/src/api/file.ts new file mode 100644 index 0000000..4dccea5 --- /dev/null +++ b/admin/src/api/file.ts @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +export function fileCateAdd(params: Record) { + return request.post({ url: '/common/album/cateAdd', params }) +} + +export function fileCateEdit(params: Record) { + return request.post({ url: '/common/album/cateRename', params }) +} + +// 文件分类删除 +export function fileCateDelete(params: Record) { + return request.post({ url: '/common/album/cateDel', params }) +} + +// 文件分类列表 +export function fileCateLists(params: Record) { + return request.get({ url: '/common/album/cateList', params }) +} + +// 文件列表 +export function fileList(params: Record) { + return request.get({ url: '/common/album/albumList', params }) +} + +// 文件删除 +export function fileDelete(params: Record) { + return request.post({ url: '/common/album/albumDel', params }) +} + +// 文件移动 +export function fileMove(params: Record) { + return request.post({ url: '/common/album/albumMove', params }) +} + +// 文件重命名 +export function fileRename(params: { id: number; name: string }) { + return request.post({ url: '/common/album/albumRename', params }) +} diff --git a/admin/src/api/message.ts b/admin/src/api/message.ts new file mode 100644 index 0000000..8d7ec49 --- /dev/null +++ b/admin/src/api/message.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 通知设置列表 +export function noticeLists(params: any) { + return request.get({ url: '/setting/notice/list', params }) +} + +// 通知设置详情 +export function noticeDetail(params: any) { + return request.get({ url: '/setting/notice/detail', params }) +} + +// 通知设置保存 +export function setNoticeConfig(params: any) { + return request.post({ url: '/setting/notice/save', params }) +} + +// 短信设置列表 +export function smsLists() { + return request.get({ url: '/setting/sms/list' }) +} + +// 短信设置详情 +export function smsDetail(params: any) { + return request.get({ url: '/setting/sms/detail', params }) +} + +// 短信设置保存 +export function setSmsConfig(params: any) { + return request.post({ url: '/setting/sms/save', params }) +} diff --git a/admin/src/api/org/department.ts b/admin/src/api/org/department.ts new file mode 100644 index 0000000..b4899a0 --- /dev/null +++ b/admin/src/api/org/department.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 部门列表 +export function deptLists(params?: any) { + return request.get({ url: '/system/dept/list', params }) +} + +// 添加部门 +export function deptAdd(params: any) { + return request.post({ url: '/system/dept/add', params }) +} + +// 编辑部门 +export function deptEdit(params: any) { + return request.post({ url: '/system/dept/edit', params }) +} + +// 删除部门 +export function deptDelete(params: any) { + return request.post({ url: '/system/dept/del', params }) +} + +// 部门详情 +export function deptDetail(params?: any) { + return request.get({ url: '/system/dept/detail', params }) +} diff --git a/admin/src/api/org/post.ts b/admin/src/api/org/post.ts new file mode 100644 index 0000000..63a15fc --- /dev/null +++ b/admin/src/api/org/post.ts @@ -0,0 +1,30 @@ +import request from '@/utils/request' + +// 岗位列表 +export function postLists(params?: any) { + return request.get({ url: '/system/post/list', params }) +} +// 岗位列表 +export function postAll(params?: any) { + return request.get({ url: '/system/post/all', params }) +} + +// 添加岗位 +export function postAdd(params: any) { + return request.post({ url: '/system/post/add', params }) +} + +// 编辑岗位 +export function postEdit(params: any) { + return request.post({ url: '/system/post/edit', params }) +} + +// 删除岗位 +export function postDelete(params: any) { + return request.post({ url: '/system/post/del', params }) +} + +// 岗位详情 +export function postDetail(params: any) { + return request.get({ url: '/system/post/detail', params }) +} diff --git a/admin/src/api/perms/admin.ts b/admin/src/api/perms/admin.ts new file mode 100644 index 0000000..a54b275 --- /dev/null +++ b/admin/src/api/perms/admin.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 管理员列表 +export function adminLists(params: any) { + return request.get({ url: '/system/admin/list', params }) +} + +// 管理员添加 +export function adminAdd(params: any) { + return request.post({ url: '/system/admin/add', params }) +} + +// 管理员编辑 +export function adminDetail(params: any) { + return request.get({ url: '/system/admin/detail', params }) +} + +// 管理员编辑 +export function adminEdit(params: any) { + return request.post({ url: '/system/admin/edit', params }) +} + +// 管理员删除 +export function adminDelete(params: any) { + return request.post({ url: '/system/admin/del', params }) +} + +// 管理员删除 +export function adminStatus(params: any) { + return request.post({ url: '/system/admin/disable', params }) +} diff --git a/admin/src/api/perms/menu.ts b/admin/src/api/perms/menu.ts new file mode 100644 index 0000000..577e143 --- /dev/null +++ b/admin/src/api/perms/menu.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 菜单列表 +export function menuLists(params?: Record) { + return request.get({ url: '/system/menu/list', params }) +} + +// 添加菜单 +export function menuAdd(params: Record) { + return request.post({ url: '/system/menu/add', params }) +} + +// 编辑菜单 +export function menuEdit(params: Record) { + return request.post({ url: '/system/menu/edit', params }) +} + +// 菜单删除 +export function menuDelete(params: Record) { + return request.post({ url: '/system/menu/del', params }) +} + +// 菜单删除 +export function menuDetail(params: Record) { + return request.get({ url: '/system/menu/detail', params }) +} diff --git a/admin/src/api/perms/role.ts b/admin/src/api/perms/role.ts new file mode 100644 index 0000000..3225443 --- /dev/null +++ b/admin/src/api/perms/role.ts @@ -0,0 +1,29 @@ +import request from '@/utils/request' + +// 角色列表 +export function roleLists(params: any) { + return request.get({ url: '/system/role/list', params }) +} + +// 角色列表 +export function roleAll(params?: any) { + return request.get({ url: '/system/role/all', params }) +} + +// 角色列表 +export function roleDetail(params: any) { + return request.get({ url: '/system/role/detail', params }) +} + +// 添加角色 +export function roleAdd(params: any) { + return request.post({ url: '/system/role/add', params }) +} +// 编辑角色 +export function roleEdit(params: any) { + return request.post({ url: '/system/role/edit', params }) +} +// 删除角色 +export function roleDelete(params: any) { + return request.post({ url: '/system/role/del', params }) +} diff --git a/admin/src/api/setting/dict.ts b/admin/src/api/setting/dict.ts new file mode 100644 index 0000000..1d5d2a8 --- /dev/null +++ b/admin/src/api/setting/dict.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request' + +// 字典类型列表 +export function dictTypeLists(params?: any) { + return request.get({ url: '/setting/dict/type/list', params }) +} + +// 字典类型列表 +export function dictTypeAll(params?: any) { + return request.get({ url: '/setting/dict/type/all', params }) +} + +// 添加字典类型 +export function dictTypeAdd(params: any) { + return request.post({ url: '/setting/dict/type/add', params }) +} + +// 编辑字典类型 +export function dictTypeEdit(params: any) { + return request.post({ url: '/setting/dict/type/edit', params }) +} + +// 删除字典类型 +export function dictTypeDelete(params: any) { + return request.post({ url: '/setting/dict/type/del', params }) +} + +// 字典数据列表 +export function dictDataLists(params: any) { + return request.get( + { url: '/setting/dict/data/list', params }, + { + ignoreCancelToken: true + } + ) +} + +// 字典数据列表 +export function dictDataAll(params: any) { + return request.get( + { url: '/setting/dict/data/all', params }, + { + ignoreCancelToken: true + } + ) +} + +// 添加字典数据 +export function dictDataAdd(params: any) { + return request.post({ url: '/setting/dict/data/add', params }) +} + +// 编辑字典数据 +export function dictDataEdit(params: any) { + return request.post({ url: '/setting/dict/data/edit', params }) +} + +// 删除字典数据 +export function dictDataDelete(params: any) { + return request.post({ url: '/setting/dict/data/del', params }) +} diff --git a/admin/src/api/setting/search.ts b/admin/src/api/setting/search.ts new file mode 100644 index 0000000..715402d --- /dev/null +++ b/admin/src/api/setting/search.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +/** + * @return { Promise } + * @description 获取热门搜索数据 + */ +export function getSearch() { + return request.get({ url: '/setting/search/detail' }) +} + +export interface List { + name: string // 搜索关键字 + sort: number // 热门搜索排序 +} + +export interface Search { + isHotSearch: number // 是否开启搜索0/1 + list: List[] +} +/** + * @return { Promise } + * @param { Search } Search + * @description 设置热门搜索 + */ +export function setSearch(params: Search) { + return request.post({ url: '/setting/search/save', params }) +} diff --git a/admin/src/api/setting/storage.ts b/admin/src/api/setting/storage.ts new file mode 100644 index 0000000..268d254 --- /dev/null +++ b/admin/src/api/setting/storage.ts @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +// 获取存储引擎列表 +export function storageLists() { + return request.get({ url: '/setting/storage/list' }) +} + +// 设置存储引擎信息 +export function storageChange(params: any) { + return request.post({ url: '/setting/storage/change', params }) +} + +// 设置存储引擎信息 +export function storageSetup(params: any) { + return request.post({ url: '/setting/storage/edit', params }) +} + +// 获取存储配置信息 +export function storageDetail(params: any) { + return request.get({ url: '/setting/storage/detail', params }) +} diff --git a/admin/src/api/setting/system.ts b/admin/src/api/setting/system.ts new file mode 100644 index 0000000..a9bcf6f --- /dev/null +++ b/admin/src/api/setting/system.ts @@ -0,0 +1,16 @@ +import request from '@/utils/request' + +// 获取系统环境 +export function systemInfo() { + return request.get({ url: '/monitor/server' }) +} + +// 获取系统日志列表 +export function systemLogLists(params: any) { + return request.get({ url: '/system/log/operate', params }) +} + +// 系统缓存监控 +export function systemCache() { + return request.get({ url: '/monitor/cache' }) +} diff --git a/admin/src/api/setting/user.ts b/admin/src/api/setting/user.ts new file mode 100644 index 0000000..946f4b0 --- /dev/null +++ b/admin/src/api/setting/user.ts @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +/** + * @return { Promise } + * @description 获取用户设置 + */ +export function getUserSetup() { + return request.get({ url: '/setting/user/detail' }) +} + +/** + * @return { Promise } + * @param { string } defaultAvatar 默认用户头像 + * @description 设置用户设置 + */ +export function setUserSetup(params: { defaultAvatar: string }) { + return request.post({ url: '/setting/user/save', params }) +} + +/** + * @return { Promise } + * @description 设置登录注册规则 + */ +export function getLogin() { + return request.get({ url: '/setting/login/detail' }) +} + +export interface LoginSetup { + loginWay: number[] | any // 登录方式, 逗号隔开 + forceBindMobile: number // 强制绑定手机 0/1 + openAgreement: number // 是否开启协议 0/1 + openOtherAuth: number // 第三方登录 0/1 + autoLoginAuth: number[] | any // 第三方自动登录 逗号隔开 +} +/** + * @return { Promise } + * @param { LoginSetup } LoginSetup + * @description 设置登录注册规则 + */ +export function setLogin(params: LoginSetup) { + return request.post({ url: '/setting/login/save', params }) +} diff --git a/admin/src/api/setting/website.ts b/admin/src/api/setting/website.ts new file mode 100644 index 0000000..294575b --- /dev/null +++ b/admin/src/api/setting/website.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 获取备案信息 +export function getCopyright() { + return request.get({ url: '/setting/copyright/detail' }) +} +// 设置备案信息 +export function setCopyright(params: any) { + return request.post({ url: '/setting/copyright/save', params }) +} +// 获取网站信息 +export function getWebsite() { + return request.get({ url: '/setting/website/detail' }) +} +// 设置网站信息 +export function setWebsite(params: any) { + return request.post({ url: '/setting/website/save', params }) +} + +// 获取政策协议 +export function getProtocol() { + return request.get({ url: '/setting/protocol/detail' }) +} +// 设置政策协议 +export function setProtocol(params: any) { + return request.post({ url: '/setting/protocol/save', params }) +} diff --git a/admin/src/api/tools/code.ts b/admin/src/api/tools/code.ts new file mode 100644 index 0000000..980ead5 --- /dev/null +++ b/admin/src/api/tools/code.ts @@ -0,0 +1,66 @@ +import request from '@/utils/request' + +// 代码生成已选数据表列表接口 +export function generateTable(params: any) { + return request.get({ url: '/gen/list', params }) +} + +// 数据表列表接口 +export function dataTable(params: any) { + return request.get({ url: '/gen/db', params }) +} + +//选择要生成代码的数据表 +export function selectTable(params: any) { + return request.post( + { url: '/gen/importTable', params }, + { + isParamsToData: false + } + ) +} + +// 已选择的数据表详情 +export function tableDetail(params: any) { + return request.get({ url: '/gen/detail', params }) +} + +//同步字段 +export function syncColumn(params: any) { + return request.post( + { url: '/gen/syncTable', params }, + { + isParamsToData: false + } + ) +} + +//删除已选择的数据表 +export function generateDelete(params: any) { + return request.post({ url: '/gen/delTable', params }) +} + +//编辑已选表字段 +export function generateEdit(params: any) { + return request.post({ url: '/gen/editTable', params }) +} + +//预览代码 +export function generatePreview(params: any) { + return request.get({ url: '/gen/previewCode', params }) +} + +//生成代码 +export function generateCode(params: any) { + return request.get({ url: '/gen/genCode', params }) +} + +//下载代码 +export function downloadCode(params: any) { + return request.get( + { responseType: 'blob', url: '/gen/downloadCode', params }, + { + isTransformResponse: false + } + ) +} diff --git a/admin/src/api/user.ts b/admin/src/api/user.ts new file mode 100644 index 0000000..ce54b58 --- /dev/null +++ b/admin/src/api/user.ts @@ -0,0 +1,27 @@ +import config from '@/config' +import request from '@/utils/request' + +// 登录 +export function login(params: Record) { + return request.post({ url: '/system/login', params: { ...params, terminal: config.terminal } }) +} + +// 退出登录 +export function logout() { + return request.post({ url: '/system/logout' }) +} + +// 用户信息 +export function getUserInfo() { + return request.get({ url: '/system/admin/self' }) +} + +// 菜单路由 +export function getMenu() { + return request.get({ url: '/system/menu/route' }) +} + +// 编辑管理员信息 +export function setUserInfo(params: any) { + return request.post({ url: '/system/admin/upInfo', params }) +} diff --git a/admin/src/assets/icons/Androidfanhui.svg b/admin/src/assets/icons/Androidfanhui.svg new file mode 100644 index 0000000..e9ada24 --- /dev/null +++ b/admin/src/assets/icons/Androidfanhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/KMSguanli.svg b/admin/src/assets/icons/KMSguanli.svg new file mode 100644 index 0000000..7c65298 --- /dev/null +++ b/admin/src/assets/icons/KMSguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/KTVyuding.svg b/admin/src/assets/icons/KTVyuding.svg new file mode 100644 index 0000000..8187b5f --- /dev/null +++ b/admin/src/assets/icons/KTVyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/a-tixingdengpao.svg b/admin/src/assets/icons/a-tixingdengpao.svg new file mode 100644 index 0000000..7074ae7 --- /dev/null +++ b/admin/src/assets/icons/a-tixingdengpao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/anquan.svg b/admin/src/assets/icons/anquan.svg new file mode 100644 index 0000000..bf90259 --- /dev/null +++ b/admin/src/assets/icons/anquan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/anquan_mian.svg b/admin/src/assets/icons/anquan_mian.svg new file mode 100644 index 0000000..f3486b5 --- /dev/null +++ b/admin/src/assets/icons/anquan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/anquan_mian1.svg b/admin/src/assets/icons/anquan_mian1.svg new file mode 100644 index 0000000..f3486b5 --- /dev/null +++ b/admin/src/assets/icons/anquan_mian1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/banxing_mian.svg b/admin/src/assets/icons/banxing_mian.svg new file mode 100644 index 0000000..3cb468f --- /dev/null +++ b/admin/src/assets/icons/banxing_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/baoxian.svg b/admin/src/assets/icons/baoxian.svg new file mode 100644 index 0000000..9885e88 --- /dev/null +++ b/admin/src/assets/icons/baoxian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/bendishenghuodaxue.svg b/admin/src/assets/icons/bendishenghuodaxue.svg new file mode 100644 index 0000000..4754e16 --- /dev/null +++ b/admin/src/assets/icons/bendishenghuodaxue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/bianji.svg b/admin/src/assets/icons/bianji.svg new file mode 100644 index 0000000..c8674e7 --- /dev/null +++ b/admin/src/assets/icons/bianji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/biaoqing.svg b/admin/src/assets/icons/biaoqing.svg new file mode 100644 index 0000000..fcc84fb --- /dev/null +++ b/admin/src/assets/icons/biaoqing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/bukejian.svg b/admin/src/assets/icons/bukejian.svg new file mode 100644 index 0000000..c79cd78 --- /dev/null +++ b/admin/src/assets/icons/bukejian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/caipinguanli.svg b/admin/src/assets/icons/caipinguanli.svg new file mode 100644 index 0000000..3b1fc28 --- /dev/null +++ b/admin/src/assets/icons/caipinguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/caiwu.svg b/admin/src/assets/icons/caiwu.svg new file mode 100644 index 0000000..e3e92f4 --- /dev/null +++ b/admin/src/assets/icons/caiwu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/caiwu_jifen.svg b/admin/src/assets/icons/caiwu_jifen.svg new file mode 100644 index 0000000..07d01df --- /dev/null +++ b/admin/src/assets/icons/caiwu_jifen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/caiwu_tixian.svg b/admin/src/assets/icons/caiwu_tixian.svg new file mode 100644 index 0000000..982ac58 --- /dev/null +++ b/admin/src/assets/icons/caiwu_tixian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/canyinfuwu.svg b/admin/src/assets/icons/canyinfuwu.svg new file mode 100644 index 0000000..5d87395 --- /dev/null +++ b/admin/src/assets/icons/canyinfuwu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/carryout.svg b/admin/src/assets/icons/carryout.svg new file mode 100644 index 0000000..4a06640 --- /dev/null +++ b/admin/src/assets/icons/carryout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/chexiao.svg b/admin/src/assets/icons/chexiao.svg new file mode 100644 index 0000000..b9e6e5d --- /dev/null +++ b/admin/src/assets/icons/chexiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/chihuohongbao.svg b/admin/src/assets/icons/chihuohongbao.svg new file mode 100644 index 0000000..bb1fb66 --- /dev/null +++ b/admin/src/assets/icons/chihuohongbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/chuangyiwuliao.svg b/admin/src/assets/icons/chuangyiwuliao.svg new file mode 100644 index 0000000..045057d --- /dev/null +++ b/admin/src/assets/icons/chuangyiwuliao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/close.svg b/admin/src/assets/icons/close.svg new file mode 100644 index 0000000..54f3e08 --- /dev/null +++ b/admin/src/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/daiyunying.svg b/admin/src/assets/icons/daiyunying.svg new file mode 100644 index 0000000..dc1c7c5 --- /dev/null +++ b/admin/src/assets/icons/daiyunying.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/danwei.svg b/admin/src/assets/icons/danwei.svg new file mode 100644 index 0000000..ba527e8 --- /dev/null +++ b/admin/src/assets/icons/danwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/danxuankuang.svg b/admin/src/assets/icons/danxuankuang.svg new file mode 100644 index 0000000..2ef171c --- /dev/null +++ b/admin/src/assets/icons/danxuankuang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/danxuanxuanzhong.svg b/admin/src/assets/icons/danxuanxuanzhong.svg new file mode 100644 index 0000000..c7f230c --- /dev/null +++ b/admin/src/assets/icons/danxuanxuanzhong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dayin.svg b/admin/src/assets/icons/dayin.svg new file mode 100644 index 0000000..0d2291d --- /dev/null +++ b/admin/src/assets/icons/dayin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dayin_mian.svg b/admin/src/assets/icons/dayin_mian.svg new file mode 100644 index 0000000..7989ff6 --- /dev/null +++ b/admin/src/assets/icons/dayin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/del.svg b/admin/src/assets/icons/del.svg new file mode 100644 index 0000000..f938140 --- /dev/null +++ b/admin/src/assets/icons/del.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/diancanshezhi.svg b/admin/src/assets/icons/diancanshezhi.svg new file mode 100644 index 0000000..8723cbf --- /dev/null +++ b/admin/src/assets/icons/diancanshezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dianhua.svg b/admin/src/assets/icons/dianhua.svg new file mode 100644 index 0000000..be006a9 --- /dev/null +++ b/admin/src/assets/icons/dianhua.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dianhua_mian.svg b/admin/src/assets/icons/dianhua_mian.svg new file mode 100644 index 0000000..5554077 --- /dev/null +++ b/admin/src/assets/icons/dianhua_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dianpu_fengge.svg b/admin/src/assets/icons/dianpu_fengge.svg new file mode 100644 index 0000000..a7dc3e1 --- /dev/null +++ b/admin/src/assets/icons/dianpu_fengge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dianputuijian.svg b/admin/src/assets/icons/dianputuijian.svg new file mode 100644 index 0000000..0e8a4c8 --- /dev/null +++ b/admin/src/assets/icons/dianputuijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dianzifapiao.svg b/admin/src/assets/icons/dianzifapiao.svg new file mode 100644 index 0000000..b2db463 --- /dev/null +++ b/admin/src/assets/icons/dianzifapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingcan.svg b/admin/src/assets/icons/dingcan.svg new file mode 100644 index 0000000..46d4e95 --- /dev/null +++ b/admin/src/assets/icons/dingcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingdan.svg b/admin/src/assets/icons/dingdan.svg new file mode 100644 index 0000000..e5b35a9 --- /dev/null +++ b/admin/src/assets/icons/dingdan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingdan1.svg b/admin/src/assets/icons/dingdan1.svg new file mode 100644 index 0000000..5330a6a --- /dev/null +++ b/admin/src/assets/icons/dingdan1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingdan_mian.svg b/admin/src/assets/icons/dingdan_mian.svg new file mode 100644 index 0000000..0929276 --- /dev/null +++ b/admin/src/assets/icons/dingdan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingwei.svg b/admin/src/assets/icons/dingwei.svg new file mode 100644 index 0000000..ef573a7 --- /dev/null +++ b/admin/src/assets/icons/dingwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/dingwei_mian.svg b/admin/src/assets/icons/dingwei_mian.svg new file mode 100644 index 0000000..8c86674 --- /dev/null +++ b/admin/src/assets/icons/dingwei_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/ditu.svg b/admin/src/assets/icons/ditu.svg new file mode 100644 index 0000000..6b5e5f2 --- /dev/null +++ b/admin/src/assets/icons/ditu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/ditu_mian.svg b/admin/src/assets/icons/ditu_mian.svg new file mode 100644 index 0000000..bb542bf --- /dev/null +++ b/admin/src/assets/icons/ditu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/duizhang.svg b/admin/src/assets/icons/duizhang.svg new file mode 100644 index 0000000..f63d6df --- /dev/null +++ b/admin/src/assets/icons/duizhang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/elemo.svg b/admin/src/assets/icons/elemo.svg new file mode 100644 index 0000000..c1d5388 --- /dev/null +++ b/admin/src/assets/icons/elemo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/ezhanggui.svg b/admin/src/assets/icons/ezhanggui.svg new file mode 100644 index 0000000..cd50b0b --- /dev/null +++ b/admin/src/assets/icons/ezhanggui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/falvfuwubaoxiaohei.svg b/admin/src/assets/icons/falvfuwubaoxiaohei.svg new file mode 100644 index 0000000..27ea856 --- /dev/null +++ b/admin/src/assets/icons/falvfuwubaoxiaohei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fengniaopaotui.svg b/admin/src/assets/icons/fengniaopaotui.svg new file mode 100644 index 0000000..3f5f7b1 --- /dev/null +++ b/admin/src/assets/icons/fengniaopaotui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fenxiang.svg b/admin/src/assets/icons/fenxiang.svg new file mode 100644 index 0000000..e4eb7cc --- /dev/null +++ b/admin/src/assets/icons/fenxiang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fukuan.svg b/admin/src/assets/icons/fukuan.svg new file mode 100644 index 0000000..939c745 --- /dev/null +++ b/admin/src/assets/icons/fukuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fukuan_mian.svg b/admin/src/assets/icons/fukuan_mian.svg new file mode 100644 index 0000000..ba094cc --- /dev/null +++ b/admin/src/assets/icons/fukuan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fullscreen-exit.svg b/admin/src/assets/icons/fullscreen-exit.svg new file mode 100644 index 0000000..e845a79 --- /dev/null +++ b/admin/src/assets/icons/fullscreen-exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fullscreen.svg b/admin/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..516e890 --- /dev/null +++ b/admin/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fuwushichang.svg b/admin/src/assets/icons/fuwushichang.svg new file mode 100644 index 0000000..2564370 --- /dev/null +++ b/admin/src/assets/icons/fuwushichang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/fuzhi.svg b/admin/src/assets/icons/fuzhi.svg new file mode 100644 index 0000000..659c6e0 --- /dev/null +++ b/admin/src/assets/icons/fuzhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gaode.svg b/admin/src/assets/icons/gaode.svg new file mode 100644 index 0000000..8d26343 --- /dev/null +++ b/admin/src/assets/icons/gaode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gengduo.svg b/admin/src/assets/icons/gengduo.svg new file mode 100644 index 0000000..2956729 --- /dev/null +++ b/admin/src/assets/icons/gengduo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gengduoandroid.svg b/admin/src/assets/icons/gengduoandroid.svg new file mode 100644 index 0000000..ecde71b --- /dev/null +++ b/admin/src/assets/icons/gengduoandroid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gift.svg b/admin/src/assets/icons/gift.svg new file mode 100644 index 0000000..add9ce8 --- /dev/null +++ b/admin/src/assets/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gongyingshang.svg b/admin/src/assets/icons/gongyingshang.svg new file mode 100644 index 0000000..9426995 --- /dev/null +++ b/admin/src/assets/icons/gongyingshang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/goods.svg b/admin/src/assets/icons/goods.svg new file mode 100644 index 0000000..b80fbed --- /dev/null +++ b/admin/src/assets/icons/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gou.svg b/admin/src/assets/icons/gou.svg new file mode 100644 index 0000000..6354197 --- /dev/null +++ b/admin/src/assets/icons/gou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gouwuche.svg b/admin/src/assets/icons/gouwuche.svg new file mode 100644 index 0000000..6e76f7d --- /dev/null +++ b/admin/src/assets/icons/gouwuche.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gouxuan.svg b/admin/src/assets/icons/gouxuan.svg new file mode 100644 index 0000000..8fe88a6 --- /dev/null +++ b/admin/src/assets/icons/gouxuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gouxuan_mian.svg b/admin/src/assets/icons/gouxuan_mian.svg new file mode 100644 index 0000000..375972b --- /dev/null +++ b/admin/src/assets/icons/gouxuan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/guanbi.svg b/admin/src/assets/icons/guanbi.svg new file mode 100644 index 0000000..831bd0e --- /dev/null +++ b/admin/src/assets/icons/guanbi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/guanli.svg b/admin/src/assets/icons/guanli.svg new file mode 100644 index 0000000..4848092 --- /dev/null +++ b/admin/src/assets/icons/guanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/guanli_mian.svg b/admin/src/assets/icons/guanli_mian.svg new file mode 100644 index 0000000..db46ff1 --- /dev/null +++ b/admin/src/assets/icons/guanli_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/gukefapiao.svg b/admin/src/assets/icons/gukefapiao.svg new file mode 100644 index 0000000..341b686 --- /dev/null +++ b/admin/src/assets/icons/gukefapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/haibaosheji.svg b/admin/src/assets/icons/haibaosheji.svg new file mode 100644 index 0000000..f875157 --- /dev/null +++ b/admin/src/assets/icons/haibaosheji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/heshoujilu.svg b/admin/src/assets/icons/heshoujilu.svg new file mode 100644 index 0000000..cd25273 --- /dev/null +++ b/admin/src/assets/icons/heshoujilu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/heshoujilu1.svg b/admin/src/assets/icons/heshoujilu1.svg new file mode 100644 index 0000000..f8d1bd4 --- /dev/null +++ b/admin/src/assets/icons/heshoujilu1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/hexiao_order.svg b/admin/src/assets/icons/hexiao_order.svg new file mode 100644 index 0000000..f1c4034 --- /dev/null +++ b/admin/src/assets/icons/hexiao_order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/hide-2.svg b/admin/src/assets/icons/hide-2.svg new file mode 100644 index 0000000..8c74146 --- /dev/null +++ b/admin/src/assets/icons/hide-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/hide.svg b/admin/src/assets/icons/hide.svg new file mode 100644 index 0000000..5cbbabd --- /dev/null +++ b/admin/src/assets/icons/hide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/hongbao.svg b/admin/src/assets/icons/hongbao.svg new file mode 100644 index 0000000..9d331b5 --- /dev/null +++ b/admin/src/assets/icons/hongbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huiche.svg b/admin/src/assets/icons/huiche.svg new file mode 100644 index 0000000..5022718 --- /dev/null +++ b/admin/src/assets/icons/huiche.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huiyuanyingxiao.svg b/admin/src/assets/icons/huiyuanyingxiao.svg new file mode 100644 index 0000000..ae06769 --- /dev/null +++ b/admin/src/assets/icons/huiyuanyingxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huodongbaoming.svg b/admin/src/assets/icons/huodongbaoming.svg new file mode 100644 index 0000000..0c60672 --- /dev/null +++ b/admin/src/assets/icons/huodongbaoming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huodongguanli.svg b/admin/src/assets/icons/huodongguanli.svg new file mode 100644 index 0000000..def7109 --- /dev/null +++ b/admin/src/assets/icons/huodongguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huodongzhongxin.svg b/admin/src/assets/icons/huodongzhongxin.svg new file mode 100644 index 0000000..f22bb26 --- /dev/null +++ b/admin/src/assets/icons/huodongzhongxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huojian.svg b/admin/src/assets/icons/huojian.svg new file mode 100644 index 0000000..f439dd8 --- /dev/null +++ b/admin/src/assets/icons/huojian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huojian_mian.svg b/admin/src/assets/icons/huojian_mian.svg new file mode 100644 index 0000000..812d3be --- /dev/null +++ b/admin/src/assets/icons/huojian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/huolala.svg b/admin/src/assets/icons/huolala.svg new file mode 100644 index 0000000..a42ade7 --- /dev/null +++ b/admin/src/assets/icons/huolala.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/iOSfanhui.svg b/admin/src/assets/icons/iOSfanhui.svg new file mode 100644 index 0000000..8aeefbb --- /dev/null +++ b/admin/src/assets/icons/iOSfanhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jia.svg b/admin/src/assets/icons/jia.svg new file mode 100644 index 0000000..18fbd45 --- /dev/null +++ b/admin/src/assets/icons/jia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jia_mian.svg b/admin/src/assets/icons/jia_mian.svg new file mode 100644 index 0000000..5899c91 --- /dev/null +++ b/admin/src/assets/icons/jia_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jian.svg b/admin/src/assets/icons/jian.svg new file mode 100644 index 0000000..295037f --- /dev/null +++ b/admin/src/assets/icons/jian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jian_mian.svg b/admin/src/assets/icons/jian_mian.svg new file mode 100644 index 0000000..e9dfa91 --- /dev/null +++ b/admin/src/assets/icons/jian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jianpan.svg b/admin/src/assets/icons/jianpan.svg new file mode 100644 index 0000000..5a7dcb9 --- /dev/null +++ b/admin/src/assets/icons/jianpan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jianpanshanchu.svg b/admin/src/assets/icons/jianpanshanchu.svg new file mode 100644 index 0000000..a5a5de1 --- /dev/null +++ b/admin/src/assets/icons/jianpanshanchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jianshao.svg b/admin/src/assets/icons/jianshao.svg new file mode 100644 index 0000000..0a4d919 --- /dev/null +++ b/admin/src/assets/icons/jianshao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jiaopeiwangputong.svg b/admin/src/assets/icons/jiaopeiwangputong.svg new file mode 100644 index 0000000..ec73071 --- /dev/null +++ b/admin/src/assets/icons/jiaopeiwangputong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jiaoyi.svg b/admin/src/assets/icons/jiaoyi.svg new file mode 100644 index 0000000..1396bac --- /dev/null +++ b/admin/src/assets/icons/jiaoyi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jiedan.svg b/admin/src/assets/icons/jiedan.svg new file mode 100644 index 0000000..fcbe7a1 --- /dev/null +++ b/admin/src/assets/icons/jiedan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jiekuan.svg b/admin/src/assets/icons/jiekuan.svg new file mode 100644 index 0000000..4b7377f --- /dev/null +++ b/admin/src/assets/icons/jiekuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingshi.svg b/admin/src/assets/icons/jingshi.svg new file mode 100644 index 0000000..3cecfc7 --- /dev/null +++ b/admin/src/assets/icons/jingshi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingshi_mian.svg b/admin/src/assets/icons/jingshi_mian.svg new file mode 100644 index 0000000..fe636ee --- /dev/null +++ b/admin/src/assets/icons/jingshi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingshi_mian1.svg b/admin/src/assets/icons/jingshi_mian1.svg new file mode 100644 index 0000000..fe636ee --- /dev/null +++ b/admin/src/assets/icons/jingshi_mian1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingyin.svg b/admin/src/assets/icons/jingyin.svg new file mode 100644 index 0000000..753f254 --- /dev/null +++ b/admin/src/assets/icons/jingyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingyin_mian.svg b/admin/src/assets/icons/jingyin_mian.svg new file mode 100644 index 0000000..ce56e68 --- /dev/null +++ b/admin/src/assets/icons/jingyin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingying.svg b/admin/src/assets/icons/jingying.svg new file mode 100644 index 0000000..5630813 --- /dev/null +++ b/admin/src/assets/icons/jingying.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingying_mian.svg b/admin/src/assets/icons/jingying_mian.svg new file mode 100644 index 0000000..4e7ca35 --- /dev/null +++ b/admin/src/assets/icons/jingying_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingyinggonglve.svg b/admin/src/assets/icons/jingyinggonglve.svg new file mode 100644 index 0000000..0cd3755 --- /dev/null +++ b/admin/src/assets/icons/jingyinggonglve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jingzhunyingxiao.svg b/admin/src/assets/icons/jingzhunyingxiao.svg new file mode 100644 index 0000000..781b0bb --- /dev/null +++ b/admin/src/assets/icons/jingzhunyingxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/jinhuo.svg b/admin/src/assets/icons/jinhuo.svg new file mode 100644 index 0000000..c5d9214 --- /dev/null +++ b/admin/src/assets/icons/jinhuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kaitongwaimai.svg b/admin/src/assets/icons/kaitongwaimai.svg new file mode 100644 index 0000000..a6daad9 --- /dev/null +++ b/admin/src/assets/icons/kaitongwaimai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kanjia.svg b/admin/src/assets/icons/kanjia.svg new file mode 100644 index 0000000..9f6840b --- /dev/null +++ b/admin/src/assets/icons/kanjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kefu.svg b/admin/src/assets/icons/kefu.svg new file mode 100644 index 0000000..f32cacd --- /dev/null +++ b/admin/src/assets/icons/kefu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kejian.svg b/admin/src/assets/icons/kejian.svg new file mode 100644 index 0000000..8b89874 --- /dev/null +++ b/admin/src/assets/icons/kejian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kejian_mian.svg b/admin/src/assets/icons/kejian_mian.svg new file mode 100644 index 0000000..62223b4 --- /dev/null +++ b/admin/src/assets/icons/kejian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/keziyuyue.svg b/admin/src/assets/icons/keziyuyue.svg new file mode 100644 index 0000000..0d2f1f9 --- /dev/null +++ b/admin/src/assets/icons/keziyuyue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kezizhongxin.svg b/admin/src/assets/icons/kezizhongxin.svg new file mode 100644 index 0000000..7fbcc6c --- /dev/null +++ b/admin/src/assets/icons/kezizhongxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/koubei.svg b/admin/src/assets/icons/koubei.svg new file mode 100644 index 0000000..a744077 --- /dev/null +++ b/admin/src/assets/icons/koubei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/kuaijiehuifu.svg b/admin/src/assets/icons/kuaijiehuifu.svg new file mode 100644 index 0000000..72aa5c5 --- /dev/null +++ b/admin/src/assets/icons/kuaijiehuifu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/ladu_mian.svg b/admin/src/assets/icons/ladu_mian.svg new file mode 100644 index 0000000..a40816c --- /dev/null +++ b/admin/src/assets/icons/ladu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/lanyadingwei.svg b/admin/src/assets/icons/lanyadingwei.svg new file mode 100644 index 0000000..205653f --- /dev/null +++ b/admin/src/assets/icons/lanyadingwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/list-2.svg b/admin/src/assets/icons/list-2.svg new file mode 100644 index 0000000..1f471f3 --- /dev/null +++ b/admin/src/assets/icons/list-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/mendiandongtai.svg b/admin/src/assets/icons/mendiandongtai.svg new file mode 100644 index 0000000..7a7b415 --- /dev/null +++ b/admin/src/assets/icons/mendiandongtai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/mishiyuding.svg b/admin/src/assets/icons/mishiyuding.svg new file mode 100644 index 0000000..b856afa --- /dev/null +++ b/admin/src/assets/icons/mishiyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/mishiyuding1.svg b/admin/src/assets/icons/mishiyuding1.svg new file mode 100644 index 0000000..7ac9101 --- /dev/null +++ b/admin/src/assets/icons/mishiyuding1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/notice_buyer.svg b/admin/src/assets/icons/notice_buyer.svg new file mode 100644 index 0000000..bab1997 --- /dev/null +++ b/admin/src/assets/icons/notice_buyer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/open.svg b/admin/src/assets/icons/open.svg new file mode 100644 index 0000000..3cbd08c --- /dev/null +++ b/admin/src/assets/icons/open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/paiduiquhao.svg b/admin/src/assets/icons/paiduiquhao.svg new file mode 100644 index 0000000..fb7abc9 --- /dev/null +++ b/admin/src/assets/icons/paiduiquhao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/paimai.svg b/admin/src/assets/icons/paimai.svg new file mode 100644 index 0000000..0139a69 --- /dev/null +++ b/admin/src/assets/icons/paimai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/pingjia.svg b/admin/src/assets/icons/pingjia.svg new file mode 100644 index 0000000..9b39672 --- /dev/null +++ b/admin/src/assets/icons/pingjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/pingtaifapiao.svg b/admin/src/assets/icons/pingtaifapiao.svg new file mode 100644 index 0000000..b6b3315 --- /dev/null +++ b/admin/src/assets/icons/pingtaifapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/pinpai.svg b/admin/src/assets/icons/pinpai.svg new file mode 100644 index 0000000..f4b129c --- /dev/null +++ b/admin/src/assets/icons/pinpai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qianbao.svg b/admin/src/assets/icons/qianbao.svg new file mode 100644 index 0000000..f384250 --- /dev/null +++ b/admin/src/assets/icons/qianbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qianbao_mian.svg b/admin/src/assets/icons/qianbao_mian.svg new file mode 100644 index 0000000..897f029 --- /dev/null +++ b/admin/src/assets/icons/qianbao_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qiehuan.svg b/admin/src/assets/icons/qiehuan.svg new file mode 100644 index 0000000..37e0a94 --- /dev/null +++ b/admin/src/assets/icons/qiehuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qingchu.svg b/admin/src/assets/icons/qingchu.svg new file mode 100644 index 0000000..dc898ac --- /dev/null +++ b/admin/src/assets/icons/qingchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qingchu_mian.svg b/admin/src/assets/icons/qingchu_mian.svg new file mode 100644 index 0000000..94ecaa2 --- /dev/null +++ b/admin/src/assets/icons/qingchu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qishoupeisong.svg b/admin/src/assets/icons/qishoupeisong.svg new file mode 100644 index 0000000..9adc068 --- /dev/null +++ b/admin/src/assets/icons/qishoupeisong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qiyedingcan.svg b/admin/src/assets/icons/qiyedingcan.svg new file mode 100644 index 0000000..147c9e2 --- /dev/null +++ b/admin/src/assets/icons/qiyedingcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qiyedingcan1.svg b/admin/src/assets/icons/qiyedingcan1.svg new file mode 100644 index 0000000..a3c3277 --- /dev/null +++ b/admin/src/assets/icons/qiyedingcan1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/quanbu.svg b/admin/src/assets/icons/quanbu.svg new file mode 100644 index 0000000..db088f5 --- /dev/null +++ b/admin/src/assets/icons/quanbu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/quanping.svg b/admin/src/assets/icons/quanping.svg new file mode 100644 index 0000000..0a5cfbe --- /dev/null +++ b/admin/src/assets/icons/quanping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qudao.svg b/admin/src/assets/icons/qudao.svg new file mode 100644 index 0000000..e0fbf39 --- /dev/null +++ b/admin/src/assets/icons/qudao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/qudao_xiaochengxu.svg b/admin/src/assets/icons/qudao_xiaochengxu.svg new file mode 100644 index 0000000..54af407 --- /dev/null +++ b/admin/src/assets/icons/qudao_xiaochengxu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/rencaizhaopin.svg b/admin/src/assets/icons/rencaizhaopin.svg new file mode 100644 index 0000000..6113e53 --- /dev/null +++ b/admin/src/assets/icons/rencaizhaopin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/rili.svg b/admin/src/assets/icons/rili.svg new file mode 100644 index 0000000..5d751bf --- /dev/null +++ b/admin/src/assets/icons/rili.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/rili2.svg b/admin/src/assets/icons/rili2.svg new file mode 100644 index 0000000..ba2d55d --- /dev/null +++ b/admin/src/assets/icons/rili2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/rizhi.svg b/admin/src/assets/icons/rizhi.svg new file mode 100644 index 0000000..bfdf2b0 --- /dev/null +++ b/admin/src/assets/icons/rizhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/saoma.svg b/admin/src/assets/icons/saoma.svg new file mode 100644 index 0000000..260981d --- /dev/null +++ b/admin/src/assets/icons/saoma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/set_pay.svg b/admin/src/assets/icons/set_pay.svg new file mode 100644 index 0000000..639bb8e --- /dev/null +++ b/admin/src/assets/icons/set_pay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/set_peisong.svg b/admin/src/assets/icons/set_peisong.svg new file mode 100644 index 0000000..a87ca69 --- /dev/null +++ b/admin/src/assets/icons/set_peisong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/set_user.svg b/admin/src/assets/icons/set_user.svg new file mode 100644 index 0000000..800baf5 --- /dev/null +++ b/admin/src/assets/icons/set_user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/set_weihu.svg b/admin/src/assets/icons/set_weihu.svg new file mode 100644 index 0000000..e6765f1 --- /dev/null +++ b/admin/src/assets/icons/set_weihu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shanchu.svg b/admin/src/assets/icons/shanchu.svg new file mode 100644 index 0000000..9655138 --- /dev/null +++ b/admin/src/assets/icons/shanchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shanchu_mian.svg b/admin/src/assets/icons/shanchu_mian.svg new file mode 100644 index 0000000..17ffa4e --- /dev/null +++ b/admin/src/assets/icons/shanchu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shangchuan.svg b/admin/src/assets/icons/shangchuan.svg new file mode 100644 index 0000000..f2d1a01 --- /dev/null +++ b/admin/src/assets/icons/shangchuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shangchuanzhaopian.svg b/admin/src/assets/icons/shangchuanzhaopian.svg new file mode 100644 index 0000000..5e90e91 --- /dev/null +++ b/admin/src/assets/icons/shangchuanzhaopian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shangpinguanli.svg b/admin/src/assets/icons/shangpinguanli.svg new file mode 100644 index 0000000..c15f1a1 --- /dev/null +++ b/admin/src/assets/icons/shangpinguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shangpinzhushou.svg b/admin/src/assets/icons/shangpinzhushou.svg new file mode 100644 index 0000000..9972561 --- /dev/null +++ b/admin/src/assets/icons/shangpinzhushou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shangpuyuding.svg b/admin/src/assets/icons/shangpuyuding.svg new file mode 100644 index 0000000..4250f00 --- /dev/null +++ b/admin/src/assets/icons/shangpuyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shebeiguanli.svg b/admin/src/assets/icons/shebeiguanli.svg new file mode 100644 index 0000000..1ca4ef0 --- /dev/null +++ b/admin/src/assets/icons/shebeiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shengfuwangputong.svg b/admin/src/assets/icons/shengfuwangputong.svg new file mode 100644 index 0000000..467b687 --- /dev/null +++ b/admin/src/assets/icons/shengfuwangputong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shengyin.svg b/admin/src/assets/icons/shengyin.svg new file mode 100644 index 0000000..9b1d63b --- /dev/null +++ b/admin/src/assets/icons/shengyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shengyin_mian.svg b/admin/src/assets/icons/shengyin_mian.svg new file mode 100644 index 0000000..00c76a7 --- /dev/null +++ b/admin/src/assets/icons/shengyin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shezhi.svg b/admin/src/assets/icons/shezhi.svg new file mode 100644 index 0000000..785b60f --- /dev/null +++ b/admin/src/assets/icons/shezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shezhi_mian.svg b/admin/src/assets/icons/shezhi_mian.svg new file mode 100644 index 0000000..0bdc106 --- /dev/null +++ b/admin/src/assets/icons/shezhi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shichang.svg b/admin/src/assets/icons/shichang.svg new file mode 100644 index 0000000..d5d5d88 --- /dev/null +++ b/admin/src/assets/icons/shichang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shichang_mian.svg b/admin/src/assets/icons/shichang_mian.svg new file mode 100644 index 0000000..083b301 --- /dev/null +++ b/admin/src/assets/icons/shichang_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shijian.svg b/admin/src/assets/icons/shijian.svg new file mode 100644 index 0000000..9ad8b2e --- /dev/null +++ b/admin/src/assets/icons/shijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shijian_mian.svg b/admin/src/assets/icons/shijian_mian.svg new file mode 100644 index 0000000..6c00d41 --- /dev/null +++ b/admin/src/assets/icons/shijian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shoudan.svg b/admin/src/assets/icons/shoudan.svg new file mode 100644 index 0000000..9967dd8 --- /dev/null +++ b/admin/src/assets/icons/shoudan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shouqi.svg b/admin/src/assets/icons/shouqi.svg new file mode 100644 index 0000000..e8386f1 --- /dev/null +++ b/admin/src/assets/icons/shouqi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shouqi_mian.svg b/admin/src/assets/icons/shouqi_mian.svg new file mode 100644 index 0000000..b022d4c --- /dev/null +++ b/admin/src/assets/icons/shouqi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shouye.svg b/admin/src/assets/icons/shouye.svg new file mode 100644 index 0000000..288b24f --- /dev/null +++ b/admin/src/assets/icons/shouye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shouye_mian.svg b/admin/src/assets/icons/shouye_mian.svg new file mode 100644 index 0000000..d180e9b --- /dev/null +++ b/admin/src/assets/icons/shouye_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shouyiren.svg b/admin/src/assets/icons/shouyiren.svg new file mode 100644 index 0000000..3b409d2 --- /dev/null +++ b/admin/src/assets/icons/shouyiren.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/show.svg b/admin/src/assets/icons/show.svg new file mode 100644 index 0000000..2fdf9b9 --- /dev/null +++ b/admin/src/assets/icons/show.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuangjiantouxiangyou.svg b/admin/src/assets/icons/shuangjiantouxiangyou.svg new file mode 100644 index 0000000..56c0e61 --- /dev/null +++ b/admin/src/assets/icons/shuangjiantouxiangyou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuangjiantouxiangzuo.svg b/admin/src/assets/icons/shuangjiantouxiangzuo.svg new file mode 100644 index 0000000..1a90a69 --- /dev/null +++ b/admin/src/assets/icons/shuangjiantouxiangzuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuaxin.svg b/admin/src/assets/icons/shuaxin.svg new file mode 100644 index 0000000..a4686b3 --- /dev/null +++ b/admin/src/assets/icons/shuaxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuju.svg b/admin/src/assets/icons/shuju.svg new file mode 100644 index 0000000..8418b76 --- /dev/null +++ b/admin/src/assets/icons/shuju.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuju2.svg b/admin/src/assets/icons/shuju2.svg new file mode 100644 index 0000000..bea4c25 --- /dev/null +++ b/admin/src/assets/icons/shuju2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuju_liuliang.svg b/admin/src/assets/icons/shuju_liuliang.svg new file mode 100644 index 0000000..21b048b --- /dev/null +++ b/admin/src/assets/icons/shuju_liuliang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/shuju_mian.svg b/admin/src/assets/icons/shuju_mian.svg new file mode 100644 index 0000000..5da2d78 --- /dev/null +++ b/admin/src/assets/icons/shuju_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/sort.svg b/admin/src/assets/icons/sort.svg new file mode 100644 index 0000000..1e760a8 --- /dev/null +++ b/admin/src/assets/icons/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/sousuo.svg b/admin/src/assets/icons/sousuo.svg new file mode 100644 index 0000000..2387e0a --- /dev/null +++ b/admin/src/assets/icons/sousuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/sucai.svg b/admin/src/assets/icons/sucai.svg new file mode 100644 index 0000000..23499f8 --- /dev/null +++ b/admin/src/assets/icons/sucai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tianjia.svg b/admin/src/assets/icons/tianjia.svg new file mode 100644 index 0000000..b06fe16 --- /dev/null +++ b/admin/src/assets/icons/tianjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tishi.svg b/admin/src/assets/icons/tishi.svg new file mode 100644 index 0000000..e14e118 --- /dev/null +++ b/admin/src/assets/icons/tishi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tishi_mian.svg b/admin/src/assets/icons/tishi_mian.svg new file mode 100644 index 0000000..04334ea --- /dev/null +++ b/admin/src/assets/icons/tishi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tongxunlu_mian.svg b/admin/src/assets/icons/tongxunlu_mian.svg new file mode 100644 index 0000000..b7c06ab --- /dev/null +++ b/admin/src/assets/icons/tongxunlu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tongzhi.svg b/admin/src/assets/icons/tongzhi.svg new file mode 100644 index 0000000..a227028 --- /dev/null +++ b/admin/src/assets/icons/tongzhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tongzhi_mian.svg b/admin/src/assets/icons/tongzhi_mian.svg new file mode 100644 index 0000000..876676f --- /dev/null +++ b/admin/src/assets/icons/tongzhi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tuichuquanping.svg b/admin/src/assets/icons/tuichuquanping.svg new file mode 100644 index 0000000..3832030 --- /dev/null +++ b/admin/src/assets/icons/tuichuquanping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tuiguang.svg b/admin/src/assets/icons/tuiguang.svg new file mode 100644 index 0000000..7d5bb2d --- /dev/null +++ b/admin/src/assets/icons/tuiguang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tuiguang_mian.svg b/admin/src/assets/icons/tuiguang_mian.svg new file mode 100644 index 0000000..005323a --- /dev/null +++ b/admin/src/assets/icons/tuiguang_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tupian.svg b/admin/src/assets/icons/tupian.svg new file mode 100644 index 0000000..64b511d --- /dev/null +++ b/admin/src/assets/icons/tupian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/tupian_mian.svg b/admin/src/assets/icons/tupian_mian.svg new file mode 100644 index 0000000..0875efd --- /dev/null +++ b/admin/src/assets/icons/tupian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/user_biaoqian.svg b/admin/src/assets/icons/user_biaoqian.svg new file mode 100644 index 0000000..206fff6 --- /dev/null +++ b/admin/src/assets/icons/user_biaoqian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/user_gaikuang.svg b/admin/src/assets/icons/user_gaikuang.svg new file mode 100644 index 0000000..b4ae10e --- /dev/null +++ b/admin/src/assets/icons/user_gaikuang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/user_guanli.svg b/admin/src/assets/icons/user_guanli.svg new file mode 100644 index 0000000..e00fd79 --- /dev/null +++ b/admin/src/assets/icons/user_guanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/wangpudiandan.svg b/admin/src/assets/icons/wangpudiandan.svg new file mode 100644 index 0000000..77cc413 --- /dev/null +++ b/admin/src/assets/icons/wangpudiandan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/weixin.svg b/admin/src/assets/icons/weixin.svg new file mode 100644 index 0000000..f043f12 --- /dev/null +++ b/admin/src/assets/icons/weixin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/weixin_mian.svg b/admin/src/assets/icons/weixin_mian.svg new file mode 100644 index 0000000..5c4e92e --- /dev/null +++ b/admin/src/assets/icons/weixin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/wode.svg b/admin/src/assets/icons/wode.svg new file mode 100644 index 0000000..4cc5c10 --- /dev/null +++ b/admin/src/assets/icons/wode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/wode_mian.svg b/admin/src/assets/icons/wode_mian.svg new file mode 100644 index 0000000..ea9ebfb --- /dev/null +++ b/admin/src/assets/icons/wode_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/xiangji.svg b/admin/src/assets/icons/xiangji.svg new file mode 100644 index 0000000..a9f7b5f --- /dev/null +++ b/admin/src/assets/icons/xiangji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/xiaoxi.svg b/admin/src/assets/icons/xiaoxi.svg new file mode 100644 index 0000000..cf220c8 --- /dev/null +++ b/admin/src/assets/icons/xiaoxi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/xiazai.svg b/admin/src/assets/icons/xiazai.svg new file mode 100644 index 0000000..c741576 --- /dev/null +++ b/admin/src/assets/icons/xiazai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/xitongquanxian.svg b/admin/src/assets/icons/xitongquanxian.svg new file mode 100644 index 0000000..b34ac74 --- /dev/null +++ b/admin/src/assets/icons/xitongquanxian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yingxiao_qipao.svg b/admin/src/assets/icons/yingxiao_qipao.svg new file mode 100644 index 0000000..238ddf2 --- /dev/null +++ b/admin/src/assets/icons/yingxiao_qipao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yingyezizhi.svg b/admin/src/assets/icons/yingyezizhi.svg new file mode 100644 index 0000000..23ae5be --- /dev/null +++ b/admin/src/assets/icons/yingyezizhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yinhangka.svg b/admin/src/assets/icons/yinhangka.svg new file mode 100644 index 0000000..20c1fdc --- /dev/null +++ b/admin/src/assets/icons/yinhangka.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yiwen.svg b/admin/src/assets/icons/yiwen.svg new file mode 100644 index 0000000..ef07f2e --- /dev/null +++ b/admin/src/assets/icons/yiwen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/youhui.svg b/admin/src/assets/icons/youhui.svg new file mode 100644 index 0000000..4358e1c --- /dev/null +++ b/admin/src/assets/icons/youhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/youjian.svg b/admin/src/assets/icons/youjian.svg new file mode 100644 index 0000000..1304c01 --- /dev/null +++ b/admin/src/assets/icons/youjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/youjiantou.svg b/admin/src/assets/icons/youjiantou.svg new file mode 100644 index 0000000..5c59926 --- /dev/null +++ b/admin/src/assets/icons/youjiantou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yulibao.svg b/admin/src/assets/icons/yulibao.svg new file mode 100644 index 0000000..b785c04 --- /dev/null +++ b/admin/src/assets/icons/yulibao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yuyin.svg b/admin/src/assets/icons/yuyin.svg new file mode 100644 index 0000000..1ac06af --- /dev/null +++ b/admin/src/assets/icons/yuyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yuyueguanli.svg b/admin/src/assets/icons/yuyueguanli.svg new file mode 100644 index 0000000..080255d --- /dev/null +++ b/admin/src/assets/icons/yuyueguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/yuyueguanlishezhi.svg b/admin/src/assets/icons/yuyueguanlishezhi.svg new file mode 100644 index 0000000..eac7549 --- /dev/null +++ b/admin/src/assets/icons/yuyueguanlishezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhankai.svg b/admin/src/assets/icons/zhankai.svg new file mode 100644 index 0000000..aef4e53 --- /dev/null +++ b/admin/src/assets/icons/zhankai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhankai_mian.svg b/admin/src/assets/icons/zhankai_mian.svg new file mode 100644 index 0000000..187e3e9 --- /dev/null +++ b/admin/src/assets/icons/zhankai_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhibo.svg b/admin/src/assets/icons/zhibo.svg new file mode 100644 index 0000000..d329b49 --- /dev/null +++ b/admin/src/assets/icons/zhibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhibo_mian.svg b/admin/src/assets/icons/zhibo_mian.svg new file mode 100644 index 0000000..443e2cb --- /dev/null +++ b/admin/src/assets/icons/zhibo_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhuangxiu.svg b/admin/src/assets/icons/zhuangxiu.svg new file mode 100644 index 0000000..c692c45 --- /dev/null +++ b/admin/src/assets/icons/zhuangxiu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhuangxiu_mian.svg b/admin/src/assets/icons/zhuangxiu_mian.svg new file mode 100644 index 0000000..53e8deb --- /dev/null +++ b/admin/src/assets/icons/zhuangxiu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zhuoweiguanli.svg b/admin/src/assets/icons/zhuoweiguanli.svg new file mode 100644 index 0000000..ee9d0cc --- /dev/null +++ b/admin/src/assets/icons/zhuoweiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zichanzhuanrang.svg b/admin/src/assets/icons/zichanzhuanrang.svg new file mode 100644 index 0000000..8a8d546 --- /dev/null +++ b/admin/src/assets/icons/zichanzhuanrang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zuliao.svg b/admin/src/assets/icons/zuliao.svg new file mode 100644 index 0000000..e210df3 --- /dev/null +++ b/admin/src/assets/icons/zuliao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/icons/zuliaoyuding.svg b/admin/src/assets/icons/zuliaoyuding.svg new file mode 100644 index 0000000..69a9d99 --- /dev/null +++ b/admin/src/assets/icons/zuliaoyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/images/icon_folder.png b/admin/src/assets/images/icon_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..99b800ffbe4458257e6e73a655ca36b0009d9439 GIT binary patch literal 605 zcmV-j0;2tiP)4f26ot=uyR+%+k~IiHE3ItAV(o0yRy3M)!NP4)#f&2(+jnbn^?cI9`wDlzP&)flSvh}KV42+)wI0C=}a2e_th(T?W{$AuO*Lmvo z4{6>3HwJb_0i50V#u_#G;KJvAFfoDH_H#G-UQWAkD4w&>Q zFn8Y6w&*dM5$x|}25Cnbjt?pm=j-qX1h>uP+)s?7P1a2$NRLY?B-OatU!mR)^^hlA z)B>0)+Yg?#%O{8%fL2lcyh6^$rYO~1u!2dG2Zi;JL57DQEranKt8-1Nc_$AAQ>@Th zY0E^m&pbGLId8yl{W>4u&!n$~tHTIrFWLFI6V`_nu(K1ym*EC9#+*NrJbLht8UW|hXnxUyc_^6AU;a>%-ue0;w)l1fV0C{42(7AQXj%hst`Aos z^r>0$Q-|Xj)wnecmX-j-<`U#Gf@VS3ea&w}lb=fFSZyvmgws^l{xHZa{!AD~?`%`f zCb|e-_c=a0(*?YH7|t&OINkMUQgdiOAoi+hJNW{xe1)U+O(ymN?X(zSE4~ErBB+x9 r4((Mb=lf=Tyan9~#<*-gjj{a#{ssW#^D}X600000NkvXXu0mjflw=TH literal 0 HcmV?d00001 diff --git a/admin/src/assets/images/no_perms.png b/admin/src/assets/images/no_perms.png new file mode 100644 index 0000000000000000000000000000000000000000..c37c89bb5c0a1cb31be3900b6de604a0a8cd9063 GIT binary patch literal 14619 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 literal 0 HcmV?d00001 diff --git a/admin/src/assets/images/theme_white.png b/admin/src/assets/images/theme_white.png new file mode 100644 index 0000000000000000000000000000000000000000..52714ba146ac6aa1510c5615f7c5dce913cab9cb GIT binary patch literal 2559 zcmeH}`8U)J7rOTM+_* zC_6f!&PqH@qDk^{66>My$xPy8h<1)1@)C)Wzmg1rDAYKjY&{|`&J1C$`FLtX*Tnk>ej*Z zf8|s+lTTvqZpYx%%rNFz?UCZSSptzb^8HDaxSh3W_lf(hme{#5{;i$VV+a5JOzLR) zN$pp{rgv`fC-`y+pcjNrWL0~6U!eCex7~Ulai~jltJGuiwID3IE_npdoYb<>{QT6) zgF8vV*}go3*e+w`4jK$T?SvkmzQtO!+FPM;RJ7>enR=hI9Jyq%5lx1pofK7WzLX-f z$Ji^zUa#omokBXUYrJ{vV(X*f@W^N6;qzo)QfJJOFPc$4DT$mr!Nqvnh6phak>eD2 z)z6QQsv0nQRT%{UfH3{f0E_hC(cNtbw}ToXCPFM0ixiJEY<6@%N5i8cH3>G~GUL#V zIGCwND_**y?>hI(_(F;I$?W_##GRscoGdDF@br$^d z)(YgmaUYI8aM<9_!4`?EZLF`vPC!Ft!id2b0ly!eSuA7xJFVl8jTwBpCg z%7fkXjfwe;W3-RMcE%%I;nJm#X(Xd8&#_{ThaZu+_?ge=Z}D#|C9a3hq3BB)<#9Wk zi_#CZs0O74*0_z9c^U0UvIZ4vcy%OKm*O;i#RyjLNL}>G>gb20Sh?BuW$=X(a_5d6 z87Z+e<6&SfC2%`FxHVU|t>=|%(8|ovO1-mY%Y`Z`dwP0$Kr&w;mq{CF47?eAj1I>y z%3)Z+&Y*u+gZrVJi|u#@{hhPscH&Bf|7@WdLC97g_;bAWdxCw}mmXVr*i3~~SI&7L{P_K@ zr++Yj{=ZUi6ZmjE-z7Yh(x62ET=zG~LS}!>mMKb8auJ*G2%u$nAKprVQ3~`=roVa_*|I4IKN3z}5FXh|5O%V+gu zK{jSIIdH3l$u%*2D23<0Bz!cJlQ7Qt8jesT!QIM#m$ZcWf7}1*l1&KWWIY%U>mGfC zm{&yG)HI@=xs)Xy$96{|&Qbe<6B82;Fg%LAs7p8~GH+&or!EH6k6%ag4Myx`e!O81 z4i2t$cXty7L$|rP!v!To>b8q&P-g@JQIwXJ7V|j}*~MUpP!S8>K0Yy_{{Dh{_pmzL z%hVfs3*I{BIl3t)9=|7ac6Pd+c5&f}IA;ZD+1XVK;ftdDf&!Qg>F1A!pU!s-mL@v4 zPh$=n?!Xf#a_Ly}$miXw6>bMVJuu(g0zL}0<*Hq?EZE#*Md0fzg^-NSa8;U(;jeAp z^s*wTL}w5NgN-OFE7uKFdp65&1x-`?0#r0z4LUQ@(@9gKxqF91gKBGqZ_9Np^F&El z%9HFvIZkW;oVpyR7vHPi?j!`&Ne?sXt)K-qVUt}ffx?T73pR2d#0Y=z`X8o2VnI_= z6AYcPXRQ(D$*gLUKNAnwW!@HP`-^<*!lwQ$G&eW@Syt{>zy_LdfEXV>Pd!&rf84@i ziNx?BYg2zhBfN6NoNy!(8Ow~E7odYUPu9-C?0@-TU7ZqI)QGb+;o{|FouD7B58$z; z$B)O9dK;bKQuNm)%X*LCQG|WMC7Zn5+OnyS@kd1Ok7f zLw<#>LhlZ4hD=@V74Ce|z@tR3>-8K|Y+cHU(tLP9g9f{!Nu8?KM4*ZbXamxrpk8Bn zgr7QnhFBFKq(dn=l^$8$tg_#zu3z5qmMjKN!x3cQT#ayDOC05|Z*EU9?uSeH9PVGa z#X6sI(6?8_oOtce8T)wz)zxZELpbD@NLhl4<+m%2(Uhx3I$Ozhf59$?fi;Km333EA zb%wl}9JVz?*i|1iSTl{90?Fn~_<{+@_^NMIJfSL#SxZT2-Oc?JRh;{h#OM(~=8N zYh^=EIT>M=yE+4f0A*Fq&OwPl2#F2%(q5?_G3EXJ5bEoFcW$Gw970$T^=r@ntq6(u cufQ*r+E9`TEXaOJ^3g#YPr0Dp+W95?2N6QvSpWb4 literal 0 HcmV?d00001 diff --git a/admin/src/components/app-link/index.vue b/admin/src/components/app-link/index.vue new file mode 100644 index 0000000..e7fe926 --- /dev/null +++ b/admin/src/components/app-link/index.vue @@ -0,0 +1,38 @@ + + + diff --git a/admin/src/components/color-picker/index.vue b/admin/src/components/color-picker/index.vue new file mode 100644 index 0000000..ed0bc3e --- /dev/null +++ b/admin/src/components/color-picker/index.vue @@ -0,0 +1,33 @@ + + diff --git a/admin/src/components/daterange-picker/index.vue b/admin/src/components/daterange-picker/index.vue new file mode 100644 index 0000000..9f97531 --- /dev/null +++ b/admin/src/components/daterange-picker/index.vue @@ -0,0 +1,44 @@ + + + diff --git a/admin/src/components/del-wrap/index.vue b/admin/src/components/del-wrap/index.vue new file mode 100644 index 0000000..787f3e2 --- /dev/null +++ b/admin/src/components/del-wrap/index.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/admin/src/components/dict-value/index.vue b/admin/src/components/dict-value/index.vue new file mode 100644 index 0000000..2935e5d --- /dev/null +++ b/admin/src/components/dict-value/index.vue @@ -0,0 +1,30 @@ + + diff --git a/admin/src/components/editor/index.vue b/admin/src/components/editor/index.vue new file mode 100644 index 0000000..ae39eee --- /dev/null +++ b/admin/src/components/editor/index.vue @@ -0,0 +1,143 @@ + + + + diff --git a/admin/src/components/footer-btns/index.vue b/admin/src/components/footer-btns/index.vue new file mode 100644 index 0000000..eb5aea2 --- /dev/null +++ b/admin/src/components/footer-btns/index.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/admin/src/components/icon/index.ts b/admin/src/components/icon/index.ts new file mode 100644 index 0000000..831fcad --- /dev/null +++ b/admin/src/components/icon/index.ts @@ -0,0 +1,19 @@ +import * as ElementPlusIcons from '@element-plus/icons-vue' +//@ts-ignore +import localIconsName from 'virtual:svg-icons-names' + +export const LOCAL_ICON_PREFIX = 'local-icon-' +export const EL_ICON_PREFIX = 'el-icon-' + +const elIconsName: string[] = [] + +for (const [, component] of Object.entries(ElementPlusIcons)) { + elIconsName.push(`${EL_ICON_PREFIX}${component.name}`) +} + +export function getElementPlusIconNames() { + return elIconsName +} +export function getLocalIconNames() { + return localIconsName +} diff --git a/admin/src/components/icon/index.vue b/admin/src/components/icon/index.vue new file mode 100644 index 0000000..738eef3 --- /dev/null +++ b/admin/src/components/icon/index.vue @@ -0,0 +1,49 @@ + diff --git a/admin/src/components/icon/picker.vue b/admin/src/components/icon/picker.vue new file mode 100644 index 0000000..27fc8cd --- /dev/null +++ b/admin/src/components/icon/picker.vue @@ -0,0 +1,185 @@ + + + diff --git a/admin/src/components/icon/svg-icon.vue b/admin/src/components/icon/svg-icon.vue new file mode 100644 index 0000000..10c6919 --- /dev/null +++ b/admin/src/components/icon/svg-icon.vue @@ -0,0 +1,38 @@ + + + diff --git a/admin/src/components/image-contain/index.vue b/admin/src/components/image-contain/index.vue new file mode 100644 index 0000000..1961025 --- /dev/null +++ b/admin/src/components/image-contain/index.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/admin/src/components/link/custom-link.vue b/admin/src/components/link/custom-link.vue new file mode 100644 index 0000000..d90264e --- /dev/null +++ b/admin/src/components/link/custom-link.vue @@ -0,0 +1,42 @@ + + + diff --git a/admin/src/components/link/index.ts b/admin/src/components/link/index.ts new file mode 100644 index 0000000..58f3673 --- /dev/null +++ b/admin/src/components/link/index.ts @@ -0,0 +1,11 @@ +export enum LinkTypeEnum { + 'SHOP_PAGES' = 'shop', + 'CUSTOM_LINK' = 'custom' +} + +export interface Link { + path: string + name?: string + type: string + query?: Record +} diff --git a/admin/src/components/link/index.vue b/admin/src/components/link/index.vue new file mode 100644 index 0000000..c3acb1b --- /dev/null +++ b/admin/src/components/link/index.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/admin/src/components/link/picker.vue b/admin/src/components/link/picker.vue new file mode 100644 index 0000000..cc89913 --- /dev/null +++ b/admin/src/components/link/picker.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/admin/src/components/link/shop-pages.vue b/admin/src/components/link/shop-pages.vue new file mode 100644 index 0000000..e5c747b --- /dev/null +++ b/admin/src/components/link/shop-pages.vue @@ -0,0 +1,101 @@ + + + diff --git a/admin/src/components/material/file.vue b/admin/src/components/material/file.vue new file mode 100644 index 0000000..a9f0500 --- /dev/null +++ b/admin/src/components/material/file.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/admin/src/components/material/hook.ts b/admin/src/components/material/hook.ts new file mode 100644 index 0000000..e490c9a --- /dev/null +++ b/admin/src/components/material/hook.ts @@ -0,0 +1,208 @@ +import { + fileCateAdd, + fileCateDelete, + fileCateEdit, + fileCateLists, + fileDelete, + fileList, + fileMove, + fileRename +} from '@/api/file' +import { usePaging } from '@/hooks/usePaging' +import feedback from '@/utils/feedback' +import { ElMessage, ElTree, type CheckboxValueType } from 'element-plus' +import { shallowRef, type Ref } from 'vue' + +// 左侧分组的钩子函数 +export function useCate(type: number) { + const treeRef = shallowRef>() + // 分组列表 + const cateLists = ref([]) + + // 选中的分组id + const cateId = ref('') + + // 获取分组列表 + const getCateLists = async () => { + const data = await fileCateLists({ + type + }) + const item: any[] = [ + // { + // name: '全部', + // id: '' + // }, + // { + // name: '未分组', + // id: 0 + // } + ] + cateLists.value = data + cateLists.value.unshift(...item) + setTimeout(() => { + treeRef.value?.setCurrentKey(cateId.value) + }, 0) + } + + // 添加分组 + const handleAddCate = async (value: string) => { + await fileCateAdd({ + type, + name: value, + pid: 0 + }) + getCateLists() + } + + // 编辑分组 + const handleEditCate = async (value: string, id: number) => { + await fileCateEdit({ + id, + name: value + }) + getCateLists() + } + + // 删除分组 + const handleDeleteCate = async (id: number) => { + await feedback.confirm('确定要删除?') + await fileCateDelete({ id }) + cateId.value = '' + getCateLists() + } + + //选中分类 + const handleCatSelect = (item: any) => { + cateId.value = item.id + } + + return { + treeRef, + cateId, + cateLists, + handleAddCate, + handleEditCate, + handleDeleteCate, + getCateLists, + handleCatSelect + } +} + +// 处理文件的钩子函数 +export function useFile( + cateId: Ref, + type: Ref, + limit: Ref, + size: number +) { + const tableRef = shallowRef() + const listShowType = ref('normal') + const moveId = ref(0) + const select = ref([]) + const isCheckAll = ref(false) + const isIndeterminate = ref(false) + const fileParams = reactive({ + name: '', + type: type, + cid: cateId + }) + const { pager, getLists, resetPage } = usePaging({ + fetchFun: fileList, + params: fileParams, + firstLoading: true, + size + }) + + const getFileList = () => { + getLists() + } + const refresh = () => { + resetPage() + } + + const isSelect = (id: number) => { + return !!select.value.find((item: any) => item.id == id) + } + + const batchFileDelete = async (id?: number[]) => { + await feedback.confirm( + '确认删除后,本地或云存储文件也将同步删除,如文件已被使用,请谨慎操作!' + ) + const ids = id ? id : select.value.map((item: any) => item.id) + await fileDelete({ ids }) + getFileList() + clearSelect() + } + + const batchFileMove = async () => { + const ids = select.value.map((item: any) => item.id) + await fileMove({ ids, cid: moveId.value }) + moveId.value = 0 + getFileList() + clearSelect() + } + + const selectFile = (item: any) => { + const index = select.value.findIndex((items: any) => items.id == item.id) + if (index != -1) { + select.value.splice(index, 1) + return + } + if (select.value.length == limit.value) { + if (limit.value == 1) { + select.value = [] + select.value.push(item) + return + } + ElMessage.warning('已达到选择上限') + return + } + select.value.push(item) + } + + const clearSelect = () => { + select.value = [] + } + + const cancelSelete = (id: number) => { + select.value = select.value.filter((item: any) => item.id != id) + } + + const selectAll = (value: CheckboxValueType) => { + isIndeterminate.value = false + tableRef.value?.toggleAllSelection() + if (value) { + select.value = [...pager.lists] + return + } + clearSelect() + } + + const handleFileRename = async (value: string, id: number) => { + await fileRename({ + id, + name: value + }) + getFileList() + } + return { + listShowType, + tableRef, + moveId, + pager, + fileParams, + select, + isCheckAll, + isIndeterminate, + getFileList, + refresh, + batchFileDelete, + batchFileMove, + selectFile, + isSelect, + clearSelect, + cancelSelete, + selectAll, + handleFileRename + } +} diff --git a/admin/src/components/material/index.vue b/admin/src/components/material/index.vue new file mode 100644 index 0000000..5c9eab8 --- /dev/null +++ b/admin/src/components/material/index.vue @@ -0,0 +1,584 @@ + + + + + diff --git a/admin/src/components/material/picker.vue b/admin/src/components/material/picker.vue new file mode 100644 index 0000000..88ef489 --- /dev/null +++ b/admin/src/components/material/picker.vue @@ -0,0 +1,303 @@ + + + + + diff --git a/admin/src/components/material/preview.vue b/admin/src/components/material/preview.vue new file mode 100644 index 0000000..6accaa0 --- /dev/null +++ b/admin/src/components/material/preview.vue @@ -0,0 +1,72 @@ + + + diff --git a/admin/src/components/overflow-tooltip/index.vue b/admin/src/components/overflow-tooltip/index.vue new file mode 100644 index 0000000..57734db --- /dev/null +++ b/admin/src/components/overflow-tooltip/index.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/admin/src/components/pagination/index.vue b/admin/src/components/pagination/index.vue new file mode 100644 index 0000000..020d304 --- /dev/null +++ b/admin/src/components/pagination/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/admin/src/components/popover-input/index.vue b/admin/src/components/popover-input/index.vue new file mode 100644 index 0000000..88ba84a --- /dev/null +++ b/admin/src/components/popover-input/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/admin/src/components/popup/index.vue b/admin/src/components/popup/index.vue new file mode 100644 index 0000000..f8683be --- /dev/null +++ b/admin/src/components/popup/index.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/admin/src/components/upload/index.vue b/admin/src/components/upload/index.vue new file mode 100644 index 0000000..8f4a5e9 --- /dev/null +++ b/admin/src/components/upload/index.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/admin/src/components/video-player/index.vue b/admin/src/components/video-player/index.vue new file mode 100644 index 0000000..fdf64e3 --- /dev/null +++ b/admin/src/components/video-player/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/admin/src/config/index.ts b/admin/src/config/index.ts new file mode 100644 index 0000000..926d4ff --- /dev/null +++ b/admin/src/config/index.ts @@ -0,0 +1,10 @@ +const config = { + terminal: 1, //终端 + title: '后台管理系统', //网站默认标题 + version: '1.3.3', //版本号 + baseUrl: `${import.meta.env.VITE_APP_BASE_URL || ''}/`, //请求接口域名 + urlPrefix: 'api', //请求默认前缀 + timeout: 60 * 1000 //请求超时时长 +} + +export default config diff --git a/admin/src/config/setting.ts b/admin/src/config/setting.ts new file mode 100644 index 0000000..3925433 --- /dev/null +++ b/admin/src/config/setting.ts @@ -0,0 +1,18 @@ +const defaultSetting = { + showCrumb: true, // 是否显示面包屑 + showLogo: true, // 是否显示logo + isUniqueOpened: false, //只展开一个一级菜单 + sideWidth: 200, //侧边栏宽度 + sideTheme: 'light', //侧边栏主题 + sideDarkColor: '#1d2124', //侧边栏深色主题颜色 + openMultipleTabs: true, // 是否开启多标签tab栏 + theme: '#4A5DFF', //主题色 + successTheme: '#67c23a', //成功主题色 + warningTheme: '#e6a23c', //警告主题色 + dangerTheme: '#f56c6c', //危险主题色 + errorTheme: '#f56c6c', //错误主题色 + infoTheme: '#909399' //信息主题色 +} +//以上各种主题色分别对应element-plus的几种行为主题 + +export default defaultSetting diff --git a/admin/src/enums/appEnums.ts b/admin/src/enums/appEnums.ts new file mode 100644 index 0000000..90ac145 --- /dev/null +++ b/admin/src/enums/appEnums.ts @@ -0,0 +1,40 @@ +//菜单主题类型 +export enum ThemeEnum { + LIGHT = 'light', + DARK = 'dark' +} + +// 菜单类型 +export enum MenuEnum { + CATALOGUE = 'M', + MENU = 'C', + BUTTON = 'A' +} + +// 屏幕 +export enum ScreenEnum { + SM = 640, + MD = 768, + LG = 1024, + XL = 1280, + '2XL' = 1536 +} + +// 客户端类型 +export enum ClientEnum { + MP_WEIXIN = 1, // 微信-小程序 + OA_WEIXIN = 2, // 微信-公众号 + H5 = 3, // H5 + PC = 4, // PC + IOS = 5, //苹果 + ANDROID = 6 //安卓 +} + +export const ClientMap = { + [ClientEnum.MP_WEIXIN]: '微信小程序', + [ClientEnum.OA_WEIXIN]: '微信公众号', + [ClientEnum.H5]: '手机H5', + [ClientEnum.PC]: '电脑PC', + [ClientEnum.IOS]: '苹果APP', + [ClientEnum.ANDROID]: '安卓APP' +} diff --git a/admin/src/enums/cacheEnums.ts b/admin/src/enums/cacheEnums.ts new file mode 100644 index 0000000..45624e4 --- /dev/null +++ b/admin/src/enums/cacheEnums.ts @@ -0,0 +1,8 @@ +// 本地缓冲key + +//token +export const TOKEN_KEY = 'token' +//账号 +export const ACCOUNT_KEY = 'account' +//设置 +export const SETTING_KEY = 'setting' diff --git a/admin/src/enums/pageEnum.ts b/admin/src/enums/pageEnum.ts new file mode 100644 index 0000000..89e6525 --- /dev/null +++ b/admin/src/enums/pageEnum.ts @@ -0,0 +1,9 @@ +export enum PageEnum { + //登录页面 + LOGIN = '/login', + //无权限页面 + ERROR_403 = '/403', + // 404 + ERROR_404 = '/:pathMatch(.*)*', + INDEX = '/' +} diff --git a/admin/src/enums/requestEnums.ts b/admin/src/enums/requestEnums.ts new file mode 100644 index 0000000..67d30b2 --- /dev/null +++ b/admin/src/enums/requestEnums.ts @@ -0,0 +1,28 @@ +export enum ContentTypeEnum { + // json + JSON = 'application/json;charset=UTF-8', + // form-data 上传资源(图片,视频) + FORM_DATA = 'multipart/form-data;charset=UTF-8' +} + +export enum RequestMethodsEnum { + GET = 'GET', + POST = 'POST' +} + +export enum RequestCodeEnum { + SUCCESS = 200, //成功 + FAILED = 300, // 失败 + PARAMS_VALID_ERROR = 310, //参数校验错误 + PARAMS_TYPE_ERROR = 311, //参数类型错误 + REQUEST_METHOD_ERROR = 312, //请求方法错误 + ASSERT_ARGUMENT_ERROR = 313, //断言参数错误 + ASSERT_MYBATIS_ERROR = 314, //断言mybatis错误 + LOGIN_ACCOUNT_ERROR = 330, //登陆账号或密码错误 + LOGIN_DISABLE_ERROR = 331, //登陆账号已被禁用 + TOKEN_EMPTY = 332, // TOKEN参数为空 + TOKEN_INVALID = 333, // TOKEN参数无效 + NO_PERMISSTION = 403, //无相关权限 + REQUEST_404_ERROR = 404, //请求接口不存在 + SYSTEM_ERROR = 500 //系统错误 +} diff --git a/admin/src/hooks/useDictOptions.ts b/admin/src/hooks/useDictOptions.ts new file mode 100644 index 0000000..30f5c11 --- /dev/null +++ b/admin/src/hooks/useDictOptions.ts @@ -0,0 +1,69 @@ +import { dictDataAll } from '@/api/setting/dict' +import { reactive, toRaw } from 'vue' + +interface Options { + [propName: string]: { + api: PromiseFun + params?: Record + transformData?(data: any): any + } +} + +// { +// dict: { +// api: dictData, +// params: { name: 'user' }, +// transformData(data: any) { +// return data.list +// } +// } +// } + +export function useDictOptions(options: Options) { + const optionsData: any = reactive({}) + const optionsKey = Object.keys(options) + const apiLists = optionsKey.map((key) => { + const value = options[key] + optionsData[key] = [] + return () => value.api(toRaw(value.params) || {}) + }) + + const refresh = async () => { + const res = await Promise.allSettled>(apiLists.map((api) => api())) + res.forEach((item, index) => { + const key = optionsKey[index] + if (item.status == 'fulfilled') { + const { transformData } = options[key] + const data = transformData ? transformData(item.value) : item.value + optionsData[key] = data + } + }) + } + refresh() + return { + optionsData: optionsData as T, + refresh + } +} + +// useDictOptions<{ +// dict: any[] +// }>({ +// dict: dictData +// }) + +export function useDictData(dict: string[]) { + const options: Options = {} + for (const type of dict) { + options[type] = { + api: dictDataAll, + params: { + dictType: type + } + } + } + const { optionsData } = useDictOptions(options) + return { + dictData: optionsData + } +} diff --git a/admin/src/hooks/useLockFn.ts b/admin/src/hooks/useLockFn.ts new file mode 100644 index 0000000..c4423d6 --- /dev/null +++ b/admin/src/hooks/useLockFn.ts @@ -0,0 +1,21 @@ +import { ref } from 'vue' + +export function useLockFn(fn: (...args: any[]) => Promise) { + const isLock = ref(false) + const lockFn = async (...args: any[]) => { + if (isLock.value) return + isLock.value = true + try { + const res = await fn(...args) + isLock.value = false + return res + } catch (e) { + isLock.value = false + throw e + } + } + return { + isLock, + lockFn + } +} diff --git a/admin/src/hooks/useMultipleTabs.ts b/admin/src/hooks/useMultipleTabs.ts new file mode 100644 index 0000000..02e1e43 --- /dev/null +++ b/admin/src/hooks/useMultipleTabs.ts @@ -0,0 +1,47 @@ +import useTabsStore from '@/stores/modules/multipleTabs' +import useSettingStore from '@/stores/modules/setting' + +export default function useMultipleTabs() { + const router = useRouter() + const route = useRoute() + const tabsStore = useTabsStore() + const settingStore = useSettingStore() + + const tabsLists = computed(() => { + return tabsStore.getTabList + }) + + const currentTab = computed(() => { + return route.fullPath + }) + + const addTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.addTab(router) + } + + const removeTab = (fullPath?: any) => { + if (!settingStore.openMultipleTabs) return + fullPath = fullPath ?? route.fullPath + tabsStore.removeTab(fullPath, router) + } + + const removeOtherTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.removeOtherTab(route) + } + + const removeAllTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.removeAllTab(router) + } + + return { + tabsLists, + currentTab, + addTab, + removeTab, + removeOtherTab, + removeAllTab + } +} diff --git a/admin/src/hooks/usePaging.ts b/admin/src/hooks/usePaging.ts new file mode 100644 index 0000000..8a1aa59 --- /dev/null +++ b/admin/src/hooks/usePaging.ts @@ -0,0 +1,62 @@ +import { reactive, toRaw } from 'vue' + +// 分页钩子函数 +interface Options { + page?: number + size?: number + fetchFun: (_arg: any) => Promise + params?: Record + firstLoading?: boolean +} + +export function usePaging(options: Options) { + const { page = 1, size = 15, fetchFun, params = {}, firstLoading = false } = options + // 记录分页初始参数 + const paramsInit: Record = Object.assign({}, toRaw(params)) + // 分页数据 + const pager = reactive({ + page, + size, + loading: firstLoading, + count: 0, + lists: [] as any[] + }) + // 请求分页接口 + const getLists = () => { + pager.loading = true + return fetchFun({ + pageNo: pager.page, + pageSize: pager.size, + ...params + }) + .then((res: any) => { + pager.count = res?.count + pager.lists = res?.lists + return Promise.resolve(res) + }) + .catch((err: any) => { + return Promise.reject(err) + }) + .finally(() => { + pager.loading = false + }) + } + // 重置为第一页 + const resetPage = () => { + pager.page = 1 + getLists() + } + // 重置参数 + const resetParams = () => { + Object.keys(paramsInit).forEach((item) => { + params[item] = paramsInit[item] + }) + getLists() + } + return { + pager, + getLists, + resetParams, + resetPage + } +} diff --git a/admin/src/hooks/useWatchRoute.ts b/admin/src/hooks/useWatchRoute.ts new file mode 100644 index 0000000..381b2ec --- /dev/null +++ b/admin/src/hooks/useWatchRoute.ts @@ -0,0 +1,17 @@ +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +export function useWatchRoute(callback: (route: RouteLocationNormalizedLoaded) => void) { + const route = useRoute() + watch( + route, + () => { + callback(route) + }, + { + immediate: true + } + ) + return { + route + } +} diff --git a/admin/src/install/directives/copy.ts b/admin/src/install/directives/copy.ts new file mode 100644 index 0000000..c0b1909 --- /dev/null +++ b/admin/src/install/directives/copy.ts @@ -0,0 +1,28 @@ +/** + * perm 操作权限处理 + * 指令用法: + * 编辑 + */ + +import feedback from '@/utils/feedback' +import useClipboard from 'vue-clipboard3' +const clipboard = 'data-clipboard-text' +export default { + mounted: (el: HTMLElement, binding: any) => { + el.setAttribute(clipboard, binding.value) + const { toClipboard } = useClipboard() + + el.onclick = () => { + toClipboard(el.getAttribute(clipboard)!) + .then(() => { + feedback.msgSuccess('复制成功') + }) + .catch(() => { + feedback.msgError('复制失败') + }) + } + }, + updated: (el: HTMLElement, binding: any) => { + el.setAttribute(clipboard, binding.value) + } +} diff --git a/admin/src/install/directives/perms.ts b/admin/src/install/directives/perms.ts new file mode 100644 index 0000000..e62765f --- /dev/null +++ b/admin/src/install/directives/perms.ts @@ -0,0 +1,28 @@ +/** + * perm 操作权限处理 + * 指令用法: + * 编辑 + */ + +import useUserStore from '@/stores/modules/user' +export default { + mounted: (el: HTMLElement, binding: any) => { + const { value } = binding + const userStore = useUserStore() + const permissions = userStore.perms + const all_permission = '*' + if (Array.isArray(value)) { + if (value.length > 0) { + const hasPermission = permissions.some((key: string) => { + return all_permission == key || value.includes(key) + }) + + if (!hasPermission) { + el.parentNode && el.parentNode.removeChild(el) + } + } + } else { + throw new Error('like v-perms="[\'auth.menu/edit\']"') + } + } +} diff --git a/admin/src/install/index.ts b/admin/src/install/index.ts new file mode 100644 index 0000000..eab8563 --- /dev/null +++ b/admin/src/install/index.ts @@ -0,0 +1,27 @@ +import type { App } from 'vue' +const modules = import.meta.glob('./**/*', { eager: true }) + +// 安装方法,执行某一类相同操作 +function install(app: App) { + Object.keys(modules).forEach((key) => { + const name = key.replace(/(.*\/)*([^.]+).*/gi, '$2') + const type = key.replace(/^\.\/([\w-]+).*/gi, '$1') + const module: any = modules[key] + if (module.default) { + switch (type) { + // 用于注册全局指令 + case 'directives': + app.directive(name, module.default) + break + // 使用插件 + case 'plugins': + typeof module.default === 'function' && module.default(app) + break + } + } + }) +} + +export default { + install +} diff --git a/admin/src/install/plugins/element.ts b/admin/src/install/plugins/element.ts new file mode 100644 index 0000000..ac6ae23 --- /dev/null +++ b/admin/src/install/plugins/element.ts @@ -0,0 +1,11 @@ +import * as ElementPlusIcons from '@element-plus/icons-vue' +import type { App } from 'vue' +//https://github.com/element-plus/element-plus/issues/7293 +import 'element-plus/es/components/dialog/style/css' + +export default (app: App) => { + // 全局注册ElementPlus图标 + for (const [key, component] of Object.entries(ElementPlusIcons)) { + app.component(key, component) + } +} diff --git a/admin/src/install/plugins/pinia.ts b/admin/src/install/plugins/pinia.ts new file mode 100644 index 0000000..6e72e75 --- /dev/null +++ b/admin/src/install/plugins/pinia.ts @@ -0,0 +1,6 @@ +import store from '@/stores' +import type { App } from 'vue' + +export default (app: App) => { + app.use(store) +} diff --git a/admin/src/install/plugins/router.ts b/admin/src/install/plugins/router.ts new file mode 100644 index 0000000..4e3647d --- /dev/null +++ b/admin/src/install/plugins/router.ts @@ -0,0 +1,6 @@ +import router from '@/router' +import type { App } from 'vue' + +export default (app: App) => { + app.use(router) +} diff --git a/admin/src/layout/Empty.vue b/admin/src/layout/Empty.vue new file mode 100644 index 0000000..069271f --- /dev/null +++ b/admin/src/layout/Empty.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/admin/src/layout/components/footer.vue b/admin/src/layout/components/footer.vue new file mode 100644 index 0000000..0dcf06b --- /dev/null +++ b/admin/src/layout/components/footer.vue @@ -0,0 +1,22 @@ + + + diff --git a/admin/src/layout/default/components/header/breadcrumb.vue b/admin/src/layout/default/components/header/breadcrumb.vue new file mode 100644 index 0000000..58c8ef2 --- /dev/null +++ b/admin/src/layout/default/components/header/breadcrumb.vue @@ -0,0 +1,20 @@ + + diff --git a/admin/src/layout/default/components/header/fold.vue b/admin/src/layout/default/components/header/fold.vue new file mode 100644 index 0000000..7ce9360 --- /dev/null +++ b/admin/src/layout/default/components/header/fold.vue @@ -0,0 +1,15 @@ + + + diff --git a/admin/src/layout/default/components/header/full-screen.vue b/admin/src/layout/default/components/header/full-screen.vue new file mode 100644 index 0000000..96cec1e --- /dev/null +++ b/admin/src/layout/default/components/header/full-screen.vue @@ -0,0 +1,10 @@ + + + diff --git a/admin/src/layout/default/components/header/index.vue b/admin/src/layout/default/components/header/index.vue new file mode 100644 index 0000000..3f6d839 --- /dev/null +++ b/admin/src/layout/default/components/header/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/admin/src/layout/default/components/header/multiple-tabs.vue b/admin/src/layout/default/components/header/multiple-tabs.vue new file mode 100644 index 0000000..16a5d48 --- /dev/null +++ b/admin/src/layout/default/components/header/multiple-tabs.vue @@ -0,0 +1,122 @@ + + + + diff --git a/admin/src/layout/default/components/header/refresh.vue b/admin/src/layout/default/components/header/refresh.vue new file mode 100644 index 0000000..a55ccba --- /dev/null +++ b/admin/src/layout/default/components/header/refresh.vue @@ -0,0 +1,14 @@ + + + diff --git a/admin/src/layout/default/components/header/user-drop-down.vue b/admin/src/layout/default/components/header/user-drop-down.vue new file mode 100644 index 0000000..3970709 --- /dev/null +++ b/admin/src/layout/default/components/header/user-drop-down.vue @@ -0,0 +1,34 @@ + + + diff --git a/admin/src/layout/default/components/main.vue b/admin/src/layout/default/components/main.vue new file mode 100644 index 0000000..b5386b3 --- /dev/null +++ b/admin/src/layout/default/components/main.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/admin/src/layout/default/components/setting/drawer.vue b/admin/src/layout/default/components/setting/drawer.vue new file mode 100644 index 0000000..efd08fd --- /dev/null +++ b/admin/src/layout/default/components/setting/drawer.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/admin/src/layout/default/components/setting/index.vue b/admin/src/layout/default/components/setting/index.vue new file mode 100644 index 0000000..d0f4957 --- /dev/null +++ b/admin/src/layout/default/components/setting/index.vue @@ -0,0 +1,19 @@ + + + diff --git a/admin/src/layout/default/components/sidebar/index.vue b/admin/src/layout/default/components/sidebar/index.vue new file mode 100644 index 0000000..28413a0 --- /dev/null +++ b/admin/src/layout/default/components/sidebar/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/admin/src/layout/default/components/sidebar/logo.vue b/admin/src/layout/default/components/sidebar/logo.vue new file mode 100644 index 0000000..f469f4e --- /dev/null +++ b/admin/src/layout/default/components/sidebar/logo.vue @@ -0,0 +1,61 @@ + + + + diff --git a/admin/src/layout/default/components/sidebar/menu-item.vue b/admin/src/layout/default/components/sidebar/menu-item.vue new file mode 100644 index 0000000..09b46aa --- /dev/null +++ b/admin/src/layout/default/components/sidebar/menu-item.vue @@ -0,0 +1,87 @@ + + + + diff --git a/admin/src/layout/default/components/sidebar/menu.vue b/admin/src/layout/default/components/sidebar/menu.vue new file mode 100644 index 0000000..7efba48 --- /dev/null +++ b/admin/src/layout/default/components/sidebar/menu.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/admin/src/layout/default/components/sidebar/side.vue b/admin/src/layout/default/components/sidebar/side.vue new file mode 100644 index 0000000..974dfef --- /dev/null +++ b/admin/src/layout/default/components/sidebar/side.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/admin/src/layout/default/index.vue b/admin/src/layout/default/index.vue new file mode 100644 index 0000000..ba6eb38 --- /dev/null +++ b/admin/src/layout/default/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/admin/src/main.ts b/admin/src/main.ts new file mode 100644 index 0000000..79cae31 --- /dev/null +++ b/admin/src/main.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue' +import App from './App.vue' +import install from './install' +import './permission' +import './styles/index.scss' +import 'virtual:svg-icons-register' + +const app = createApp(App) +app.use(install) +app.mount('#app') diff --git a/admin/src/permission.ts b/admin/src/permission.ts new file mode 100644 index 0000000..ca7017a --- /dev/null +++ b/admin/src/permission.ts @@ -0,0 +1,84 @@ +/** + * 权限控制 + */ + +import NProgress from 'nprogress' +import router, { findFirstValidRoute } from './router' +import 'nprogress/nprogress.css' +import { isExternal } from './utils/validate' +import useUserStore from './stores/modules/user' +import { INDEX_ROUTE, INDEX_ROUTE_NAME } from './router/routes' +import { PageEnum } from './enums/pageEnum' +import useTabsStore from './stores/modules/multipleTabs' +import { clearAuthInfo } from './utils/auth' +import config from './config' + +// NProgress配置 +NProgress.configure({ showSpinner: false }) + +const loginPath = PageEnum.LOGIN +const defaultPath = PageEnum.INDEX +// 免登录白名单 +const whiteList: string[] = [PageEnum.LOGIN, PageEnum.ERROR_403] +router.beforeEach(async (to, from, next) => { + // 开始 Progress Bar + NProgress.start() + document.title = to.meta.title ?? config.title + const userStore = useUserStore() + const tabsStore = useTabsStore() + if (whiteList.includes(to.path)) { + // 在免登录白名单,直接进入 + next() + } else if (userStore.token) { + // 获取用户信息 + const hasGetUserInfo = Object.keys(userStore.userInfo).length !== 0 + if (hasGetUserInfo) { + if (to.path === loginPath) { + next({ path: defaultPath }) + } else { + next() + } + } else { + try { + await userStore.getUserInfo() + await userStore.getMenu() + const routes = userStore.routes + // 找到第一个有效路由 + const routeName = findFirstValidRoute(routes) + // 没有有效路由跳转到403页面 + if (!routeName) { + clearAuthInfo() + next(PageEnum.ERROR_403) + return + } + tabsStore.setRouteName(routeName!) + INDEX_ROUTE.redirect = { name: routeName } + + // 动态添加index路由 + router.addRoute(INDEX_ROUTE) + routes.forEach((route: any) => { + // https 则不插入 + if (isExternal(route.path)) { + return + } + if (!route.children) { + router.addRoute(INDEX_ROUTE_NAME, route) + return + } + // 动态添加可访问路由表 + router.addRoute(route) + }) + next({ ...to, replace: true }) + } catch (err) { + clearAuthInfo() + next({ path: loginPath, query: { redirect: to.fullPath } }) + } + } + } else { + next({ path: loginPath, query: { redirect: to.fullPath } }) + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/admin/src/router/index.ts b/admin/src/router/index.ts new file mode 100644 index 0000000..f4dd998 --- /dev/null +++ b/admin/src/router/index.ts @@ -0,0 +1,110 @@ +import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' +import { MenuEnum } from '@/enums/appEnums' +import { isExternal } from '@/utils/validate' +import { constantRoutes, INDEX_ROUTE_NAME, LAYOUT, Empty } from './routes' +import useUserStore from '@/stores/modules/user' + +// 匹配views里面所有的.vue文件,动态引入 +const modules = import.meta.glob('/src/views/**/*.vue') + +// +export function getModulesKey() { + return Object.keys(modules).map((item) => item.replace('/src/views/', '').replace('.vue', '')) +} + +// 过滤路由所需要的数据 +export function filterAsyncRoutes(routes: any[], firstRoute = true) { + return routes.map((route) => { + const routeRecord = createRouteRecord(route, firstRoute) + if (route.children != null && route.children && route.children.length) { + routeRecord.children = filterAsyncRoutes(route.children, false) + } + return routeRecord + }) +} + +// 创建一条路由记录 +export function createRouteRecord(route: any, firstRoute: boolean): RouteRecordRaw { + //@ts-ignore + const routeRecord: RouteRecordRaw = { + path: isExternal(route.paths) ? route.paths : firstRoute ? `/${route.paths}` : route.paths, + name: Symbol(route.paths), + meta: { + hidden: !route.isShow, + keepAlive: !!route.isCache, + title: route.menuName, + perms: route.perms, + query: route.params, + icon: route.menuIcon, + type: route.menuType, + activeMenu: route.selected + } + } + switch (route.menuType) { + case MenuEnum.CATALOGUE: + routeRecord.component = firstRoute ? LAYOUT : Empty + if (!route.children) { + routeRecord.component = Empty + } + break + case MenuEnum.MENU: + routeRecord.component = loadRouteView(route.component) + break + } + return routeRecord +} + +// 动态加载组件 +export function loadRouteView(component: string) { + try { + const key = Object.keys(modules).find((key) => { + return key.includes(`${component}.vue`) + }) + if (key) { + return modules[key] + } + throw Error(`找不到组件${component},请确保组件路径正确`) + } catch (error) { + console.error(error) + return Empty + } +} + +// 找到第一个有效的路由 +export function findFirstValidRoute(routes: RouteRecordRaw[]): string | undefined { + for (const route of routes) { + if (route.meta?.type == MenuEnum.MENU && !route.meta?.hidden && !isExternal(route.path)) { + return route.name as string + } + if (route.children) { + const name = findFirstValidRoute(route.children) + if (name) { + return name + } + } + } +} +//通过权限字符查询路由路径 +export function getRoutePath(perms: string) { + const routerObj = useRouter() || router + return routerObj.getRoutes().find((item) => item.meta?.perms == perms)?.path || '' +} + +// 重置路由 +export function resetRouter() { + router.removeRoute(INDEX_ROUTE_NAME) + const { routes } = useUserStore() + routes.forEach((route) => { + const name = route.name + if (name && router.hasRoute(name)) { + router.removeRoute(name) + } + }) +} + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: constantRoutes +}) + +export default router diff --git a/admin/src/router/routes.ts b/admin/src/router/routes.ts new file mode 100644 index 0000000..988f1aa --- /dev/null +++ b/admin/src/router/routes.ts @@ -0,0 +1,59 @@ +/** + * Note: 路由配置项 + * + * path: '/path' // 路由路径 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * meta : { + title: 'title' // 设置该路由在侧边栏的名字 + icon: 'icon-name' // 设置该路由的图标 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + query: '{"id": 1}' // 访问路由的默认传递参数 + hidden: true // 当设置 true 的时候该路由不会在侧边栏出现 + hideTab: true //当设置 true 的时候该路由不会在多标签tab栏出现 + } + */ + +import type { RouteRecordRaw } from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' +// import Layout from '@/layout/default/index.vue' +// import Empty from '@/layout/Empty.vue' + +export const LAYOUT = () => import('@/layout/default/index.vue') // () => Promise.resolve(Layout) +export const Empty = () => import('@/layout/Empty.vue') + +export const INDEX_ROUTE_NAME = 'INDEX_ROUTE' + +export const constantRoutes: Array = [ + { + path: PageEnum.ERROR_404, + component: () => import('@/views/error/404.vue') + }, + { + path: PageEnum.ERROR_403, + component: () => import('@/views/error/403.vue') + }, + { + path: PageEnum.LOGIN, + component: () => import('@/views/account/login.vue') + }, + { + path: '/user', + component: LAYOUT, + children: [ + { + path: 'setting', + name: Symbol(), + component: () => import('@/views/user/setting.vue'), + meta: { + title: '个人设置' + } + } + ] + } +] + +export const INDEX_ROUTE: RouteRecordRaw = { + path: PageEnum.INDEX, + component: LAYOUT, + name: INDEX_ROUTE_NAME +} diff --git a/admin/src/stores/index.ts b/admin/src/stores/index.ts new file mode 100644 index 0000000..7c7ea69 --- /dev/null +++ b/admin/src/stores/index.ts @@ -0,0 +1,3 @@ +import { createPinia } from 'pinia' +const store = createPinia() +export default store diff --git a/admin/src/stores/modules/app.ts b/admin/src/stores/modules/app.ts new file mode 100644 index 0000000..f51e1f7 --- /dev/null +++ b/admin/src/stores/modules/app.ts @@ -0,0 +1,51 @@ +import { getConfig } from '@/api/app' +import { defineStore } from 'pinia' +interface AppSate { + config: Record + isMobile: boolean + isCollapsed: boolean + isRouteShow: boolean +} + +const useAppStore = defineStore({ + id: 'app', + state: (): AppSate => { + return { + config: {}, + isMobile: true, + isCollapsed: false, + isRouteShow: true + } + }, + actions: { + getImageUrl(url: string) { + return url ? `${this.config.ossDomain}${url}` : '' + }, + getConfig() { + return new Promise((resolve, reject) => { + getConfig() + .then((data) => { + this.config = data + resolve(data) + }) + .catch((err) => { + reject(err) + }) + }) + }, + setMobile(value: boolean) { + this.isMobile = value + }, + toggleCollapsed(toggle?: boolean) { + this.isCollapsed = toggle ?? !this.isCollapsed + }, + refreshView() { + this.isRouteShow = false + nextTick(() => { + this.isRouteShow = true + }) + } + } +}) + +export default useAppStore diff --git a/admin/src/stores/modules/multipleTabs.ts b/admin/src/stores/modules/multipleTabs.ts new file mode 100644 index 0000000..b14e366 --- /dev/null +++ b/admin/src/stores/modules/multipleTabs.ts @@ -0,0 +1,169 @@ +import { defineStore } from 'pinia' +import { isExternal } from '@/utils/validate' +import type { + LocationQuery, + RouteLocationNormalized, + RouteParamsRaw, + Router, + RouteRecordName +} from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' + +interface TabItem { + name: RouteRecordName + fullPath: string + path: string + title?: string + query?: LocationQuery + params?: RouteParamsRaw +} + +interface TabsSate { + cacheTabList: Set + tabList: TabItem[] + tasMap: Record + indexRouteName: RouteRecordName +} + +const getHasTabIndex = (fullPath: string, tabList: TabItem[]) => { + return tabList.findIndex((item) => item.fullPath == fullPath) +} + +const isCannotAddRoute = (route: RouteLocationNormalized, router: Router) => { + const { path, meta, name } = route + if (!path || isExternal(path)) return true + if (meta?.hideTab) return true + if (!router.hasRoute(name!)) return true + if (([PageEnum.LOGIN, PageEnum.ERROR_403] as string[]).includes(path)) { + return true + } + return false +} + +const findTabsIndex = (fullPath: string, tabList: TabItem[]) => { + return tabList.findIndex((item) => item.fullPath === fullPath) +} + +const getComponentName = (route: RouteLocationNormalized) => { + return route.matched.at(-1)?.components?.default?.name +} + +export const getRouteParams = (tabItem: TabItem) => { + const { params, path, query } = tabItem + return { + params: params || {}, + path, + query: query || {} + } +} + +const useTabsStore = defineStore({ + id: 'tabs', + state: (): TabsSate => ({ + cacheTabList: new Set(), + tabList: [], + tasMap: {}, + indexRouteName: '' + }), + getters: { + getTabList(): TabItem[] { + return this.tabList + }, + getCacheTabList(): string[] { + return Array.from(this.cacheTabList) + } + }, + actions: { + setRouteName(name: RouteRecordName) { + this.indexRouteName = name + }, + addCache(componentName?: string) { + if (componentName) this.cacheTabList.add(componentName) + }, + removeCache(componentName?: string) { + if (componentName && this.cacheTabList.has(componentName)) { + this.cacheTabList.delete(componentName) + } + console.log(this.cacheTabList) + }, + clearCache() { + this.cacheTabList.clear() + }, + resetState() { + this.cacheTabList = new Set() + this.tabList = [] + this.tasMap = {} + this.indexRouteName = '' + }, + addTab(router: Router) { + const route = unref(router.currentRoute) + const { name, query, meta, params, fullPath, path } = route + if (isCannotAddRoute(route, router)) return + const hasTabIndex = getHasTabIndex(fullPath!, this.tabList) + const componentName = getComponentName(route) + const tabItem = { + name: name!, + path, + fullPath, + title: meta?.title, + query, + params + } + this.tasMap[fullPath] = tabItem + if (meta?.keepAlive) { + this.addCache(componentName) + } + if (hasTabIndex != -1) { + return + } + + this.tabList.push(tabItem) + }, + removeTab(fullPath: string, router: Router) { + const { currentRoute, push } = router + const index = findTabsIndex(fullPath, this.tabList) + // 移除tab + if (this.tabList.length > 1) { + index !== -1 && this.tabList.splice(index, 1) + } + const componentName = getComponentName(currentRoute.value) + this.removeCache(componentName) + if (fullPath !== currentRoute.value.fullPath) { + return + } + // 删除选中的tab + let toTab: TabItem | null = null + + if (index === 0) { + toTab = this.tabList[index] + } else { + toTab = this.tabList[index - 1] + } + + const toRoute = getRouteParams(toTab) + push(toRoute) + }, + removeOtherTab(route: RouteLocationNormalized) { + this.tabList = this.tabList.filter((item) => item.fullPath == route.fullPath) + const componentName = getComponentName(route) + this.cacheTabList.forEach((name) => { + if (componentName !== name) { + this.removeCache(name) + } + }) + }, + removeAllTab(router: Router) { + const { push, currentRoute } = router + const { name } = unref(currentRoute) + if (name == this.indexRouteName) { + this.removeOtherTab(currentRoute.value) + return + } + this.tabList = [] + this.clearCache() + push(PageEnum.INDEX) + } + } +}) + +export default useTabsStore diff --git a/admin/src/stores/modules/setting.ts b/admin/src/stores/modules/setting.ts new file mode 100644 index 0000000..219a58b --- /dev/null +++ b/admin/src/stores/modules/setting.ts @@ -0,0 +1,55 @@ +import { defineStore } from 'pinia' +import defaultSetting from '@/config/setting' +import cache from '@/utils/cache' +import { isObject } from '@vue/shared' +import { setTheme } from '@/utils/theme' +import { SETTING_KEY } from '@/enums/cacheEnums' +const storageSetting = cache.get(SETTING_KEY) + +export const useSettingStore = defineStore({ + id: 'setting', + state: () => { + const state = { + showDrawer: false, + ...defaultSetting + } + isObject(storageSetting) && Object.assign(state, storageSetting) + return state + }, + actions: { + // 设置布局设置 + setSetting(data: Record) { + const { key, value } = data + if (this.hasOwnProperty(key)) { + //@ts-ignore + this[key] = value + } + const settings: any = Object.assign({}, this.$state) + delete settings.showDrawer + cache.set(SETTING_KEY, settings) + }, + // 设置主题色 + setTheme(isDark: boolean) { + setTheme( + { + primary: this.theme, + success: this.successTheme, + warning: this.warningTheme, + danger: this.dangerTheme, + error: this.errorTheme, + info: this.infoTheme + }, + isDark + ) + }, + resetTheme() { + for (const key in defaultSetting) { + //@ts-ignore + this[key] = defaultSetting[key] + } + cache.remove(SETTING_KEY) + } + } +}) + +export default useSettingStore diff --git a/admin/src/stores/modules/user.ts b/admin/src/stores/modules/user.ts new file mode 100644 index 0000000..d5248d6 --- /dev/null +++ b/admin/src/stores/modules/user.ts @@ -0,0 +1,96 @@ +import { defineStore } from 'pinia' +import cache from '@/utils/cache' +import type { RouteRecordRaw } from 'vue-router' +import { getUserInfo, login, logout, getMenu } from '@/api/user' +import router, { filterAsyncRoutes } from '@/router' +import { TOKEN_KEY } from '@/enums/cacheEnums' +import { PageEnum } from '@/enums/pageEnum' +import { clearAuthInfo, getToken } from '@/utils/auth' +export interface UserState { + token: string + userInfo: Record + routes: RouteRecordRaw[] + menu: any[] + perms: string[] +} + +const useUserStore = defineStore({ + id: 'user', + state: (): UserState => ({ + token: getToken() || '', + // 用户信息 + userInfo: {}, + // 路由 + routes: [], + menu: [], + // 权限 + perms: [] + }), + getters: {}, + actions: { + resetState() { + this.token = '' + this.userInfo = {} + this.perms = [] + }, + login(playload: any) { + const { account, password } = playload + return new Promise((resolve, reject) => { + login({ + username: account, + password: password + }) + .then((data) => { + this.token = data.token + cache.set(TOKEN_KEY, data.token) + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + logout() { + return new Promise((resolve, reject) => { + logout() + .then(async (data) => { + this.token = '' + await router.push(PageEnum.LOGIN) + clearAuthInfo() + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + getUserInfo() { + return new Promise((resolve, reject) => { + getUserInfo() + .then((data) => { + this.userInfo = data.user + this.perms = data.permissions + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + getMenu() { + return new Promise((resolve, reject) => { + getMenu() + .then((data) => { + this.menu = data + this.routes = filterAsyncRoutes(data) + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + } + } +}) + +export default useUserStore diff --git a/admin/src/styles/dark.css b/admin/src/styles/dark.css new file mode 100644 index 0000000..ae969fd --- /dev/null +++ b/admin/src/styles/dark.css @@ -0,0 +1,49 @@ +:root.dark { + color-scheme: dark; + --table-header-bg-color: var(--el-bg-color); + --el-bg-color-page: #0a0a0a; + --el-bg-color: #1d2124; + --el-bg-color-overlay: #1d1e1f; + --el-text-color-primary: #e5eaf3; + --el-text-color-regular: #cfd3dc; + --el-text-color-secondary: #a3a6ad; + --el-text-color-placeholder: #8d9095; + --el-text-color-disabled: #6c6e72; + --el-border-color-darker: #636466; + --el-border-color-dark: #58585b; + --el-border-color: #4c4d4f; + --el-border-color-light: #414243; + --el-border-color-lighter: #363637; + --el-border-color-extra-light: #2b2b2c; + --el-fill-color-darker: #424243; + --el-fill-color-dark: #39393a; + --el-fill-color: #303030; + --el-fill-color-light: #262727; + --el-fill-color-lighter: #1d1d1d; + --el-fill-color-extra-light: #191919; + --el-fill-color-blank: var(--el-bg-color); + --el-mask-color: rgba(0, 0, 0, 0.8); + --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); + --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, + 0px 8px 16px -8px #000000 !important; + /* wangeditor主题 */ + --w-e-textarea-bg-color: var(--el-bg-color); + --w-e-textarea-color: var(--el-text-color-primary); + --w-e-textarea-border-color: var(--el-border-color); + --w-e-textarea-slight-border-color: var(--el-border-color-light); + --w-e-textarea-slight-color: var(--el-border-color); + --w-e-textarea-slight-bg-color: var(--el-bg-color-page); + /* --w-e-textarea-selected-border-color: #b4d5ff; + --w-e-textarea-handler-bg-color: #4290f7; */ + --w-e-toolbar-color: var(--el-text-color-primary); + --w-e-toolbar-bg-color: var(--el-bg-color); + --w-e-toolbar-active-color: var(--el-text-color-primary); + --w-e-toolbar-active-bg-color: var(--el-bg-color); + --w-e-toolbar-disabled-color: var(--el-text-color-disabled); + --w-e-toolbar-border-color: var(--el-border-color); + --w-e-modal-button-bg-color: var(--el-bg-color); + --w-e-modal-button-border-color: var(--el-border-color); +} diff --git a/admin/src/styles/element.scss b/admin/src/styles/element.scss new file mode 100644 index 0000000..07d8e5d --- /dev/null +++ b/admin/src/styles/element.scss @@ -0,0 +1,145 @@ +:root { + // 弹窗居中 + .el-overlay-dialog { + display: flex; + justify-content: center; + align-items: center; + min-height: 100%; + position: static; + + .el-dialog { + --el-dialog-content-font-size: var(--el-font-size-base); + --el-dialog-margin-top: 50px; + max-width: calc(100vw - 30px); + flex: none; + display: flex; + flex-direction: column; + border-radius: 5px; + + &.body-padding .el-dialog__body { + padding: 0; + } + + .el-dialog__body { + flex: 1; + padding: 15px 20px; + } + .el-dialog__header { + font-size: var(--el-font-size-large); + } + } + } + + .el-drawer { + --el-drawer-padding-primary: 16px; + &__header { + margin-bottom: 0; + padding: 13px 16px; + border-bottom: 1px solid var(--el-border-color-lighter); + } + &__title { + @apply text-tx-primary; + } + } + + .el-table { + --el-table-header-text-color: var(--el-text-color-primary); + --el-table-header-bg-color: var(--table-header-bg-color); + font-size: var(--el-font-size-base); + + thead { + th { + font-weight: 400; + } + } + } + + .el-input-group__prepend { + background-color: var(--el-fill-color-blank); + } + + .el-checkbox { + --el-checkbox-font-size: var(--el-font-size-base); + } + + .el-menu--popup-container { + &.theme-light { + .el-menu { + .el-menu-item { + &.is-active { + @apply bg-primary-light-9 border-primary border-r-2; + } + } + .el-menu-item:hover, + .el-sub-menu__title:hover { + color: var(--el-color-primary); + } + } + } + &.theme-dark { + .el-menu { + .el-menu-item { + &.is-active { + @apply bg-primary; + } + } + } + } + } + + .el-message-box { + --el-messagebox-width: 350px; + } + .el-date-editor { + --el-date-editor-width: 280px; + .el-range-input { + font-size: var(--el-font-size-small); + } + } + + .el-button--primary { + --el-button-hover-link-text-color: var(--el-color-primary-light-3); + } + .el-button--success { + --el-button-hover-link-text-color: var(--el-color-success-light-3); + } + .el-button--info { + --el-button-hover-link-text-color: var(--el-color-info-light-3); + } + .el-button--warning { + --el-button-hover-link-text-color: var(--el-color-warning-light-3); + } + .el-button--danger { + --el-button-hover-link-text-color: var(--el-color-danger-light-3); + } + .el-image__error { + font-size: 12px; + } + .el-tabs__nav-wrap::after { + height: 1px; + } +} +@media (max-width: 768px) { + .el-pagination > .el-pagination__jump { + display: none !important; + } + .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-button { + // 防止被tailwindcss默认样式覆盖 + background-color: var(--el-button-bg-color, var(--el-color-white)); + + //覆盖el-button的点击样式 + &:focus { + border-color: var(--el-button-border-color); + background-color: var(--el-button-bg-color); + } + &:hover { + color: var(--el-button-hover-text-color); + border-color: var(--el-button-hover-border-color); + background-color: var(--el-button-hover-bg-color); + } +} diff --git a/admin/src/styles/index.scss b/admin/src/styles/index.scss new file mode 100644 index 0000000..7bd1726 --- /dev/null +++ b/admin/src/styles/index.scss @@ -0,0 +1,6 @@ + +@import 'element.scss'; +@import 'dark.css'; +@import 'var.css'; +@import 'tailwind.css'; +@import 'public.scss'; diff --git a/admin/src/styles/public.scss b/admin/src/styles/public.scss new file mode 100644 index 0000000..a11a8bd --- /dev/null +++ b/admin/src/styles/public.scss @@ -0,0 +1,18 @@ +body { + @apply text-base text-tx-primary overflow-hidden min-w-[375px]; +} +.form-tips { + @apply text-tx-secondary text-xs leading-6 mt-1; +} + +.clearfix:after { + content: ''; + display: block; + clear: both; + visibility: hidden; +} + +/* NProgress */ +#nprogress .bar { + @apply bg-primary #{!important}; +} diff --git a/admin/src/styles/tailwind.css b/admin/src/styles/tailwind.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/admin/src/styles/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/admin/src/styles/var.css b/admin/src/styles/var.css new file mode 100644 index 0000000..a10631a --- /dev/null +++ b/admin/src/styles/var.css @@ -0,0 +1,48 @@ +:root { + --el-font-family: theme(fontFamily.sans); + --el-font-weight-primary: 400; + --el-menu-item-height: 46px; + --el-menu-sub-item-height: var(--el-menu-item-height); + --el-menu-icon-width: 18px; + --aside-width: 200px; + --navbar-height: 50px; + --color-white: #ffffff; + --table-header-bg-color: #f8f8f8; + --el-font-size-extra-large: 18px; + --el-menu-base-level-padding: 16px; + --el-menu-level-padding: 26px; + --el-font-size-large: 16px; + --el-font-size-medium: 15px; + --el-font-size-base: 14px; + --el-font-size-small: 13px; + --el-font-size-extra-small: 12px; + + --el-bg-color: var(--color-white); + --el-bg-color-page: #f6f6f6; + --el-bg-color-overlay: #ffffff; + --el-text-color-primary: #333333; + --el-text-color-regular: #666666; + --el-text-color-secondary: #999999; + --el-text-color-placeholder: #a8abb2; + --el-text-color-disabled: #c0c4cc; + --el-border-color: #dcdfe6; + --el-border-color-light: #e4e7ed; + --el-border-color-lighter: #ebeef5; + --el-border-color-extra-light: #f2f2f2; + --el-border-color-dark: #d4d7de; + --el-border-color-darker: #cdd0d6; + --el-fill-color: #f0f2f5; + --el-fill-color-light: #f8f8f8; + --el-fill-color-lighter: #fafafa; + --el-fill-color-extra-light: #fafcff; + --el-fill-color-dark: #ebedf0; + --el-fill-color-darker: #e6e8eb; + --el-fill-color-blank: #ffffff; + --el-mask-color: rgba(255, 255, 255, 0.9); + --el-mask-color-extra-light: rgba(255, 255, 255, 0.3); + -el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.04), 0px 8px 20px rgba(0, 0, 0, 0.08); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.12); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.12); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.08), 0px 12px 32px rgba(0, 0, 0, 0.12), + 0px 8px 16px -8px rgba(0, 0, 0, 0.16); +} diff --git a/admin/src/utils/auth.ts b/admin/src/utils/auth.ts new file mode 100644 index 0000000..e7a6877 --- /dev/null +++ b/admin/src/utils/auth.ts @@ -0,0 +1,18 @@ +import { TOKEN_KEY } from '@/enums/cacheEnums' +import { resetRouter } from '@/router' +import useTabsStore from '@/stores/modules/multipleTabs' +import useUserStore from '@/stores/modules/user' +import cache from './cache' + +export function getToken() { + return cache.get(TOKEN_KEY) +} + +export function clearAuthInfo() { + const userStore = useUserStore() + const tabsStore = useTabsStore() + userStore.resetState() + tabsStore.$reset() + cache.remove(TOKEN_KEY) + resetRouter() +} diff --git a/admin/src/utils/cache.ts b/admin/src/utils/cache.ts new file mode 100644 index 0000000..d98624f --- /dev/null +++ b/admin/src/utils/cache.ts @@ -0,0 +1,50 @@ +const cache = { + key: 'like_admin_', + //设置缓存(expire为缓存时效) + set(key: string, value: any, expire?: string) { + key = this.getKey(key) + let data: any = { + expire: expire ? this.time() + expire : '', + value + } + + if (typeof data === 'object') { + data = JSON.stringify(data) + } + try { + window.localStorage.setItem(key, data) + } catch (e) { + return null + } + }, + get(key: string) { + key = this.getKey(key) + try { + const data = window.localStorage.getItem(key) + if (!data) { + return null + } + const { value, expire } = JSON.parse(data) + if (expire && expire < this.time()) { + window.localStorage.removeItem(key) + return null + } + return value + } catch (e) { + return null + } + }, + //获取当前时间 + time() { + return Math.round(new Date().getTime() / 1000) + }, + remove(key: string) { + key = this.getKey(key) + window.localStorage.removeItem(key) + }, + getKey(key: string) { + return this.key + key + } +} + +export default cache diff --git a/admin/src/utils/echart.ts b/admin/src/utils/echart.ts new file mode 100644 index 0000000..3d3aee0 --- /dev/null +++ b/admin/src/utils/echart.ts @@ -0,0 +1,65 @@ +//引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。 + +import * as echarts from 'echarts/core' +//引入柱状图图表,图表后缀都为 Chart +import { + BarChart, + LineChart, + PieChart, + MapChart, + PictorialBarChart, + RadarChart, + ScatterChart, + GaugeChart +} from 'echarts/charts' +// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component +import { + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + LegendComponent, + RadarComponent, + ToolboxComponent, + DataZoomComponent, + VisualMapComponent, + TimelineComponent, + CalendarComponent, + GraphicComponent +} from 'echarts/components' + +//引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步 +import { CanvasRenderer } from 'echarts/renderers' +//标签自动布局,全局过渡动画等特性 +import { LabelLayout, UniversalTransition } from 'echarts/features' + +// 注册必须的组件 +echarts.use([ + LegendComponent, + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + BarChart, + LineChart, + PieChart, + MapChart, + RadarChart, + PictorialBarChart, + RadarComponent, + ToolboxComponent, + DataZoomComponent, + VisualMapComponent, + TimelineComponent, + CalendarComponent, + GraphicComponent, + ScatterChart, + CanvasRenderer, + LabelLayout, + UniversalTransition, + GaugeChart +]) diff --git a/admin/src/utils/env.ts b/admin/src/utils/env.ts new file mode 100644 index 0000000..d8951e9 --- /dev/null +++ b/admin/src/utils/env.ts @@ -0,0 +1,13 @@ +/** + * @description: 开发模式 + */ +export function isDevMode(): boolean { + return import.meta.env.DEV +} + +/** + * @description: 生成模式 + */ +export function isProdMode(): boolean { + return import.meta.env.PROD +} diff --git a/admin/src/utils/feedback.ts b/admin/src/utils/feedback.ts new file mode 100644 index 0000000..91672ab --- /dev/null +++ b/admin/src/utils/feedback.ts @@ -0,0 +1,95 @@ +import { + ElMessage, + ElMessageBox, + ElNotification, + ElLoading, + type ElMessageBoxOptions +} from 'element-plus' +import type { LoadingInstance } from 'element-plus/es/components/loading/src/loading' + +export class Feedback { + private loadingInstance: LoadingInstance | null = null + static instance: Feedback | null = null + static getInstance() { + return this.instance ?? (this.instance = new Feedback()) + } + // 消息提示 + msg(msg: string) { + ElMessage.info(msg) + } + // 错误消息 + msgError(msg: string) { + ElMessage.error(msg) + } + // 成功消息 + msgSuccess(msg: string) { + ElMessage.success(msg) + } + // 警告消息 + msgWarning(msg: string) { + ElMessage.warning(msg) + } + // 弹出提示 + alert(msg: string) { + ElMessageBox.alert(msg, '系统提示') + } + // 错误提示 + alertError(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'error' }) + } + // 成功提示 + alertSuccess(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'success' }) + } + // 警告提示 + alertWarning(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'warning' }) + } + // 通知提示 + notify(msg: string) { + ElNotification.info(msg) + } + // 错误通知 + notifyError(msg: string) { + ElNotification.error(msg) + } + // 成功通知 + notifySuccess(msg: string) { + ElNotification.success(msg) + } + // 警告通知 + notifyWarning(msg: string) { + ElNotification.warning(msg) + } + // 确认窗体 + confirm(msg: string) { + return ElMessageBox.confirm(msg, '温馨提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + } + // 提交内容 + prompt(content: string, title: string, options?: ElMessageBoxOptions) { + return ElMessageBox.prompt(content, title, { + confirmButtonText: '确定', + cancelButtonText: '取消', + ...options + }) + } + // 打开全局loading + loading(msg: string) { + this.loadingInstance = ElLoading.service({ + lock: true, + text: msg + }) + } + // 关闭全局loading + closeLoading() { + this.loadingInstance?.close() + } +} + +const feedback = Feedback.getInstance() + +export default feedback diff --git a/admin/src/utils/file.ts b/admin/src/utils/file.ts new file mode 100644 index 0000000..a33a0f3 --- /dev/null +++ b/admin/src/utils/file.ts @@ -0,0 +1,16 @@ +/** + * @description + * @param file + */ +export function streamFileDownload(file: any, fileName = '文件名称.zip') { + const blob = new Blob([file], { type: 'application/octet-stream;charset=UTF-8' }) + const url = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.style.display = 'none' + link.href = url + link.setAttribute('download', fileName) + document.body.appendChild(link) + link.click() + document.body.removeChild(link) // 下载完成移除元素 + window.URL.revokeObjectURL(url) +} diff --git a/admin/src/utils/request/axios.ts b/admin/src/utils/request/axios.ts new file mode 100644 index 0000000..65703e0 --- /dev/null +++ b/admin/src/utils/request/axios.ts @@ -0,0 +1,165 @@ +import { RequestMethodsEnum } from '@/enums/requestEnums' +import axios, { + AxiosError, + type AxiosInstance, + type AxiosRequestConfig, + type AxiosResponse +} from 'axios' +import { isFunction, merge, cloneDeep } from 'lodash' +import axiosCancel from './cancel' +import type { RequestData, RequestOptions } from './type' + +export class Axios { + private axiosInstance: AxiosInstance + private readonly config: AxiosRequestConfig + private readonly options: RequestOptions + constructor(config: AxiosRequestConfig) { + this.config = config + this.options = config.requestOptions + this.axiosInstance = axios.create(config) + this.setupInterceptors() + } + + /** + * @description 获取axios实例 + */ + getAxiosInstance() { + return this.axiosInstance + } + + /** + * @description 设置拦截器 + */ + setupInterceptors() { + if (!this.config.axiosHooks) { + return + } + const { + requestInterceptorsHook, + requestInterceptorsCatchHook, + responseInterceptorsHook, + responseInterceptorsCatchHook + } = this.config.axiosHooks + this.axiosInstance.interceptors.request.use( + (config) => { + this.addCancelToken(config) + if (isFunction(requestInterceptorsHook)) { + config = requestInterceptorsHook(config) + } + return config + }, + (err: Error) => { + if (isFunction(requestInterceptorsCatchHook)) { + requestInterceptorsCatchHook(err) + } + return err + } + ) + this.axiosInstance.interceptors.response.use( + (response: AxiosResponse) => { + this.removeCancelToken(response.config.url!) + if (isFunction(responseInterceptorsHook)) { + response = responseInterceptorsHook(response) + } + return response + }, + (err: AxiosError) => { + if (isFunction(responseInterceptorsCatchHook)) { + responseInterceptorsCatchHook(err) + } + if (err.code != AxiosError.ERR_CANCELED) { + this.removeCancelToken(err.config?.url!) + } + + if (err.code == AxiosError.ECONNABORTED || err.code == AxiosError.ERR_NETWORK) { + return new Promise((resolve) => setTimeout(resolve, 500)).then(() => + this.retryRequest(err) + ) + } + return Promise.reject(err) + } + ) + } + + /** + * @description 添加CancelToken + */ + addCancelToken(config: AxiosRequestConfig) { + const { ignoreCancelToken } = config.requestOptions + !ignoreCancelToken && axiosCancel.add(config) + } + + /** + * @description 移除CancelToken + */ + removeCancelToken(url: string) { + axiosCancel.remove(url) + } + + /** + * @description 重新请求 + */ + retryRequest(error: AxiosError) { + const config = error.config + const { retryCount, isOpenRetry } = config.requestOptions + if (!isOpenRetry || config.method?.toUpperCase() == RequestMethodsEnum.POST) { + return Promise.reject(error) + } + config.retryCount = config.retryCount ?? 0 + + if (config.retryCount >= retryCount) { + return Promise.reject(error) + } + config.retryCount++ + + return this.axiosInstance.request(config) + } + /** + * @description get请求 + */ + get( + config: Partial, + options?: Partial + ): Promise { + return this.request({ ...config, method: RequestMethodsEnum.GET }, options) + } + + /** + * @description post请求 + */ + post( + config: Partial, + options?: Partial + ): Promise { + return this.request({ ...config, method: RequestMethodsEnum.POST }, options) + } + + /** + * @description 请求函数 + */ + request( + config: Partial, + options?: Partial + ): Promise { + const opt: RequestOptions = merge({}, this.options, options) + const axioxConfig: AxiosRequestConfig = { + ...cloneDeep(config), + requestOptions: opt + } + const { urlPrefix } = opt + // 拼接请求前缀如api + if (urlPrefix) { + axioxConfig.url = `${urlPrefix}${config.url}` + } + return new Promise((resolve, reject) => { + this.axiosInstance + .request>>(axioxConfig) + .then((res) => { + resolve(res) + }) + .catch((err) => { + reject(err) + }) + }) + } +} diff --git a/admin/src/utils/request/cancel.ts b/admin/src/utils/request/cancel.ts new file mode 100644 index 0000000..b092e1d --- /dev/null +++ b/admin/src/utils/request/cancel.ts @@ -0,0 +1,31 @@ +import axios, { type AxiosRequestConfig, type Canceler } from 'axios' + +const cancelerMap = new Map() + +export class AxiosCancel { + private static instance?: AxiosCancel + + static createInstance() { + return this.instance ?? (this.instance = new AxiosCancel()) + } + add(config: AxiosRequestConfig) { + const url = config.url! + this.remove(url) + config.cancelToken = new axios.CancelToken((cancel) => { + if (!cancelerMap.has(url)) { + cancelerMap.set(url, cancel) + } + }) + } + remove(url: string) { + if (cancelerMap.has(url)) { + const cancel = cancelerMap.get(url) + cancel && cancel(url) + cancelerMap.delete(url) + } + } +} + +const axiosCancel = AxiosCancel.createInstance() + +export default axiosCancel diff --git a/admin/src/utils/request/index.ts b/admin/src/utils/request/index.ts new file mode 100644 index 0000000..d278983 --- /dev/null +++ b/admin/src/utils/request/index.ts @@ -0,0 +1,130 @@ +import { merge } from 'lodash' +import configs from '@/config' +import { Axios } from './axios' +import { ContentTypeEnum, RequestCodeEnum, RequestMethodsEnum } from '@/enums/requestEnums' +import type { AxiosHooks } from './type' +import { clearAuthInfo, getToken } from '../auth' +import feedback from '../feedback' +import NProgress from 'nprogress' +import { AxiosError, type AxiosRequestConfig } from 'axios' +import router from '@/router' +import { PageEnum } from '@/enums/pageEnum' + +// 处理axios的钩子函数 +const axiosHooks: AxiosHooks = { + requestInterceptorsHook(config) { + NProgress.start() + const { withToken, isParamsToData } = config.requestOptions + const params = config.params || {} + const headers = config.headers || {} + + // 添加token + if (withToken) { + const token = getToken() + headers.token = token + } + // POST请求下如果无data,则将params视为data + if ( + isParamsToData && + !Reflect.has(config, 'data') && + config.method?.toUpperCase() === RequestMethodsEnum.POST + ) { + config.data = params + config.params = {} + } + config.headers = headers + return config + }, + requestInterceptorsCatchHook(err) { + NProgress.done() + return err + }, + async responseInterceptorsHook(response) { + NProgress.done() + const { isTransformResponse, isReturnDefaultResponse } = response.config.requestOptions + + //返回默认响应,当需要获取响应头及其他数据时可使用 + if (isReturnDefaultResponse) { + return response + } + // 是否需要对数据进行处理 + if (!isTransformResponse) { + return response.data + } + const { code, data, show, msg } = response.data + switch (code) { + case RequestCodeEnum.SUCCESS: + if (show) { + msg && feedback.msgSuccess(msg) + } + return data + + case RequestCodeEnum.PARAMS_TYPE_ERROR: + case RequestCodeEnum.PARAMS_VALID_ERROR: + case RequestCodeEnum.REQUEST_METHOD_ERROR: + case RequestCodeEnum.ASSERT_ARGUMENT_ERROR: + case RequestCodeEnum.ASSERT_MYBATIS_ERROR: + case RequestCodeEnum.LOGIN_ACCOUNT_ERROR: + case RequestCodeEnum.LOGIN_DISABLE_ERROR: + case RequestCodeEnum.NO_PERMISSTION: + case RequestCodeEnum.FAILED: + case RequestCodeEnum.SYSTEM_ERROR: + msg && feedback.msgError(msg) + return Promise.reject(data) + + case RequestCodeEnum.TOKEN_INVALID: + case RequestCodeEnum.TOKEN_EMPTY: + clearAuthInfo() + router.push(PageEnum.LOGIN) + return Promise.reject() + + default: + return data + } + }, + responseInterceptorsCatchHook(error) { + NProgress.done() + if (error.code !== AxiosError.ERR_CANCELED) { + error.message && feedback.msgError(error.message) + } + return Promise.reject(error) + } +} + +const defaultOptions: AxiosRequestConfig = { + timeout: configs.timeout, + // 基础接口地址 + baseURL: configs.baseUrl, + headers: { 'Content-Type': ContentTypeEnum.JSON, version: configs.version }, + + // 处理 axios的钩子函数 + axiosHooks: axiosHooks, + // 每个接口可以单独配置 + requestOptions: { + // 是否将params视为data参数,仅限post请求 + isParamsToData: true, + //是否返回默认的响应 + isReturnDefaultResponse: false, + // 需要对返回数据进行处理 + isTransformResponse: true, + // 接口拼接地址 + urlPrefix: configs.urlPrefix, + // 忽略重复请求 + ignoreCancelToken: false, + // 是否携带token + withToken: true, + // 开启请求超时重新发起请求请求机制 + isOpenRetry: true, + // 重新请求次数 + retryCount: 2 + } +} + +function createAxios(opt?: Partial) { + return new Axios( + // 深度合并 + merge(defaultOptions, opt || {}) + ) +} +const request = createAxios() +export default request diff --git a/admin/src/utils/request/type.d.ts b/admin/src/utils/request/type.d.ts new file mode 100644 index 0000000..a7f364d --- /dev/null +++ b/admin/src/utils/request/type.d.ts @@ -0,0 +1,38 @@ +import type { AxiosRequestConfig, AxiosResponse } from 'axios' + +import 'axios' +declare module 'axios' { + // 扩展 RouteMeta + interface AxiosRequestConfig { + retryCount?: number + axiosHooks?: AxiosHooks + requestOptions: RequestOptions + } +} + +export interface RequestOptions { + isParamsToData: boolean + isReturnDefaultResponse: boolean + isTransformResponse: boolean + urlPrefix: string + ignoreCancelToken: boolean + withToken: boolean + isOpenRetry: boolean + retryCount: number +} + +export interface AxiosHooks { + requestInterceptorsHook?: (config: AxiosRequestConfig) => AxiosRequestConfig + requestInterceptorsCatchHook?: (error: Error) => void + responseInterceptorsHook?: ( + response: AxiosResponse> + ) => AxiosResponse | RequestData | T + responseInterceptorsCatchHook?: (error: AxiosError) => void +} + +export interface RequestData { + code: number + data: T + msg: string + show: boolean +} diff --git a/admin/src/utils/theme.ts b/admin/src/utils/theme.ts new file mode 100644 index 0000000..d11fe18 --- /dev/null +++ b/admin/src/utils/theme.ts @@ -0,0 +1,74 @@ +import colors from 'css-color-function' +const lightConfig = { + 'dark-2': 'shade(20%)', + 'light-3': 'tint(30%)', + 'light-5': 'tint(50%)', + 'light-7': 'tint(70%)', + 'light-8': 'tint(80%)', + 'light-9': 'tint(90%)' +} + +const darkConfig = { + 'light-3': 'shade(20%)', + 'light-5': 'shade(30%)', + 'light-7': 'shade(50%)', + 'light-8': 'shade(60%)', + 'light-9': 'shade(70%)', + 'dark-2': 'tint(20%)' +} + +const themeId = 'theme-vars' + +/** + * @author Jason + * @description 用于生成elementui主题的行为变量 + * 可选值有primary、success、warning、danger、error、info + */ + +export const generateVars = (color: string, type = 'primary', isDark = false) => { + const colos = { + [`--el-color-${type}`]: color + } + const config: Record = isDark ? darkConfig : lightConfig + for (const key in config) { + colos[`--el-color-${type}-${key}`] = `color(${color} ${config[key]})` + } + return colos +} + +/** + * @author Jason + * @description 用于设置css变量 + * @param key css变量key 如 --color-primary + * @param value css变量值 如 #f40 + * @param dom dom元素 + */ +export const setCssVar = (key: string, value: string, dom = document.documentElement) => { + dom.style.setProperty(key, value) +} + +/** + * @author Jason + * @description 设置主题 + */ +export const setTheme = (options: Record, isDark = false) => { + const varsMap: Record = Object.keys(options).reduce((prev, key) => { + return Object.assign(prev, generateVars(options[key], key, isDark)) + }, {}) + + let theme = Object.keys(varsMap).reduce((prev, key) => { + const color = colors.convert(varsMap[key]) + return `${prev}${key}:${color};` + }, '') + theme = `:root{${theme}}` + let style = document.getElementById(themeId) + if (style) { + style.innerHTML = theme + return + } + style = document.createElement('style') + style.setAttribute('type', 'text/css') + style.setAttribute('id', themeId) + style.innerHTML = theme + document.head.append(style) +} diff --git a/admin/src/utils/util.ts b/admin/src/utils/util.ts new file mode 100644 index 0000000..1f54b8c --- /dev/null +++ b/admin/src/utils/util.ts @@ -0,0 +1,171 @@ +import { isObject } from '@vue/shared' +import { cloneDeep } from 'lodash' + +/** + * @description 添加单位 + * @param {String | Number} value 值 100 + * @param {String} unit 单位 px em rem + */ +export const addUnit = (value: string | number, unit = 'px') => { + return !Object.is(Number(value), NaN) ? `${value}${unit}` : value +} + +/** + * @description 添加单位 + * @param {unknown} value + * @return {Boolean} + */ +export const isEmpty = (value: unknown) => { + return value == null && typeof value == 'undefined' +} + +/** + * @description 树转数组,队列实现广度优先遍历 + * @param {Array} data 数据 + * @param {Object} props `{ children: 'children' }` + */ + +export const treeToArray = (data: any[], props = { children: 'children' }) => { + data = cloneDeep(data) + const { children } = props + const newData = [] + const queue: any[] = [] + data.forEach((child: any) => queue.push(child)) + while (queue.length) { + const item: any = queue.shift() + if (item[children]) { + item[children].forEach((child: any) => queue.push(child)) + delete item[children] + } + newData.push(item) + } + return newData +} + +/** + * @description 数组转 + * @param {Array} data 数据 + * @param {Object} props `{ parent: 'pid', children: 'children' }` + */ + +export const arrayToTree = ( + data: any[], + props = { id: 'id', parentId: 'pid', children: 'children' } +) => { + data = cloneDeep(data) + const { id, parentId, children } = props + const result: any[] = [] + const map = new Map() + data.forEach((item) => { + map.set(item[id], item) + const parent = map.get(item[parentId]) + if (parent) { + parent[children] = parent[children] ?? [] + parent[children].push(item) + } else { + result.push(item) + } + }) + return result +} + +/** + * @description 获取正确的路经 + * @param {String} path 数据 + */ +export function getNormalPath(path: string) { + if (path.length === 0 || !path || path == 'undefined') { + return path + } + const newPath = path.replace('//', '/') + const length = newPath.length + if (newPath[length - 1] === '/') { + return newPath.slice(0, length - 1) + } + return newPath +} + +/** + * @description对象格式化为Query语法 + * @param { Object } params + * @return {string} Query语法 + */ +export function objectToQuery(params: Record): string { + let query = '' + for (const props of Object.keys(params)) { + const value = params[props] + const part = encodeURIComponent(props) + '=' + if (!isEmpty(value)) { + if (isObject(value)) { + for (const key of Object.keys(value)) { + if (!isEmpty(value[key])) { + const params = props + '[' + key + ']' + const subPart = encodeURIComponent(params) + '=' + query += subPart + encodeURIComponent(value[key]) + '&' + } + } + } else { + query += part + encodeURIComponent(value) + '&' + } + } + } + return query.slice(0, -1) +} + +/** + * @description 时间格式化 + * @param dateTime { number } 时间戳 + * @param fmt { string } 时间格式 + * @return { string } + */ +// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 +export const timeFormat = (dateTime: number, fmt = 'yyyy-mm-dd') => { + // 如果为null,则格式化当前时间 + if (!dateTime) { + dateTime = Number(new Date()) + } + // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式 + if (dateTime.toString().length == 10) { + dateTime *= 1000 + } + const date = new Date(dateTime) + let ret + const opt: any = { + 'y+': date.getFullYear().toString(), // 年 + 'm+': (date.getMonth() + 1).toString(), // 月 + 'd+': date.getDate().toString(), // 日 + 'h+': date.getHours().toString(), // 时 + 'M+': date.getMinutes().toString(), // 分 + 's+': date.getSeconds().toString() // 秒 + } + for (const k in opt) { + ret = new RegExp('(' + k + ')').exec(fmt) + if (ret) { + fmt = fmt.replace( + ret[1], + ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0') + ) + } + } + return fmt +} + +/** + * @description 获取不重复的id + * @param length { Number } id的长度 + * @return { String } id + */ +export const getNonDuplicateID = (length = 8) => { + let idStr = Date.now().toString(36) + idStr += Math.random().toString(36).substring(3, length) + return idStr +} + +/** + * @description 单词首字母大写 + * @param { String } str + * @return { String } id + */ +export const firstToUpperCase = (str = '') => { + return str.toLowerCase().replace(/( |^)[a-z]/g, ($1) => $1.toUpperCase()) +} diff --git a/admin/src/utils/validate.ts b/admin/src/utils/validate.ts new file mode 100644 index 0000000..0f8d8f1 --- /dev/null +++ b/admin/src/utils/validate.ts @@ -0,0 +1,7 @@ +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + return /^(https?:|mailto:|tel:)/.test(path) +} diff --git a/admin/src/views/account/images/login_bg.png b/admin/src/views/account/images/login_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..787837a256587e81c2ffd3abcac0324acff7a718 GIT binary patch literal 59273 zcmYJadpwi>|35x9GjrOQ^P#!Sc`@ZM$C!=j;M4)-utX`!l%kUCa+*0cl|zY02c;UF zR1O$;xH4e;|(#_D1b2!ygP zlOBXXsDgiD*s@6Q=VPz&82Fq-Jt~j1(9=a=O?T+3rZ;s+SJqBqqd7B%Ye0ap=omZ6g<$U^ro%+6t6#6^@8aH3F ze0(HDCiycHH&_;hcr&y&Xi|c?vBh83P8qR=@+Nxv7#+z8)gShgnVZYTclNHXOx}@t zW#{wL^CVS7{}f%rMQ=1ip>XMxAaHi14xj6j}4m3~R#r58^!f+hpTf2>4Wu_q76 z(N}mias>5_hs|!>Pql@$x!Eeti2DJv_z!L4?oqeX>t%d)*KFu#9uppP6Q(GAacXPAm;SM95ZLPO`$~3>cy$EW5@66~u+|0*QB;|KubHSJ!abz;V*V&+Vbu6q zYGy0h7o|$SZl3N`1BEDk^ACyVe5)9wyKR+S_>0(uiu5=_f-nBEhL>uHg3A1QzgZRP zo(b0XR-avzLfV`hUW_q3cUJv?yudlz5WGkYUG>sWy6);O@-RU9vXE3N*1MVk^ibQGQ;R#qtK!E9W5UK37I?xSA zWARF6kNu$84!@Pfp%c`;i$9^JHF$l;BHV&GWO77kn?j1;d*y?Lai#@lx*-CoKk%rr zZvr5AM7YtdpA7%3(l#*)nK-w2?UPNh8Y2D#!0(7~%q?iIIYHM*X_B(pX)oy|S*w*&G8obVg{-Ej=!~pJ)dQ3iz*Y`rs=I=}2|9KNoK$Mk*4>BtkmiO*YI9l*mF z-rqRAV`M)mT-jjh&om22CeT0E1RyuE5=u$_+jzuNknLo9=^9?&trZH2Qqa%9Y%aR` z$C811tPnr_cXQ}=lute=!+O~qYr-v=y9MU>c;ybLDV=d;=p3d{3ozjtO2r2LX*hL8 z8`R;+3zNLsQ=xT+7VA?PwNKTkn)o@{ghNX88-F`L{&2^;C@lv1ns z>@-)*Y0VScN3++t1=UNdXDTHZR;);)3+&auH(eS*ELw}#U;GYKr&P#cueo!nLr@88Q1@~{W>K;^nxf`V&GK$=>xp|qL4oO;5-W~qf6?HpH6!J?(vKr+$wHY6Vh+cIjt6h6oi@$D}7QcUm_;O%M?J27Y z)7b(gysH^yfs+eK`ni+hlc=v&#*maD-r{W^k@xPb<<#8L;3Si+k+z@1-I z=1ev5VLK+d;zh}aKMM)ikE+7DSibm3~@vYUdfk9CHJlrMYnSL@#3YVtz;-(MdKvdY5H%RDX8%_vXGx+JK$+=YV0TzWO@?z-IUP^5A_wcj;xBF>Yt-VR(- z)-S<$3v^j~P{yzQf2!ZVj2``%K=NI(;klW&s79T?GG3hTMta^mdS}vcwW_4};5)?tU9_&MxfYR#QcItOn1|j~B$lBFy>E#9K3- zr-xvisrSZ1AX* zmMuJhP{fRW*dFj70JFFKHzsDvh&JT3_@;}mb4+}NJ>LyBBj`bra6G=?(K2!GnFzJ4k=3f^L45 zsBIFCpQ;Cdjc_IoYw;JAmXS-^z5Z0qYbJ4u$Gp9szNC>8dBDcCYG)f&mR+lf+C`DWjX1E6 z-tlW)6uW14LI&;xH#!QrB@zEyM$SnIGrER0_ERBU?1#(?Xj<{%Q6sf4muXr_d*%9C z#Id-)2~#bQ6(x60RS5@rPoOn%O{WuKZTkGV@eaAqg4gW~;jjflAhGk`=8p@9bI{p~@f`>&^a}x?S~W zrJ)KYVjXc-dprZ+yaAWGIiVyg*N?s=QNHzn5>FhU%+3|^EpZ>Pn0ej;ZQ~72Ld@H@ zKXL=h{*^o=m$|p|VbXnmCN0P9@x3|Q!G=G z5WB1b6w5)7&id17zS0@$KfR8=q=7SWxvzSgn24)p&&ik`vnNvT$%|g1HI2*ekCOB7 zAfa&;G8EJ^fbimo3*ITs8@jzjk6Ju4G5X%O*^}b&k5~dVemitX=EvW2<~Ved2DSsS z2<50eGPkl3jd~$t=(rExb>AR_UVDo(TvUkD-|9QPT@G&hEy?J8!AT%pj>CNj!MX03 z`B!TfJYS`rR>>wEIvx{OEx>#}Bc8Gss9_&JjT{{%E8;-=Morgx9#8mU>Zl_=Obz{0EO3WfqvCClf-O9vgdFwVdeG z84bR5@q=a!{z})ZOAL}mX|9t^tFf!C^M>#yb7I+w`RnrjmpRG9sSzBpl_si4=Wib9 zfA(UiF8)TRXZoHiAHJ->Rz@JLswEdOSzv))i?sIo!BBB$wHINp2@2CX0<#vb%KNu* ze%hc=uc}@2W+!%CIrUE~yy;O9jVs8+rp~6&J=b2cO$e1|hoi zf_nJe8^<4ImpMJ~Qo=Q#_mE_WWquQr^g=u&<@T`5fBm|SKCbMtlAkVCfB2}eoj<2$ zfKt_+{eJPva`UU+5^i4})AW<@BDeEXNjR^04(F9FF4twXc3Ao(;YJczG9pDe*k+`G zn9}@?A=QyR#?Y6NXB(m}Wzv*zVY^5sgfk#8Nm^<6vBwt!sNOSB|6Hk*6(d}x+OtIF z-!Tm%0;cCzm!ZpF^ytfDkCO)w8w%~#|5wfK<@9Z4WzAl=z1p-fo5CZn{2QJmu<%%m z2FLC~oqv#pC*A^M9>yM6G>F*QZ_UVenM8|D{7PKCP?8B1&e z@g3>lb|i@1fh~`!>dU`gVq8D~hN6)Rn*6~R`#NZE(i=P6;y z`}MDgPAD;udcAMZGzT)69$-M1JlPlo?29g2TPV-QxyAw|4x&vC$rzeR*GZ%Mu4UIS z&NL^c)Oko6=Sj@!rLkh3@$m7OdwKt`_{3wz1-DYm_#Tpdi&Kv2=%ZAV#RtAR8|7+X z?{UGB2F`w{|954@aAF7F51~ILd-3`4m;wkCQ(qsnRT>9&1C^e|Coqr@CWEDIAFKz53 zC(D?BAS$W;KVz-jtLq;$xLi@S6UxFj^d-m-rg{$SV-f2QbxJFZyC`LhD~|suFpIBS zEup$&&b$Jn!E*l6cyYMH4PuJaj&ZWMm0SD%XQh(hp8kW2AsEMQ2jY;bz*8dN=;4|x z8th>o?mu}n}ovIAsskt~Axd22$7-v)AQg;><>M&zGfZ%LI4 z`&No)F%X)C-QHUKGXuhdT;`QM=^(1VU86en4*0CVSyOXVFt%Vr#)aau=X%puD9%UQ z&lq&t>Um|?XSZfHTu7{>hhY=xn7#6zw=BQRJDy02>bW`rJt`kdYufqod&-|*F9VAv z(bVGyxw*rktZDvpzFTVqYC&FJmH&RX{HOxIFdwpny&!zEq4>k5(}G-f+~L`@;4D-|a+pz^ld%@fPZ=P*}=v2c)6r>)W@^N5m1Zb59fXid>=`{M6R z5RRENoFw@@MnM7tut@E_nYY;mg$#_t%cTuu?}zdmlR1A%?-^{W{NN7O0LPz)?0Zg zq@8X4U@g!REj$8o>n^4!@%6`Di!)bff|z4`7sJV#Aq>fy44MtR2&WI(@8m4w;Of}v zZ#Tv=BpMl*>z-rlQEmQvhr`9+Wp)^pi-_OXOo)ww4rprU{0jy)Gbg-u&fO}LEVknr zpGv`p@jG&u-+x)ysQ^zHSyTMT?qzo%cg#B#{X1@_T)#mnkz!m|d=9f9Osqwr@4SD} z2eN>l8Cq=86rJ>bA9)^=_TxNA$sR+i{XN1-1USdUt5WWnc^9NbtwB#h+GN4Jzls_B zY9BsKE*n?ppqNjq)en>{Un-ZCafzAYH%BqKg)}>%_)}|Q(`Wv9Ar2aN1E8tZ?_#h$ zNHBwRB-vuIi(-A!nctt~pX{sLXDACYPvmUm9x;9pP~ijNMR7$*3^FW|jSHae_N>+t zX`ICH-|v*qHVP_?r%Piwfmz45Gt(5YIBQXQ6B+F}s4Qv4wV~JCO@^qI(CkVQD7WFGKtXcUxyu>E#ocAD$a`gG`T+DJuM(nf|B^MbV*!DGW*o z%M9K>A2WQOlF76WmEL;)BIZm==wL4Ez*@7}jz1KW_2RS|XsF`1fBrhyh<^T_?7_Pr zKBkd5i7L!GdFTcvJ6T-2^tGp?UM%3T7IOQ} z2V^p@g|G;a27d$Ibqpse`gZbAFe*cC9p2U6+I+^QdsLOdU6Ti%I`}-yX^dfP53aWU zq+I2hC*Ak+#Fm2pyS>0i_ge}{8S66!ZI)ZiF80m^*o|TM+Y;ryje_u93U^mvi;|)v zZu;kMJ}CR#BqLc|+84hVz8!)3Y@p1atisjt6_vbdp&*>d3Urpe`Bk#_CJ!o+F)!T8jj?->$zp;56#rnD6LARE|c{UxSr zF*>V*GHY;H)=k3r+PRkmUJ%Hr@bjh1nt>^WMXWB(U?rRG>wboAdls@Ix{8hvnuJd# z_PodyZ;3#?lJn=T$&jm@)3IR#hA{9Czcqf?@Ut;~B{qzuM~K)K@b3Tj`=3GauN2p? zK(6@gO^nK=)j<;3vs#w0|D&n&ANSs_k^xLbQzzZ%WTToLKhW-*a#C#DB&V`0unp3(g{LpOhSX zA2ZDQZvO^l!#+6pS!dInnfK=m6MD^pg&mgvK$Y!K6~GmjxCwV!mY7_?Sci&9ZlB70 z%!>S4Fs;Z+Tv;O%v?cnls_ zKc$DS=*l^w-Yk5QcH8YcL(&4u@(1m^-0bMUeX2HMS7O&!xDD($>SvzRJ~vP;W^`)d_xwWgzB+du(UM&UsyBMLptMQ6yN z;uYVScjw2xLMf^zaa+$A1ufOm&Sc_-g(Nt#MXfK6QYS5$UBPC4V6)G2B$3Vw1Bpp{ zk@&U9r^Xz9RDhXRXY<6xa)T#(XHQC0nrNgqRWtyNu^x^8M^m}Af~4E+wxSgM$txUUt~`KU(0RH!we%($6u7jwB5@;vRGobRnG?g zoNh&jT9IJEYHG`|-Xe3?Vz9A#-nW3eHHUaC^(p_pJ8fh|mLfkzOFNsXJ**}&)+~Ce z+pO_yX(zBE_-p@-Au+@cEAx+~00CC>-qD9lZK;(oK`d)fm(5jazYM6y9zEZe_Y=|< zYC?V1KuIZ3`_IPu|8oSgo*l{)tG%OM84XL&5d1}^=!kV5aD)*h(tv`mltnam^B61xLBjKJN83E5_2SkVJT-|d28*DNhH z!J7L<1$h^*HSO4Rzi}XHQ_P}kp+8LG4{(}@nFr)O6HF2}tDo}i`J`hv{&}Z6u8K8# zA~o%bQi_qnad(3#ZajTc?rANs?W=X0PS+O3$!GHk{v zd<%{>rGIr3R{!aICp#7sx<6fBwX3lZr%L-PTQoZQQD;|OmA0DAFq#nUts256zl#r<*AK;CvHRP zLDzP2+`LHhp`kSbI$mV3^T;8nDUGu|pseX+07G&UOgukca>{XC3y90@y*zOo3Ll@* zei4&aG7;D&e1RO9I^IPJ?m;htt|fAA;_C3Snxe_slGE&`)&dj1O%nn5RPR|_T|qL- zf&R4(DerkTqJt}zxw)kQp-OvVK=sSHn^*_URl2G{-U6 zUIljhrs?FR@px!zd>U=bJk8lE=#T&)5B#8+eS0R|-Knk_CUN^p9dH&tu$; zFPH!GXi8T*>4jI)Ao!u_Mm3lnw~$*}uKvFGI(uL3E>RBiVl#57Q8B_G>ZcwPr5?!i z-$mV~HPp8vzv0%YCy$SQ6Xr0tHzV8BX{0aVvFBaYxR}v>weJ{MpAOmECnZ+Q^k8}}{C;lyWi7v4H-S|NVz~^8s(1yAejxNEZ!|hXEHMl_3 zGiyP|KCs08(cH%_?X5Mepp{9+TWFRrBf_=5$gxSoCVd57nxg^gd zH9`#+jN{~(Ofxu6E5!`X0WM@t8mWyKfFS6YP?WzJU8LoTAGs<#^)Q#UbkIM49%VA zwSFK0#af+Qv0P7g<7y^;q)F&to;v*x50)3HHnKYFU%$Nh7KJo|6aL~vq8s}8Z{&I+ zTMG(6Q=>k;{kEWLO5gTc77%bzXRcV888CY&EPz?mM`usSZrNJlR8$KMar7ahmmIBB zDR?1xr7yXCtv7>n#rGm*uVw_a2@3;V^}$1r+?-dfyw5)-g7zW8D%cC9F^-FZ$j7u& zuIein*aFc}1#4zECu;$=sgQG+^YTq0i-~mhJww*9;?s0>QM>GxUoR_fHYMAx!&kf& z8maY2Q#9-3u?|7A-c{s2>_yC_NS06W%MW`l09{}g>O*5AQd!V)j=7#a+j&ky+6cz^!nLRk0xwdT+-4dnfvX|PQ=_30z~?v+=Oe|6g7Mevki8_kh3^MN zS^w){$4-h(jocxO%A2KvjNWG9)QQ)UPXP>poC}>63b_9@n_84<1iSd5igL}lpUws_ zft{6)t#ew*abS!M&;;!>XT-vPfN48j(NZ^a{XEtLU2wA(nXeCV$bjI#yp-QI zMFe~q07Kk@87z%47&213f4Mh|JE{5wqSEl9Xp7*-yUa6P1j^Xk4Yo)(;a&h0hb;M6 ztiW$J8Z;i`id(-i@0=oFH*#LRu_^UKMV`ZCtMENO2}iU*5V82w-Hc1-BnqBPX75mC z>+9vYEC2N|>Yp{2^5u$A@v=@_ND(R!b^HWo{;T%%#^oD1Pa>M_bP4lD^uHG-{-4(7 zq%$O0Etk1P`_04ZA!zF z^PZi=QR%WF;z(MpyHtG?xfq9KktN`>>S?*_42k3tPpt0>7O*U&chinNI(5h1BOq2) zvd&l|1PTe0J{rFHI_jY+smf%krYZBEHwlNmG5l!E3*(Q#j+*GJ0kylJm7He?{rwYJ zeFrE9l^4}|S30W{$+H=PRC&Msjs=Wmwmf~XLasIZzEN>%dSYbB%l)-A>1v{JS+jCw z>{?Vt4s&5%rMX-YXv-IcIxSs^<2%G( zy0378&hCsNgwnr`2-nfE22kVIas-WtHY+)M_wZo*A9=`;iMGdI+(iQr3KDSF_R#!CX zg(zm_;<0ilWF9jjnUxJ*%Z0~cJD}&Oo(R!;@NKCnrEH>eScpbV%X|tCz7lFJqrrEz zqXg5(bLNq_l~;*0Sy2yqF!xDFS9fDCRQwpdhs&Jn9YuMrDWMQkm~TSKCq3DY5);h2 zv$Aj?gQTkb0mpx?D?X$tDmB4i42yj^C|Jj#fA+MD=xj3Gyc5_@Q+%Y(Kh~zW-9xhZ z3LPQ(-D&~DFel@-eIOPCMe$`9P;ub@anYWAV)I@3u$?}$FM zy`g*V@gXAaVJyp-V7ktnfXlape!bw71NdYjre*F@ZMS(!MrtnVo93e(+9m~WPi$U# z^77-cEB^HNQOE@Xf3pg{Zp_~z1Hm+}s8Y{j5{F(2!RL%4&E!0?)Y3)n8sIGA9S)TULHyr+`&c8Jzw8rNys>z@kVKIaHzGr!CY5L&(X?bZ3!EGjx^cP8^{VPq_J#O|Tg8irO=gauUbP3~SPM|G zvM57r<${}goyb%3L+VuvF56)$LB&r(#b?oPK*a-;G1)lmVoW7IP-D`3%#K}b=3776 zX%5I<&AADwEu-7hjM@>A*sP5TNZ3iaLI+2-=?2}B)|v$v^HEuHcxR{#o8%_^(HV;$ zPiGCPr0$o8{pC;@Jm$iXaFkK|+_7N~t$IOb6r1H7Gvh3$@DGsOfLX1sG%fxmU1_x` zUVxa}q@CBd7-M<@_l9P4fpc$oC|%sO#)EQ>J7c4qPlSehHx{m;DP-kQX3OBrI~<$F z3nj)1m>oo@?gaPg9fLCP!NyB|^^r&%H7H@{lB-qKr8Cy@3KuwsucW<##jEjHr@hyF zq}9G+4OZF{Q*yyenvquWaX528xZXTZe4abG zQ69i_@sm(=7(3qiZnu2{adz}9A_fDm8S^F2_5V z%ba@`8Vp$`X5OIn7P$yC_?muz4$c@j@4K2T>gNpNu$)K(i`neJE~!#}+BF$%Nz@La zZyObAgQ5>`#Mn+u>&_G4L#!+us$5|95u#u+#`;}g zAwB|WHj%ch4@oxj_LTNjJcG0|k2!}MP{`6~?`|yBucO<-<-pDcoU4X0aP(EO*iNb? z+dL#uNE!I@w2Y}a?qM8D5#A&tT8ZB}57^m-ZVf#`mXdg1HBJ_l;M5P%WkdkPyI;21 zsTFq4q1>E)h11_psyx&H7#?%As4)SpRY~^npj_rWd2yky+<-O4EOb5nZ5gB1&w;W5 zID97vXu6BT?nk5ibImcY&f>-#*bWX=7&CzO8E(>yL75Gx?1Bu&fo4=bf|UAe?Inij z;OhON(?!rWQvER5FC_|h4(7QdkWMFQC5(_0r@u|^#C_aVSoo^ zYE2vt_i%)BEnukVsO|%VOXEMW*nr>q2oGXjUznK~^)y{Poo%e)iN$Y5wmr02CkrPs zY9~GkKjtwVW+KzYF3H@7x=ONA{HA3JH=W+4^7XsZ<{!Dt@Da`nO@2K0eHIO49P-ga zVg`K0i<5Adk7!_DdsAw-Nh1bL2k>3lVMJ{)Z7f%Z1z`t?#Ij+)Rej}$DmHDC=>)#6 z10|mu?X@81(@z`APb$&&_gbnqOIye-E{)m9s6FK%SV7-*FdcbP#(_9nK?8?2wu|jr zoC8cD0>on~>uGz_8;y2ivW^}stW8T7o3yOLw{I7drmbW|0;u1%Eeq^6NfdgqJMeafh%_ueWG%iFZ_E?#7nPIC&f%0 zF(kZ|y#I3=7PkW#XPlB`YSTTK{evro?F1C`2dUpb?t67k76E@pB-jRdChSZX=mA$8 z=MzeIFlYk*m>s1U;BrmB&SQ+Ji}Lq93sc}$@l>c>vNUkA<(WhFu`F`{K35W1vUZz1oHxD;i`#=VE7t`3E>Jh07o5Eyj?Xl8 z2IFdIl#*nGz{a`t$h7YeliCdKCHi|%YPm_B=(IOD{;?c={V6?+&-<65mH3uFS-UmWzgT<~7{tVIc)l%jp4PgG9v@+L^s! zmM=UV;(QBJ4mDRIYWvZ*z1tAW;ZA-qo|zX|TM=;0+I_ql|EvWrm~Un+(^&!dx(0Ns z4UVt>QJ5%~7`m>`v*?m__vU%y1lD50j)DMf56VgI(;=1SUtaY0tB&i4HST;da*B`* zD_PrOXp3=oT|DPA^52m2GU(f0ysRlSu!BXx=X!0I5vdxIf88*7_4VQYPUZT;o9mV+ z{EKO`ye5~~gD$Hvw^*T#bA@(kDzb2s%5&F#~nxjA*x#R8QGD`EUpUDEnFi?7t00aBj7vA@ln*ECUPF2xd7>+ z!KWsvpzg(hLpDGHG-NTCt|8A3hZH4H;4k!AQ(fw-CUriQz9ma4AHfahmd|B~b(J3y zQ}nI7fru=Oa$XoiiSJx7^VveaHtP5V=RU0kZ}tgvCR*s2<;bxQ^-5&3PQU*96EghAkkeHO~%>vClxN{{~=sT``RRT~cC z!s6sx_shWvg$P&6Lltz=_v74|MGovw;Hb$V1Zt73hX9Y={a`Zujr}!UkO>u&wJ@u5 zy2l1T)fUgX2i&2E+T*!>>KM}+^B?oHjTZqT>PYzP6$E@RI@1X1($ii|AMf2;xTZuy zh*-d3gMDW#zUl2nerx;n{cu3aQYA_Wcjo7f-j8aaL=HJ$)i}oA&t%{aW{>vfw0qU- zrR?wfycE-_;{n!9-r~G+*5p%32$9~A?nW}fTmCb#X&o}IT2dey8fzpU<4*38Qg@Y- zBu!Zk_P4137`+nSx!_ob_0J#AWsalKfC{8BrVkF+432c=l;;dNuq#jB9Al0(epnlE zlFK~!QMg#0pXtKBdWl%6-E#VjA`)J7VDIE!&_oZ*Yd0B6)uD_#*~Iybp_6_h^^p-J zZtf3VJ8yB!Zs!`ZG%B?j>im&ULYpFR+DPSuoG9ln`rk#mq3!hm+2AL48<1N=)}7t<(0 zh@NSq7QKrbGa6KGJ~8v>1q(It|1zViRSRfMSRP?c1e6>F4J0%`YOy@8aJP54hAT*!mGSR;n9YxZ*ac( z-qI^V`oQY^Fb7HZrVn9&A;f7U0aG|=^_UnkDy+DD`wK&x<%;i$LALGippWBDXkmY9 z(>6W^M->&bBJx>(&^>0`&ONmYE4ib_Py3^JD+^@49t9T!FineG!D%&g+G$V05@Lw5 z^D zhDA+xH%1S#7D-E_=qB8HK1tJ`=O@2{UTjaf#O*ZlWO)c~$%-OVrIGezPx;AJLZm`)3b<-TxKKs?tjDs$9>LcwL4A4|1aN# z3qdldQ@PBxJz_A2w96C&c_qj2_5-mF0-B_Lz z;wW+W{GXyby0CXaYCe>f-;WJ9r4MLe3Zwqz04A6^Fu~j+6WVi`HE6W7a{!1~Fh?0R z1eE>CyQ32C!9I_Esfh(Rm?@8(1oHIFQRV0*yJs88m0VIRD;CHYgiHN5wLBi$GF!Hn`&Xqx>-=gSUk87vRH zZzJ+W9&=JkPz=f}XR=8Khy9MQStaAs_3fXeY#3SfM<)x407LE{HUuLjfARN2kzFCKnmg2osw zW}aR7k4lxzH?=L5VfpSIFwlSBUhw%&&E6DH>H*(UyKv@2^OexOy4ZF}t~nuCbN!8V zFONhpvVO>7RbFb3?31}0Pgd5j-81o^1xtH)l)Iw(?y7fg++|jEZ&%Je^FO>bY4gs} zqbnRc{;aBW-}NS4-y#NcK)$EZP&aGK+$0lX)D9-IZgJ_VPnQSQFE{efSIN#ZA{(V1 zUYhw_=+JU8QK8umjsaWXNlqQ4<`%GYzXg$+{usQaDGbmX!e;525q^kP;K-}N3@+aq z;zf_r7Msum@r&G<2$3fOJkT9?@;ayd!2`TVV6onO8|k=D0D30G(n(5BS=ZY$Y6;bNjN!|Rro6HEmF>n@-x!r-1!F@VuJ+o8i z?sUg`SD!<>iqd$p(VW*om?$bb08Hb z3%|Y3hg5JY6If=19r>lS>JWV09W;2JZ%~r-z$_jA{9{5D$y$WDlLw`R-kLDD-QuMbUHGsA(yFrP7yW^C8l)A z!c)p~8mON+m5HRAP|$7Vxu!GR&Lu+pPLdHZC7m|rzF8VDu%KJM>&cVW@RFle(6w90 zQ(Qt2gS79Y1E%Clr#Z|@UTZcd?2Dd3S4LytzqiR&!F1=FoZVceGMbvC@7ohIY-LVp zOlN^Atkv(D`8&>p!Q)^u3yse`ul{_YLK~NV(CePdzpUlq1K`CmW>+25-=$pdMQ=wu z)x>6T#HvcfvQc3yDp;zc60`j+qKpne%xh5!&xa(Bcxh)Tq9KK;t zd7Aw7bJzprAlh_4T)s21LosUxJ?b~2eyUX=3*7#{Fn;UT5jyx40ZsX#9+VTvgezCh zrcN-c7`0YQ7_|<2STMKKQMkw*D`tvjW^mv@O-FZy(WF7j(z|BfEo#`$vKURiUo6WW z@J%;e{Cy0$fHiisLBJWD;HW>B&}s#HM{?^GizdA~}&-rS>)AtP(7i z9et~0Q79t5Tk9mtj<29H#BejC0A;qa67Ap+i5Sn zFz}Tqi>kVUOg*X$a@ST}{kwxdna6C4W37@R%n@gRT`jRTCh0)M5}<5@KDs}>-&B~X zR=8={K-ZoKlZQYgcK6TYzI49R!s&ajC|t&vQvP7w{oEjBTXV`H-&XES9CBI>D2;L! zEe)qn#kqP_ACf~oNftjmb$bt%Ub{|rcK(@vNX9Wp?FB;1#fUhhkR?P*+wwK#w3d6Z zEPm=Ode9W0g2!09^AMscrywPLX(yBzug$TzoFX>1!0|C{ooXhK{V1n2Mt_BjC`5RB zgH%BCb1d*AxxYQTYPSGak-8y|^O%`3-r$D^D3?Mzwtihx$&$=gjHSF|0w(_1qCIFlOfJt)ng$r$)K4=g?{Gs)F7~C*;69)cS!hKx@eq9^N>8n zX6+J$w)sgp<+^fe{tt2~7=O0>P>uZs_4m0@u5dGDt`SpY@L_NN(PgDy`2(NzNq?4J zRl!f)Ll2q(Yl(2oNxwkiS6KfccQ^Iye;l5o$kC(zST#K zKcqXP!Y0S08(<8Va9I10r;46>724f*(Kmtm{gvze=3ugimK1*I%cP~i?E8eP4 z8}F_%-iqhHQzm=Sw>b;(A`I z%UU)`5#I7{DO)O<`R+kcXI>8KTm@&A+i2b3HI53KizH7reqd4cWF=Bp!R|r#KmqXl zR(pY;v=5z%!8~<0^(OiD{-aAWM}&JTU3GVdZ%H}FpgV7q*Caw4kFB)v2@8jlhX2C*rJIIE#Irk87%)_^WhroKd?-FQg9C50O1!bPzswS7?8fLIL_9qu^T5{;a-(jV1YL+Bb;zJX?44aKF zE*!$)UJTzZ3e8GWOSDj0OuO%bIac8H!TIIHY{GBNHLq67*PqrFP{ZFoP0mxG|L)`H zc#@d0d91Cb-EYQDCyVVXgX;*>+ha{}z6a5t<`|^cVX?kXmMpamb#QW4BZyvKX^)iI zFFyP|riidb=@AODS6QhDdG=q&v{Hgl%l0MlZkuRLyEe_Jg#Ep_)_-8Hx$WKFHN@f~ zWH2#k(4LF(wOVC5ym?bpW4#qDKYllAH!FId{H4r>kPhaiSWBG33X#-YqtCGqD_53W z1c$ModTf+u2u3-!nsJ4FM*^kR`WJ#?r-^E$fa7M~TmF=1K~4Lj)_7mS{Lod^8sTW& zX`bR|<43dK$npia4CWzq zPiwfNlH*@;?_R^*-e_X~Y2+1{$!lnYrW{_pFo%yDS}3na{W;tFXw8Y~j+`%#vQ3fv z`9$;?1fQTc>$<9YIBm-*jG?k0Bl?La9-J6EtGk73D_!(2h^u6Hu}s$4B1Ta8J}r@_ zK}ulQ22;N;cY5QA#Xpo%<)8v*IX-dg2GrT>JaM9yG-JG%P3dkWgBS6!4mbrxTW;-; zux^@Pzp~^b(tKp|SRShd=`wco^ECc0Fw!6SSV#hxT+CzX`RCVQ_N?A*>e5CwpVMh- z*Qv>`p7J1(e`#GQFdI3`br>47MJ@(gna@^-?zCEv+##@Swmx|dl-S=qc}Dp5@{ z3b-1DhGepiI#e>)A@bfzEfFMU!#@0--b`ZgxKcd!pN-=wQCF>D&QjFD>VVI}W%qjV z;b)>z|0~O9zQgg09OYC6LgAIJv#w=x22Huun^rVvdy*dM%(fcgd|No(ib%Jh?+XXh z6W*0K+st4;30ElN!&gjs1F@AI<*_AK?>bvMwlI;weu!6@>fHoSTLH%DDuX=>YDl!Nt z>v{q(ks^G}`3~>(5)%{dOt(&%3cWv`r9C=GFM8^4=)Q*`dGgr*`=Xi?RJMj!=&tL`I2pukkCueJ?R``plx-@< zUr!bI;uMO1SUS2Wf}`n?CmjP&pC?yTuhRk;=$@So)VI*I;AUoN(}T8)8-|XNr}x!< zd^X}EGSK#Ndc$n+JJqz(7Yl`-?yVpe??6`hpPgvQg=Y6$E8M>u!5uD?&0aR@KO^0FqCGZD&)Pj(So=Zf*j3#R zgYd4t_kNq7Qdx}6twAn zd{-Q@^sP6KB~SRRDH=1-USBzKJ}vzUYyNh~)&Fs?PbSNhCqCozfF3SIk6WEEU@^FR zo-mE2-||L7*PM}hC_XVTwz+GG6@#KQJGZxbojd?#pKaCcNa3=fLaqNgq2@h5er3sS zx1d+wnXeDK*3LZ^=2^bIIT2KkImC*h(&v%tdxyA5bgOmb7_g~n^De%4$I5sH` zMg!P}@>q$C{?)tjBL&E+m*>moZ+gMQtLr}#`&YUDuRP`)8j`_=p{7dm@th+IIp!YiqPAh-liA5okyQ!}7%giUi-TGK))khBVP%Joq z4SIH`eW-(&wfvxb_9q#IJr%r? zJ+-@NTC}IrLeuddV`2J$@zHhrYF`}Cfw#;aihFtj`TtS%?(s~&|Nr=G!^X_!d_K(N z7z;V4FiZytg>o1|BF!O(C^livrgDfviEdtauO4qj->aMg|ZAFz!M1NGlX4r({!)4Z-NE69+z%?V`n z_!nyXn&}|c5dwF>1@!7$Wb5!K-1$Q$nZPc!smWDnx2Bz()stFOEmkC&zo05Fh0#d) zbj<$32AhhBfq`^SCEcHV}7dI7T4Zri~g3 zd;D5b`_wGU`Fq<7;>>p?jeMdgPVoavU*EdQH2_d?0%VJ72RUSNk5{FhV*Bpq_fhNg z=MERNq;}BH1@`f*bMbUCvA-hoNmNPnsP6gwsrJ)m+;Pu{6Y(`$gp>_^<~V{NlxSQA z?^<#S8#a@1;2UZ9=(txU8qo2+hYae4c)u-SCq4Qf*)an;99b3TZv<{pe#j>Tx6TqV zb~Bl`R2mgXO_JU+iJ3?l%FX;eO>%9s6Jzq}=RCK673)vN{C0e>A%nGfZT)myroVPl z@$#`>t_S@uABmIlMCb(_C^J8^9J{BKFh_K2ykg{&InT-pstj%})>J?$%#k3(S!K40 zSXN>dXDbP7sgN6g=ji?VP3j+i0VS^P=w7Xo{blM9+-+G8J^BNj{>8xCKD`obL8AD? zYKe!X;Ih=@XLWzglWk#86|qf(0E1>gi5F-FU(I^UvhVoVQFI00Z}zo%?EawXAfz&) ze3X2Q_mAfO%&RZvV>6xMi^DA^uuJj6IrA*btUlrlwWC2nE19(Z7LJ>lu8`c&rzw7O zR~#Giza4w*luB+eiH~^Pkm-fVusdu1(vB-ojd;I6Xu_FR!(v-K)+P5$9LmM-!vFcD zNOzm1k@!LbGq#j|RJev%K3$cuAFJ?^I;=aI*eF9PxO3#tS{5nkBdd*JU6l+=tj*#q z{F1f7)>C^D!!kL+Ie9p9W=UVcnxqaAvmmOlYHk4hU%|z7Qnf(6nIv${O)xyT*@$7} zHlE@o@g!e>e)N~n2|mUa=D%cB?YZ zv=*kXf3~kcg60ddgD?!IzQAf?T36*C*llhH6>>0>1osa^s6>BzvkQl|WCyQeiH9>! zan@>Rf((y$-tZ!V9pO!7oh!hs7Pdm~xiWyyiS*c2bzVYIMv>@`jfbTY?6~wSPHVR( zd{bV~$2iJourhWqmp_#(Ovk^XN=I7brT8V-@(A3R1Uok4n5(f;=110j6QS17<9JPY zC`Riy8g%J^T}vTZU%L>Pam%xi+Vj04=HO95X$piOf@gJg~v*uh!*C&D}Fcn_A5nTwJh&e{94}}uNHIvR_6T4wTJ2E+A z=)@_7H)dAG<+G=Mk#-~QB$FJ?36}H+SMiygZEsO4^1*g7oOr`myGDlGYOe{}*f2$i zyPr{uT%!SjB%l&kG3+3jd)hl+G-iHcSq?<>!uiacHazH z-Ha`sOH98~@JgN?VaR@8ygIL8<=Z;{z#lIg=OiOCKf$C@JC-2~sKuL({YvSR}YY$=SEqo5Q7 z*ZfbngLw~BNN3{3V_=kT?BEa4)N|xDEK%$eE6bNkf{TDLN9LXhTy^+Z*DLrQy}=Dw zI1BN&pq#0>YgR5S#Qv=!_ND@ukNm5V6IC|cqUH*JQ>Q37P2Gp^`J(yITUK=pihC5p znb;x=26bd{E?Tj`=l57U!U;Q2>q3b_7Oc~)VG(F>&-7d{ z4y?w=NmHGBuyUhTwjR7U&vtTGm4qP^1!8Dz$2GIZ)+gZoE1s4h>?xf1h70+aFg`|= z1?9x^C@e4u8hxuaABb>iKk1OS%sSO-BpNOEUF+dl+#>*+7w1%Q5@Fr%OKRMUrU#fS=(Z zaR|QO1Yt*cr6#F-Ig7K3o|>{8bx!&j`^|wh7zogZqP>!8c7W&Q9vh`=Mps#&6Oc1J z_&ww+zA%9&Jqpbpf(Hw>s{%>`fBgY;{NG73rGfkMUR>c^W8q9QVWN8HIM{H+*gq(LT<$_diWac)s6ZhM_(4>$WBOMx zr*)6qN3yB<=g1r${MQ#)kvv6GY{^~NdN+4?(K|1=nklyrQ+Dljr7y@`fD9^t45~ZC zc4MbZcBzI)PEPE@pr_I}d%W->2ePVmU_w|bE@Eh18KTfB@-3XHKHbVV*M>qyvx_cx ziZ+}+XSVO|6pT@b;xVECXiNP;I&wkj=CtnOVV1h16#c?4N}bN;R;{+dwuH+=4TjOn8;o-7am0jftd-jUB9Zs}FsCf*S~b&jX`&E0#Y)#vW>79}uG3Yd2l zZak=cinKM?&9Zhw;yKj}Uas)w*veDcsnf>>vq+ErH7_w)!%gAfbHjYtlpN)Ib%Yol zR*D(A|LHW{t^nvXfCN# z5?}bb%3ZDJ()%4%&_k-LBVpBUqk~^mM+t=>-*1EM0g{LpSV5l4jC;c^x3ioTJkmLH zFULiOEN=aUpb6;e`DydK>hQsNS30iU!3=w`P9rCatWa#rO|H>;me%a!33#R$7q5o` z*^rV4cY%wh2N+D~g$lAwxtA@5>;0-QxgXnjS0JwR^5g24A)1KZn(H`lfI$+W;|HjQ1?N=?Qeo@iw`)^4 z`U*6ToF=N^uk!wo-G>LMV^^MB7v0duI99T5t3O zD!{wW^n=+00ip{KI!Mh@qu+`ZA+|&a`sls-y`xmclm$y1*FwC1%Q`1fo0#p~{Y7f; z@efJKB-{#1k4C~X^VPN?X{T~;9f?KK%*-gi_K55tyVw>%!Aai>6b^ zdT6f`b%_Q0AFe*65BgsQYI_vgDbhq7`;j#_GKrk8Hp5pfcY3374`%2QHJD$(Fh|p_1xA7~GXENUynCK!aPBsQ&-8*A zyfu>3VPHLyy!Nzn>fF?PQ;89Ei#< z7*Q-a@Z_HD3O)4=?Pe6&gEvd&xEGYa$?&@(EZvXiN-5+bd67k@ zkVes5s$K58x;}n>c6p)Vh;$HIVdl66jpoqha<=>c*RZzYc29`_1Ke9o^D{_fHN>CC z!L4E0*4&)GvJc2l>ndNe`bNh7l;Q_XGB1St9TZdie-z7g1U+tOWYb$3v~e?v&%w9H zkF7mD`&9WEx5N5ZM7GOC59=pE&=sB~cqT(lu{f+ygn&qsO#J6?W;rZCWXGe2LHZA& zr?1gqB(cE59zxbtw?MjR0;zyRxfk!Jofw^(rq$g$U)wNdMrm${?DURF-X1;W zE}umrr+kse+{7&Wt3V9?bwW2`wRl4{U7`Jt(!pms!AiNVTXx)TMm;2K@)I-h=G@S9 zYrKVE`)l2VUzhDLOD_dw{7=u+AKw~-R=_>Ye;-sB@J#v{B)=Hb&d1PZpqC8jM5vB6 zH&&@Ma9-NzpU>RK<EvGkbW!5+xg3`r(udUxSki10{Jo`nO{;rtsEni`a zXAA`{6x)zOPD5vxHg9=ODgGESkYzRDQJre1Qn0&DYm^_SI2M9=G|Kn7bCQdo&0i7q zP9dK~d+lS2DryHF|B$6L;gP2ruKmGi!iE2GMhDD71jk@GVTR5jM$JannpDQr1^eX= zU!1)4#8@ghDXQ^^hj#e^;XPHbZi*bBE5G-$r{%WOC|c~wvipg?r_^Rq#hWf6_(zL= z-MahyhA$dSY9fi3Kt8$;1Vfwzg_I5Wgtj?+39w`j)?YU@Cw#B`iadjBs-|tU9-%-u z376nb56>rhTx9GO4Bu5X<_Oj%jYftFIey}~X*oG-d24q~bz1J**24r@Lb1?kOI_rg zs3Ev(b`R(AMjU<;tw1B6SMzTCgQ87Gawb;3)Wn;UPL`|_i4>($p$ItD@Z}Q{OnKxYi17&b^C|n**9k9yz%XqFLm$k zO6osCL1KDIJDmullbT;$z%@&h7uMVdYKR|;DyEg?3!y(sy`soVwxz~}Um{f2yd1@3 z2}AS8)`R5Lm!qT?SdRgg`Oxn; z=dA!NOt?g(3e8~)qU&qOxB(*QBWo=Ewf%GFO3MkS_$|U`kw|m|N|SgAbu;x~W;FTd z-<+6w`NQ^f1;-Kj9x3J#nGn z8Q-!J{A)Bv_T|&#^*>(*1V%^+>%j){_imS6z_erHc~8L%NElyg`kxf?b-4Z{gDBVD@1l(?SzVcvtc;b?n8$=yTkA*rL&G&6DgCzYVLyIPQ&G{&2;^~&$FA| zBN!D#qWBSysKbH{ycmFIW*k*<+qiC>Tm^ULefX$-qN2<-PIQ5T(010KHMd)NDG82L z>03#V!@t<73noB`EiuXNlwXw2Up;CF0RztTy+F*+D{Aiz8&S(U%~DyLVQlpZzJ%cu zgi;9^s5>wU4&oedHuAkYg)FUDe3k4Ko__D@*41tsxxCK;*#di`p1wU{)F(B%_bO}< z!q6>zdVjiiM=31PFnNzhSHna`1MJC-G`-+&cW?1;x@%^jOg~#j$(Pke(j{+^1Pl3a z+XX$I28{>gM#shK|F&~7C){avD=AzHm?=tqsjwC0v4C0#IV4Y!0APZ*2t4|q5)bXg zA(VFQYO1rmF_F;(lfIXBMPX}k3n%pD=Cdd{$1fM|c_!U7l1qDDyITi%4F@nafFgu) z1*G$vf%;Sr3vfA{tCw*~dQF?z6mb)Pu>XD z;XhXmV>riX&pnRUJ5SK`|GYAK811{POeo?6-TbOV0Hy@qo7P=C2P;!&8 zF{AhMG+zbvCD+@-LgPHkjcCJXS5>U`ZP68zxOX;aywB!je89Rz>_wL?+)PY;nf7CZ z9^rmRw5;_MVkPKT-(K{$zI7h=l- zKmTlwOZHKNnZjIz6-{56m%yc5iJ8YZuiDybR94d^XdKiweisd;K1_tDZs|J;mczvVD+zTY|GgKuvJ(R}zhU_?*vlx_m5Oc+NH@eZ7UVI-hvgEr~ z{~ZrmefAzs{yWXzuS3N&$00isvo3XNt?9m;c|26wO!55(R$aYcK|^Tv1@(Oy#KmES z$9t@WFQ}ff*QBaTGOj9JuToejrcuoh?`>wDW8irutY}5|*#Su|_-bxCIBWWg92rD0PcpjCd#J=o3&Sqa9T}{ayJ#-}ofDK(F+Z0OBu-{)IDCM|LHm)LH%akL%8L*fqU%Cc;by7j=3IJ1#6 z=4N8YAKVYN=8hqU5LZe9!w(`-#@T#ZHtF53vq(7bYI2SkA zn>B@nnQjyAUFX&4pE2S_r=jTwxsgHCgU2~WaXBw{QYifa_)SHDr=3aifhxfeVRhy$ z5T|RPbb?6Z)Qi$S#{n$F02ZIZ1@~=wKaRicytviSbo2Kw{YL4%73Q!})ZY2Fid3=H z=e}nP4}xU@o;DYXNtMo_zMAXJNV%O<813fb!%M;PF@%qoHg5dMP4ax1VSS$6UCVFy z6(Y48e7VI-^*^6kNSBDLsxRC7i!i6Z+Hn6yGsaY9Y`mk~@U@C`(Q~;sHZJkse;9^j z9eLNev?MPtVY@0EIASC4%)%sq8OR0 z@oI}AsMBAy*ISG|zCaw!#OhMLLoYAB@X@Bu0fNby!r9$bSa{K-&|PN_BWWWXRGfC% zC1Fsyvo$3&l6yq<_zP0)*SbU99e=!^J{-jyU8)sixS}SeIw`83b+f zcWGd2R3-PRARC9+i+Hbk`p!3WTBM7CgQ3@3sm_6&Z4|+OaCM=x`X^I{&33j7^aO%Cl zPdxtN>K^_xvt{yJ9%}jW){EoM7Qc3SK=_4@<1$&}ejP8AP{;C6-0n20Dofi6dxQ4u{>|aem6_tHNV) z!vul^2WYQw`EEtB;oO4V^`O!1pY3-j96sGb7N{q07D)uzEJvkSIJG{@n%j=(IQ(hd zYE(=Jp=~SWR^&Q$jJD)^1GkCmXhyDI7FAF47QWSc;+>esQLI)i)fTf(*{g~`n~l^> zS|Oxt$@a{v+bMjRH6q1=)li$XV%1r>q^84Po8+oX&(1CFtoGZCgipOsxC@u^1gl~1 zwDPi&3zGH=Kia1f7Y6t7w3!<*s;EzzJ@yENb{nR*9QBI~)Au!-%1=snzjAP_qPF$M7R)Ub`BsXPQlnv_-e#^`g;3M! zfVkYupH1qJ`<-6UL0z0Tfm@uy>9hIzDD9^{XvM6?tu;JLe?MuqcDlR#>in*ghD7g_ z{?-AMPJQ|mX{Wr(L0E06mcv%OS`iEU8~EAbL+^9d92L`dB+)Y%T{su>dy{0Kw+)vamW`V{743Qx-7ddM#Zm{-JcXfGb z(RLf?&O7ldoU1Tquz2u?tpnZS$=k=>6Mi^Zo((n4d$PwFEfm1!zQ2Rr3tHNqYXL|;+kMF0Y5WYIVnt(-nzsN57WsmR^e$FGubeyvh`y#Y%WglumSbD6vHE~utG(~ z29uq>$C|5&TpyEt7{YyBJN2iZ?fi;6f2p8to^YesdS)H!@kw2LRag(#d=y+;H4Pmu z>E|mZCjLUEzQt3d3)y>~-)5fl!&tbzRo=Vwvt@T&^_*BtcyP`eYT;gTvt88(2Q6Pk z^i7%736;1i__Bn43TR9sD=hT*($kY3FA18qO7(_ude2!yw^-#5m+Ztn!mwI*sJ4~d z;$6A$-r*JzM>(o;uYt_o(8^Ek1)GTlO8!-xcl;>a{kAbU$fxRe($Go1XGQPA!wwFU}_S9TtA5+jkz z1uXU~a-<@k_gsw3gEX}A7c(J+`^ap7kw90U`_EX>omGD1qY&lgt_b~*2k^5?>j>1q zC*AUls*7AZ*|QNftUQjBIW-;Uq7Di{Z7!6k4NI>zs3HnUoaJo<56|aw5WDc1yK%vX zHuY`WxE7Z3Fyb?*WvZ1UY@cZEAU z&c1wn+i+H2nOf*Xeq>h_in1Ij4SZrY^7;Gy;XQKOsqs1!^X!2Ga%IwJkF-rcY*9l} zO~S2;!@c^V@=s^~>aod|hnE{SD~V}J^x$oW_q+dk(0Sv4xM`T3#U7o*lYBCPx^Z_a zTUP?j1FSvYk_Gy|#_C^TUCjb_2Sa8fPr&{0;;9@wns!~RT~-Fwf7?tphPk9N7Z#q; z-#;F_z8z?}N0*ppNlZ@dP;^DoK8sAq?3DXiVDH4a!dBEI<}UO8)sd~$|XKYn_}d=CMAEC@H>5TSVg*O2coc%e5j z^W?veM?xlp(4p^zO?~$g9(Gne6K{_&R*{sr+v=*A?^NFY)mPrO{o2mihnUlwmo_%3 ztnQZBer*@q12T{4G!HGjK3N_7Lu{&Y2)(45BYmXVxOyAPUp!IhSylYL;OFczlN0XWVOi$`pBt%|3a-A^wS!PY_fI#o zSIllHNA_*!vl;hQeZHtQ ztG%n8E3f{JHBX{OX=XM~ZO#(l36+HV2wQGe&^8=m-Pj7NBz+xk_TyAX$y*_x+ncss z-EF)%-k|p7ooZaEHM)Ca=gtLq7i#~xCgr9R9bZ3w^Wzx(7~kBn`|l`L{9CW_pJ8bn zluCNd9$Tgi^wo^#a@>ir$!^cL!4LEB?&|?t;e~oQtVDbA)W*a%S=#eY)|%gJnNVo@ zxTYiem6Z0nNmsle^sQ`6+pEI}T^}M&lOmbM**N>qAMu0#HKcuG1f!e5`aa23n}<;s zpFenV1#gm=^&Jx@!O*M9B*FP(%ycR#=TlEsN~5bK>^b+4zgO_o&l^Rzw?MO`8Kj`9 zJ5lv%WKF4bvLC#0aW&w>no(t^$70(hgsv|rNh&+zFdNyjbUejorm5%>BC)+)bK3(! zQ?XaK4WNV43{9b_HR#v4i~|ZZWeAID1mA-voOOb4+v3w?3KxW1i%xU_ZpC&u6)K*6 z@q8OJ3(u6oW>m9I^aUci7KBmqiK(qY#`ffR_$Ur{K*DsHl%QlY)A>ojS+gSmK5F~7 znCh{zyNIrjztO(s8O%~<&6Co*GSoh-M-H9n%ApNEYN?BGi2R*rPu>APq=tJY(LQiL z1~AQM`hH1IH_v<{=pvSJOeouy%X)yYS|a&q8bRw+xxUyC9kA>m)?d1&BIIcIe*_vz z|8Fo!NFlX{+WV-*&tdlg%|w6rs10z|OdTh7kXonxrd5V^K=Z+nDBB+J4-`cmkXUVU z{>KlIYvJNEBm#~`@Q(T=;|@LyM)X@We;Matp2fPv!~B}_*cVezsdSEDCA-f-jfsYa zf)b=;hB>?@MBoS{&fEenPqo8(Tm+RFnbBt+1^}@m;Xw#v=pHquHYmwsnZk=uX&k(S zOycQcMOqH)DnfyX7p$-);uq8yd+A^^o7^*LjKo`ok5X(Cs z2)q^$RnB33LDugjUe#ub?*z8Si+PmLi3d5F66nn&gj2!WM=j+!tXX9JJ}`u`{AMEZ zp`XJS{(jjhG=Qz`$sO9U3g>Km$-5x2b2UK*_GB$Ms5oLs zj?H;L40O0x5+q7N{4uw7QDdq=7sVNbT?}W=m2~Ig>hZUzNXnbiM>5pwnAJveY{*sC zh*RN?Ws>dh5rpm~RuQOxYJtu}0^OHmb<;SKMuZ_E14aK36=xcubh8A@##3bAxkki-MCl2c$t=!oA#B-E59pl| z9hxHtgHQ;eIgmEM^LU{#12Q4CER2a#UML$UVJ+yA=sK zKVB1IOsN=!M(x0jo$#&0K1u`Pbwq`AytM3wfig1J@c zJd27o{fKe=mJIs%gVv-e2>b43*X@ePB@5~`G;sRPy^!1R)CC!dvl>*G8h0DfCJ|Wt zZuHg>5v7IMF9R>}Fy_OypB)UFPYzOGd`0Acd;is;AmLGQY;0x7)CB9dI zNi1!j!p>1;LLp?S@lr1QM;R+39e`zdx~em`f@^T3hdfm$>N{jN^~wJK)bW7fb4ez_IU^aP*F=Ki;V?C_uEu0GX97h{*t^W;JBjo42RKT0SSvJ z;;kGM=*Va4jI{*)_x$p<;ELftidp(HIHWQY^e=S+r9wMK=tybo(nIO7R0?Rs!^P(&RnBWUW$q7CR z!Lr@Y^0=T07+H?|E71YlaY%(GeGOqB;A98<+DethWhgVhk`9Az&9~vpwEKB@3IfQ( zC$X3VV4FuCn@=J;^xII3DMH&*T2J5XYRl65S0r*0ay{tPHlo;0GOYOUFrP)v(XZlw zbP0PnA@pc0SgMJv$7+&?EnW0!qB~&7rJX>Pq98lOob#vqRCu{0h*=X)Q3A^~@0ROd zqwdUIdx&TLgm=9(Ag(D3mi4wLRlnf2EU7Cbm(KFM*pD32$2lr--QXsNEk|zSJEJf_ z%nA_mtsFgu7M#+K_cV4~sUa{Oc&6+IZIF{JI4XAB0lxOL_Rs_;aA0#WS;X0>?`*?t zvVK04IsEk_aAqffXW@yULZd?ub9%LOAM`hGZcWOEFwa|;(<+`yvR_dZriYI!AeYpE z9~*;w=|5VQIE=LM%ke!V`fz7XLG3-|(sEvtPpY4G343<6*VeSjHQ|3fU zLDe3Wm6V=gg4mcV2+}2VOXww+Jj7!NEU^)-M(xBCKsQm9PNytH7fVK>fTbk9s*y0? zI%_0h|5@Tzi5@wE-`zNnjb5pa8GF4 z-Qo2E`VFOb&-z-~N^qe5G2#nfo?$?PB=;x^DE4o2%Z)m7&H zc^uev^3f+iruqVw0B|LjL^A1Lp7ObPox7ZbShD1(~Jtp6Xd1xw~b6r_txdSA|?Yxm={Cdw{Jc{#wk;SQj z9KZiv72G}lJ^TaLUfV|pyRp@SYk@g(NY&*Vw0GiGEk3TQi}fetSt8F?V`vmzqMLQ| zCrM0bDuYuZ%{~RT5)t!IrQQcSX1GSrV6BB%>SX=(z6*G!IrNPJt`j)9 zo7%ve+3}MUB@^(3M9u-eXq^QU?i}38Qv1$-r2$g<*ZUmSioQZRsabeQFx3WZ;ecT; zZ$;KKc$nyORcLl7p)=GX$kgBoX)zC3su@v8piMDUeOlK-u;tbo09p+Iy;;kOSMO09 zF3`}?r|E~ik@|P&+HYu{8(cJ{M?1kDTE`nWqjCY8MUIZ>1Q?y-f#F<@4Bv6RuJ-UQ zszsjBPm{rFQ;mONa#rfs;x=MAj4c|mE8oG^CtWAnj)-|kQct27qY60hppn<7si5uX zgrlrPBj1rt73yv5s#-dUx>rr2eds!!^V^%+3@6L~&+4FvMSdkq7d2aWd3_-_rN;r! z)Pr`G^200$&V(mdVol~Vx zxc6dC3t6Aa+Q4Z2gn-pxFZE1lX-5GHYq>~do@9oS$Xnsd=_JW?Qg_V`56-qM@(`a9 zcoyP0G+=aydM3upsE5b*$k7v0xCl)y5@<4}~SJz^b3~tNoN&~wKSlU4H z2vz)BGc<2MTm$Tbw6I6agP+IOBzv=?MUa{7mumY87dNg@;iJ0%ROs@GEKT^bP?@6^ zZ6n5SrbFwS$~Nc1P|)tU(!Ki_E| zISv+u74;36_D@yLUe1)MMxWX#TwIRc_gLNuGoraBbg1&$@Qs^T&wVct3C> zRUEjXrt!ftFY4S6oT*L>jz}@^t=w~QhXyr}caEI-!=SHG_w8REXFDA35fySIkHh~2 z(4$TK!pkaRPlfNJnMUX}odcT^mNva7Fz4~iFsQF6gQe<1roSk!FmVvFw8vUnm+y<; z4b9pD>~KgUS~4U<6|eEvY5;kG2!hPeS>? zGpDSoJCeRO{L&Bfz%DivN1f5fPH)w3U%Z}Ik%udsCA1LUDV}4##Ax^iZOF%jAN>`H zn76dP)Vq?_yHc8mBN$TEaXEC-^zn;Re_#(iZg1@k^pvO7>|(7`5qtM?M8z0-(u^hk zPX{?-s#jXQ3a6Jz`{J~q;^H2-kz)FV5d|LuTOrjS8{PyIJ66N6Yz(6d{VE1dKDJzM z==R>-zP^+D8O?UBC@arkb-)Yh(c{7s#Hyz+ko;vXCO5rDP;AKVL}_X~QWqQYj=$4M zYgN(|GS_nWJc>Q3xUlX9uU2Ogt0J&BohoB=DBgv`{%0N=z<0KV?D>CZ8r7zPs?4_` zQ=bIy%2>XJ7}^b*5x&K_!1IMn)%y#AdF_F!f5EWD7g%D9emi`EbyJ6s*F-MSAHF{f z?Bl6#M|OekAr4>|AJ0K*pp%%P&lv~gY31dRi0_{8Ej;}wEK-Nq26dQZ$Ox^MI>&)z z1e|oqrAr)tp~<;;FT==|*;%Or95LfLLL?s6o1c`vb%eT46AzyDd=RNMID!VidX7%o zzWX82u~$`M0+R@>$iNZQ!SPQ+Z*XGHza?epjAMv?i5mkyfFC5_$Nk8SlUO9Si(hZ@ zAEw&A%!h{ZH22Tc|4y!elj{9KiB-1T=|>dLA2$(ud9&hiE;qIv;;1Rnp4C{2Q<1f5~->U&M27RASr_$l%TPz1N_?u1{T7U-hITqm2NQbk&BNYR# zVuji)#NM~rk&U6fk&Tgu^UG3f_rdGtmJ3s&E8ZfL>r0ke?ee z5tRn^*HECzmu0fNc*D2yhAZrf^87KM>((try^8=ixD#92rP`ge>b251j=toubTYO$ z3ozr09exjA+Zd+fy$r3*!bNlbryY3+?xHKUI2{<)VppZw$d5i%VzU{5 zNaGCW9u*1i%4AvoYlg@pZSDayJ5L$r3b~9JvIWsk;K6+*<0fxWng~=9>Sxbji&Ou) zSf%XM(y@K%=(9A_$a4O|??Z{%#O)cE?3*pm5 zV#_m;TRw;-fYcTwG21zOyYAD&RET=pPvPKkUwTS)=M8A-JREtyk!cB27 z*NER=b|s62;$c)nKN_J&L00YZga71z{g@SdT~-xQiX+ur?vdGP-^VJW$XN8W_@duJv`~^mCqKw@6KdS zu^+Z_-av-F$&e|#ITCWAC~$u4nY)7l7cOv!e)NGp5hvjOv3B>{jYb@b z?H(+wKtU8zH3&?wU6%|F+gtv*T!bA};dA95mb%D#bRA})$p-IFsa~A?jtN2tIKRDu zvZPWaaoC4If!EFC)5q>ur*WQGxJ2o~_LIq}qz7AxxIcnZFHdz(T(Os>iSkAN4CEkD z^_UFPG|~f(P&(&SaRryc_hM{mko61LL{zZF`>#g*DOW8nmpM`NDv*;1(;;5U?|g$~ z(Ano(6}3QRbbzy|k%IxHi`r_7*CejB0_BMzb=rNa4>Z#`y)c!_uNl;@BL6AbV$?0iLaZ;T;QWx0Ikur2DY<;ex;GB{^5%~apZ(8irxA-`Exwr>1C01lB!EMP_RrvyzZBw z-BqisE&6T1Y@#ab5ZC7PKg_IySnq!NV_%i3>Ft-^vZl}fr+|`fJ+lRLuD`Ds5+T2< z*7p&s1d#8YJdR-_I28*}WTkaBM*QS%e4^Ue-g^MXBhIDbFCURaFmxKY#LUsk{+!qexjIJ)---rJ1s8BvsksD_Gg8(U9 z2_#FycD~joUfKe*;s}}wP!#)ZE|Kr&2Jm3;KM!{C8+nW4K+o7>sM9d)|4slvDdNEn z=IiS%^{6F3jzepqRChHGII$TYTz{BQc z{>NeU8wYL=e>CdHSo)HWPInYiqy7ubqxN=-5kC9ElYtxsUas0goLG+mI0t_C9i#X@ zSvty%1QJYAI42!w2201!MQ>`bC8+2p7c}IPT`iYiEwQOu0C`o@I`!T{=_l~Bw533* z0_`{8e(wL)p)-7$6p=<=8tb?~HT+MpLDe14hqAQ!T{&~7WKDbj1H#Tc#{m9>PaqYf z$h80FpIZ|LT`WEtN!ZOqSx4Nkv53*`Iwuq}TThWLiTmf`Nm<_5gmE?*c(|2@5bm>{;B&t(v;`ej70-fG4wQB%6`4r_v`v{Tx1u zdRT3f%UtIZsW<+gwdol7_J96qnf9v6?C85BaD~MZ!`%jm@T@#) zRG7w5&zJlIj`y=p#-bR1bcj76cq@*v#~4FTX}WmOFghoXr+HHrw-vmDRVRKil}vXu z1;yYp5^Kz>)R(|cBOCe)j**KJ6UE*_>#^9GM()1;--&2@K~$V?2~w!Y6rO6t#S1h} z_81b^E+0t&@%zpfdn%ahaOtjt0es%~%e)bD^glLeXZGg0)$HW>o-Ca9e#SZsa2olO z({d>7|6}UQ1EK7`#~Fh$wi)Z#XA`ooSrW!z3R%idCZU8HEvSTNY-6qQqLM;JN|J0z zVNis!C8;b^v?ysRNhSU6=zTxG?|(DTz4z?r-22?;-gAJZY^>H<83hXYC6F%GIaMq) zu6P#bxxmv@+5+VQvyA&jOiCv4GSu`x8A?6RO;fq5MnBk(QU*l-ufY>%Pm6x_sNN=y zwJa-MV+y3$g3CX>lzhG#X$7=YV?$L=rz-kJ{%5-iM(|HjVx9E_oc5PrCR~ty@Bu2K zn1`Bi!&15w^V<;qYvYOS0@~tW>;F4k7ni>*a{Rf#mh)w_4uWneANT$V#rRNx4j{Cx z3?dNp@R(UTDD=m${!uLC{Xaf3#5#HCW1Kd|xUR!mcLWwO(lsGurv%12sNoV+$dkMd z*|I~xOipG{j<3sD(KiCnDbT@S;Xd>Gc!h@{5?3*21tvz>+x|1Nd0=LXI%1uR=J2Gx zPmkG_|21sAO7c^}&<`$1Vv-Nm15FJ6rwOA_CnNA;-)h_qv;KBM(RVMv5o1rp{pJr) zq@U3|eItT{7Ed^Z8x8Kzvc!_5@@+^NX1*Bu)G1s`kJJC}|AT*Tw4Wk|e!)tjv)y-u zJ*%*yYtQP)V?Qb5$uDDpvMz~uE&0`4A=M%FcMRTD4lg1kv7(bfRa}`7DndmJpdzYK zTPbUZkJsG&HR)3~HVy0=Vee5``BuA|Vd4cOYC~0^i!V@q^V^5BPFq(&UP5a=j3a&E z!s5r9Ja-k^TSu5W_fq6|tD8w(|9?D^66ENG0*e_Ojl+CDoD}0_1e_Ug@EzkgeR?7G zB?f=tBfnZo*WiP^MmVa=M=_o#U=zxlvp{en3iS6p&~Q9BdACG>`#MX=Tj4)r1RPZs zs?5LoT)89`py(U+pAD%WVmnUjypZgaw}p!S_MhW1rG$x1rz*osfVnFIwRomda#JbC zJ=JJX&BhP8xw!atvRgo68DuK-M*eTe)ET5Y`Il(~KVBaIs;i0gsg>Jb@fWo#SLPnd z69axdjsfIM0`N&}?`fS6lewbGGdj)!k^c*>U|HECB!C(Bp}> z8XbRtnmnjtD-<;|!bSqBEY-=+#Uz-ibHZZ5h0%LoCmRYQd66^?M4Ah#cv&un{8K=v znhNSR|56b-UB(3x0VIrS;YP!0JpFL+0||Zs@eMUEK;c@^GTqYAb-1Icl(&g&Ff+ua zbMDwOfl+;0xL{ZP*d3D=;I3RvUB(_D35vd2u#;2>vOH;SreATo-2N%YB@Qo$s^Pl3CajeA-uc_6LYYLa&k5!%f=?T5uQ2qz zeag1Kg5X;U*}w3kF8I-#Lz)>VrcQ0{To<>Mx5L&_iNJ8)>=)%f3r5pi(9Z!4IM_9p-O z>A@RAX0@yXyVEF*j7aBHZIIFXzas!sdEtoWnc-tcbzvFcHPeCMIFsE8ge!x^i+|J5Nr(L--g#brkoU ziF&XM-X0>5V3#}fA};>DXpTj~^Gbv=Z~GG5Ul6s2py~s@sa-E5LDdcijysUjdmO&0 z8*H59!72`Ti&^D^spbVLaJJ$94vI$TY3U72zxYV`2sR1eu#Q58j2pS$U8ZGY)^S%u zxD8jZCmbOM*#o|>g6c&F$Sm+}>by$CBOt^ELglkp|EE)-pnITC|`-WuB%k4TNaH zg#TrdfD$WhZk77ma0>5f%wmL=YZ@@! zC&W7?!}<1W{C`NEoJ$lxV4ZFdoSn;~^{>1fpg0n)8+CVzIeH^I15d;JOD9oKD9ch` zB%Kow1o5|QJPBw*ul)YGp^&k30O=qTgjA1?&WHAFxYnRWxS^z zS_@PTdZ}gb7?l8tWdr4q0WxbcF_eZeQWi8TuM5Y}HSXYA?rES`lELoE6*5t+7*^$a zQCh6?pT1Z`?6X2dLJnw%2Mu{(Z|9yNJdX5Id4o(AyG^7{L-nxoJTo3tAH1;!FK^S2ChUwK5XP2q*6$D zE{W%E0W5oDQnnBUW66Tc_S^>e1+)(A`-ZwqkOxl&Y>1tf!GN-Q>O7(c>Yr>v$Cv&~ zbUv(VE%>{kdS{qlFy|PI{n`i5MFWd_g=QxBA_HX|2I~o~rGuMzyHf4&M4;++o~psE z?u87F*6DIIbP8-dd4Afwc3$2Y0E?0dseTg8ZM7twzPR06E`v`j>5I2x`?+EQSRWDKBdsIQIXN z6pws($Zz};Wd~oZpErCO>`D_iqWdx`L1=yYqcs#mui7zz3ha=A{@8NB3oUcq1?prb zVp&SXDiIPa_9H8Fi!c=IOt#FAfP;~j*))ggMln*kc&Ete-JdD&EnrKIs0v!D*e>=o zy57;_TChJn*ZixD29u-5z=nJ5C@8F`Fg&ME<_G}NkgGX|o=lfGk?V(LCek@Y;ZDU< z!u9t(;cJEeGY$c-AQRoruxF1@V%Y8`L;^4VpESzF;{6!N)s(icJ~4P?MLaC45_#VL zW6?>ZycsqYQa&)Ne%<%eRD|*yLml1UUx~cEHfZ;>UEt%Ed!MGyO+6HQl|@}EB zkm$f=%xpr44}?9t+DQy5l7(&%Xj05WEM>4M3ba$MRcDXzYMuhy(_f!S*`C}83wGiV z@m_Tl^7A{qW`h^t?Ev=W7M}aBNsGEcFHd?ub+NB&0CS5f2&Ph}cy2*U{(7DsifC5p z8x0+D;P699TKIYWnv>ZSxr?y3F^K5{qWQRZ3*prt{_CSg)iNn7&M&p<;&zf=#z-Nb z{>6}}ExAm@`^6*03JR;hkz(T`-ic_a7ewHDV6QSBIr)*Y)1Ldr1+I$nJxIO;LIzn- z?>bxg2FBH%E0X-?9AYyF`aETI?VuLKIPJ$EOJZ5SY!TlA&@KP^PudkWcMBJAtl*yZ zgo)S;_UU;8NISt<%6zd-56#B0XTtxtcLbuHI>CI7!z4?pIdIUxu|9*z<`V2gfr~vC zMmrar%{~b<{+F8V_OxfH1zTjBExt!xc+JTFdc#^(dHz_1*=($dg+k@Q#fJ z&rp-?F9AP1pTBW<@2T~Ufuxt0q>*4gRQ>D4a^Mi+(GdVv_@CZvbNG$H-+*o+nB8Vh z(5EwaaA@yRyUy!#7wZ?6Gr>i{zfRD#lVbuud^cnanWL`r2nZeoV4k`FT6b^LZ1?zI zd=yeSV)gL)q%;dqUt?c+FW#LOYR~;>0{2I?*xQUEPpmJ_xCWW}J zrwFHw&0_XkJ5a3p^Na&W`(Fc06@YNS^n zGEoi~yAL>%E)Tb_lWn=c+?XH(o%q+q9w3$Di1`EcF^DZtf-YU}F z!WoWrf3?r^7;kDLX}5hnp>m-9^(OR6{@=hR>IbQCwjl}Ta`6iM3k_%R+&p$1aouN{ z!L(O!6L`n$BKTHxmq7CXv%W7N(hus~2^IxawzemU0OtymOvD2p_NKB_=IMJ7j-u4> zf$+t@b4PuhtU3F2Efs~l&TbIYIlAltT2|fhQvU$U)}}31gU>R>-St0pVE@_O1ae^y z6j=<@52tZU$(%g)al*RyX&dYVWgx(}rPF!?S!`WMa(&8_Ylc~2uhmD}VP&>o-oe7P zSjs{HJf(wZ6D7Fe1+yqwKyNyWJ)c2Ye|AJLeW;-oOlV{p`#lAoH$y;Yx{&L+vS;7a zM@=$OJ8r+lb59H?fl^Qj^l4sL)uz$(hO)%(qoQtL?kitusKV1$RWm7}K(V##2&et~ zVp%^SzsH0ViiA86E_XU(3ru-!c zn0Yc_arzw;;ktOo8a7 z8#!bSSz^ca7lscd!(MmEPdKog4}Uw2m#Xlg-aGr;`(@ZOYlH;6vz`67_YyJ?d#@0b z^>PYnU77^liPq@M5p9|R$>qsqDgI849oSt7Uj&!4DQ8~42UT4iZ?LTqdPi-!71!PO zB|`Fg`1wpq&MpWl#0X=b_}NH~|=s#ppg&Z+Nin(3xl*+9Q~c zl(JR|$oA5@cbxawfrrvyziv5K&RynX*D|c5;{!e))X74~VGQLgvGJDt#UY6^E3i8Z zmL}eiE~sbZGz!Y>P^izBCYQleq89JzAU3|@v&j)jI{&>_;BjyqdaDOGOdzW4ku8#j zyFb({zXAb1=6;p~KI+(1r~*`=cKfpFNLuB*;FiPat)9HzHE?$hAbNn~#pXds!pg`87L! zh70@UK=eRodg#!Y7WpJ7sZHn3v5+_@7!bS>Zu;|)d5Goy@KmlI z_uTrB3P0+-`hQ@ZH^uaG^tid%mucv&Addr4^sZnhQh#7sIbs=O>*AK9R|nFtR58X> zfUt<7f$5iPO>AlUGM9!{C*QzkV$fTCc+X2LJgauYKbd=W$)D$mr;aBcjH`A`h>1ML z#iz75kn=(hFOp5k35C9s%J~qB7Na9FwqK{_c+BeH4KE4m4b(CDI)8*cD{1Nzj0HuZ z@SewP(V0vgt{nUzkymmzEjvDn2Av8bd&)5}BQSw5LQKe!NdRAZ7bcJ@&tw7VG_b=E z*Lw!)eN;U)ABrz-QRFqO>Efd$wDE@3g5$7G<0b6GG;9W_-=7>}B3fccYmnpXte8n9 zoe*8^cOXUp1?n1*&gb(XRC8mo=5kfba=>Pzfz9gB-cS^=D-7&PsJ2XT0DycCplo4V zVprzS?q#O8fZ#I$kKvF4owJP}erlQY(o#9#zmCnom1^O(2BJArnIly_Jg7&3gXq$R znB-kW>R_gUU|)y+_gt?Ig}CU7O0K*vxONOJ0zhX`a`r*sMOW6AyKnRKVPb&jYUh72 zI5)Nz!kiRyZ%|=aGyP~?U>IM3Df?3ov55DWeDE4qT`nj>^e2<@jpq)H?BR_D8*IVp z3SC`pkUVn^JZoY

#6HPuF<&xbkfgkGzvSSH9{z)YjhYW_uszKCgAkC#i+?)*5b7bg6*^T zQ9d#cBR|FU`A#G@J}JZ`@m2%-U?5pBnQ`xmoNq2+s$U){AI^h3aA?*Itu>|@!v#il z(6#*HSVy?jq^s=mXfyQFH_fcu@egETZ3A0DekChbD*2)#1MA0cSn{ zTQmr5iAJr0Ttv}2z#kMDjC&8{%*!;3iQqteFmYQ46k4KxZ`Ge9$wa|+KBek1Fe>xEDri4>)Y~hpFt`rU* zvnH8RPzzONaU#kMZnzx;cgz?|lGxEgkho}G5#xIkp=!cwLj|1>kTSO=8e^p@BROyr z`)3<+d?zO=&&i1A3#oKNiUvj+w9#Gp;UC58zn{lPz zM{QDrd;Y)9%)=EP@EKL8tMyA;3-==X7eD?PKT~tJz@{cAPfdE9z}`ZqFBjQ28KDUB zrBw0Fa-AEcE3C>4&KQ3ZS;gA2Y~C#%#O9Cb?+X%m`<$SKiI0sx(M#C2r1j_n!p9M|YXe9F%8nDk<7|n)9ax{F%xHp0(=3i!+{e~KudE;eay=aH z(J$n^k*-mO`u!yB13Ym_l#$BE9J3>Cn_$}x0?|e-CwzJ*a#~6+NQ0J4xok_^HpzC? zA0c>^akqYCZV%Gn8rc$^ftaGGSMl+^1o3BJc`uIYlVOmxK%pPRhEpasLQU4R683i( z*+`IwPslq+pI>HNb$$gwQNLim9Y`|@q7>YPo+_oO&aXWnJWs7{8*VzN2bd>It#yBgAZx_o0vr=B`va1+mV+ zR;3o#ppF7fdeSl_vc$@ja|e(F5U|7pPq6HEhb(CfCcmtB43|LlDKp5KN*Eow`Uc0| zldRq=N)>0eNCN``RWj70IV$cga(qaqlHFSzY3~OUHULR3uS-&A@RpPVZOW;bmOj20 zXmPakh>s!_xG}*oJ{z>)+^)~asCpr8u1xlP^Pie!PMpQ}ZN1Qn&3?%Gb%^2acf}+#i?80BQG5-LG21(+thuT!Y=fra+ zixN-sA(OV)e}8dOpBDyaoH>;s(d4|6@7sDE-OV%IpYJW5*a|HBWHQAOV3}s`K?fE^ z0v{QV`Yx6mcKkJw7Z1en9$$ojcCeoCQ^EE=uZOnqqTpj7se{zA56^d9LR?hI8yYT? z`f}&J#aEt=!q#=fYNxp5Y!9|idH?Gpl+BZh34`3HWL_T8iU%G#zm#w=ulnVr1CJSC z-*e)D*_>QQbYN-uhu(r0U%KpJpH5+=l0hJ#QwrK4=HdAhnfUmG^q!JGhh|PLbCJJe z?|`6Uz#uCa76DSfKJ3u7UAGP`7v@*}(Z@67#y^sN~8*1?Xe_VtAOolL*D>t>h67xJd_r&FE?*5M_ru9_ikOb;om(*>GD2IbKuHss#1I#rtVDUJCVbJG12R>8 zGYzNrx&T8x#LvV^2<&Ny!sN(w-rwDN!)W@4YP;H3b?%P8jYwX2rdA;IBoYThOr>sc z)d4%t06UqGgPE&|C;U&zedM?H#Gx~6`QmXq)@EBG101)Jp@$oIz(457Er(p)GOW&R zUW}8#zXsye5jqgtREYPz0l#rWdrVDr#5Kf%Q6R~H$6(@N$Y`0)$2#LzmXUzdwmGcl z7Od305UNNtz*9OHlKEiQtDt&#;_Tms-BiA`^L&4vYtr{R6yG29>ks;#sSVu%YJl_b zH1C9;YVdW+m+4^gXij>3Y&%Nim4QJjzQxQFt|6+{X9|HN0^2w~e@B=IZFitW^EmBo z^Q}IxwGbG<@2{e*GdqB?Goc-)LWMMeBF>5KJlcKYGJJYX0)I^8p*Y@-EY!RMuv)~5 zd*}IF`Z7FmRhTgsJe-tZcX)lI14JT_>jp!v-%!77GyWO9gQs{|2K+O|ywOlmi=OS( z>d{h^3cvL+UlURx_k$X06tNoX{K7}|Kp3Pl#6?I03NEEn4g-|{SCA6OzKX}FUChW% zQ*4R4^J}w6!V^1I4G{c&_9bi2gCGFxs(I{@hw0!FdA0|L$cD5r=466xIiRA~{&(0@ zeLtxQJJ!SXG4Gg)R@R;|46$ABm|dt3--#j#3s}!^p6EHFMbHTQ;ZZ~HE6;zX5&?CV zqU85|>%)v-X&0EPSKYB&z3yiaLCo+xus#GUb>7@pi@x`MXQQ&^0a6FpumE%mFtKt1 zRjOLg=b1+e?8luh`8a;^;F0$Xke3Sy3N2b03vC%|vb1!4CZ?t-wc_yUFAaOB&ga9j zLoOz>h`*&Do(4*JEsVD_5vnCdg|uz*gv$$yP)0rS>aLzhZyWxvaa{GP@neEIcI)_4 zI1)Eaq;Sssn*Pgg4;$~=5OJL^ZB~2y$ZV8N0+vVL7eF6gAmF*qwF>3z`%5cjWH5O(X zfw-zF;CwqXI&xpbLR4(PPQ!7v8V$g&1)YLoLh1!4jL(NvP1TETt$ro&SR|)ZD49~3 zLb(m3aq8cx#uHv8x;6VSta3xV@AK^(8#`84N7-RMW@263TD2E&<_>!2_^YhSE4g#( zAz3ecUy~$uh||65f-lFM>+14-jlMSlS5vR7(+kABQ6W8y4jezYce#iBsu}Zh3cPuAkK&9-?WEG6NW!YG9qW7}L4{0*E3{k%E51lQ z2kyd_+C#SF(ET4I%{A)ilrTEww6Z`I-kb~GiQ>MZN|YB?vtnRs8yQFbSV(o-B zL|VvpQVeS@gZ*ce9!7)f1jqqGwG$e&mQuoFHrs=PI0XlH9Qf)=6=WhofipXyT5wn2 zEoYY+-JWsdqU~mBKnV%dPCE@nzh`0;z}JK9Nx0Sbv}i#6l0JA_MBwe{VlD=CVLRc$ z3UpW5uJ3zlMOHy6yT7Bvy<{sM)o1Q)iK4fidf_6yLbhXh0(ki#&C=N+>5Ad$*Qmf} zC~p@YqL6h&S8o=1p*NpDSZn_lpBVxBq{-O15mewbGVlwC*+}0TU~``O;_T0}VXzJ# z)Kyp)YbtD#=w=S>ITfBm z8x_fPvOZ~)56v*#W3r6M$LwwlXt*^1({3mAnZEDdh`<@*elYt27C_% zo2%EgGj^JTs%FLp9#fXv9k>SYA@>p1ui@O!2Txa^PQkrVS7|_5VH`M^*Qh(;Ll-M3 z{yLhaC zULXKRy8zxb4sDaqnR#=XU0S-?3w1RfFci+&3Fiso`Lz_S!`n}*KP~;Tf&^=7V76vF zad3wTw=epjONNHeQAn^mhb2T34w<(z;D9G!)*>bbxA5i)@u&8^qhG&D`kvD*wptrk zE^Y!mi03C~Asi@|*>YaWPFV2mY?d7?X*weE{5B#W8`$_UA+t^kZwFets|Ybu=t-{C z-qS$AQ$oNv!l{qPR>4Rr(K1dz!xVQxpMqM3|XCgsp*e$dn&%xj!KVHOPG@lVQ zJAQ4xgER}D+Q`^x30%$C;Ija-7azeK8tzeyGdu=MS_r}lG7}5+#nu%>hr~AtNJ^SS zkE)o2{b~mh_#j)92OWhAa#z9O)Vb*v2-q? zGW`3G@vyW5;SAKbVo5ie2uSzh%}dLBANht} zIQmw4ko{@X3r$&a>oKLUwgVu$Ha146_QBZTjbr?22HZk?pYNC7okxrfnmxh`g2D8% zPROxk3imr6 z5~wGKg@oSR@{1i#xI18&)9Dr9@F%1i-mU|E2SMjAU~#Y7qiuV=;oa(*`OSxzp{@oW zvNOXu-?!}i0dEUj1PU|(&S^|rWKPI-{t#=s)$t=Y_hWMvILl@)5+zdn&tDyF7Wn6S z5ToWIMrCL?E-5kNKw!e{;&7qqh)quct2{r1E1rE&`vbr*8h>MT#P!L~gnang#6i`a z9;o>&RasD(^NU!Z!k!CzoBfvSDVJ)R54a{7+!tFd&z^^0$Bya(IUVCI2Irm4|9$!3kFwx15l@CO95z17Q>0~|)f2KWC9`{w@`NYxh3x71YchnXx z^i|6kV$v??F_h3cftEG*&d`#DV!Xt^{p0nn3ekl0AdhL#<{LfKoO1Zfubip7p6jq# zLFetW1Nqg;pFA7&Cl7bn{OP-@cq@jk=fL_Q&n#ONd&nS{Qc*co10WZ)?;eHS3+LOU zSMI;wWwd=)CBx(wUaFuRYC>IZvfpo4mo%gq{;rPk<^cNlT3@?J!a!b5FY0XZW6<#v z=vWH~@|3oX(=%)WQ*#nE}e&c~{j z4-k8%Kb~WMkJd;@I$!NF{8b-sr=aMInoZfJkGQxzY!|rCV%Kwh=#zi<>`=JhZrw5l zJZv9z9^`;VrVSf*WaLTSGA{Y{{&k{AO?uvaRnKFDQCJqmJzeOH&La}ev8gVjcB9+w zh!sBgCnh_t*Q|$tfIP_i`;i|$;77x~9f+Ft0@4xPJH+UnR!M5budKXT%;ndrBC9Tb zy15(P?LSuaPUFIb=ykGl67mYDsDddHznp&&xR33O^bi|y+_$ZpUjP|Y zKtZUINo~g}>!m6M|3+oRv>G&&cUe09K?XaFzIFhe`KWrGhtU!ZKTWX{`{FJb)!aOb z3w$%71gX6+9K(C7|lDI9>9`K<^G2 zogBH8wwr1&8%*V!{F3UdS~FoE8bYu5DBy8~O|~4tPJAr?t(d*4n2pxhGqd ztevYc@ox^2e_qiMUpUO#(nosP*i&8oBnzvGy1N556USFXFY#`yK0mt0*AWPGj2+sF z8&RI06|=s66Go5Q%4w*`?~3ZXwo!U11jw>TXxXlA+h>qa>=Ko1A$u(Ix;<9{q(+sn zgki>l&&ZCm{xJqFaZJ(IIU?$k9j&DNd=@^%;@!T5rm5)iA%E>Ov$@p1lT*so*^s;k znO<)~L(roy+0_N_`9aK7P9=b}?|1OrJ&~|vd!`y+ZGZPd5$I-QYEU<>v63}16#lN; z)NAg$FS=7d&Ve%!yTm8a>c8RLYZ+$QW^rX?+I(Ax33Bx(11geU(2!o%xu`9x5!9PL6r6C%r@m%w80d zu&Z-5K`ck=5Vs1O3vGgn@MnCR%?(1WKp!JuH2cDV)BoD*H7N7w*7gvS2PY7_vfvvA zE9;g&N*v+@>`y%*knD5KbglQ0Xe3B;ujwYBu^ReJq*FYfC42UrI(!c!f6WRCO1*a* z5gM^knBz$d+z#~cgzZ^>B!xp$5=AUu{_=`kucp6t5H`~juX)yRt}#}-#>h_p3IqN+ zf`fuz+wufEp|Q2e-XPyk-*!}N`CHNk?(avM@RP?Cx~nhSR}CN|K?Z+K9|7sDkE?g4 zP%#rHO-qBWgc8Fd4+j3c0pAjtaosE(J;%4;?fY78{19OMvQVsrXO|s~lK(zM5wSsE zFJS-elP5kWNv+5U?fZEpeb~MlnS5p^(2N%Myb{K=WT$dTXT`4lyV$d<@rxVO( z$2ea{&RrBgu!^pAkm)XaN5$#0VR{8TgZ5RX`cok?lbQF?Plll~t` zXy|#gMnInkl5dv)2zR?Y*L?tW=CW%uT8uxfRxUws`8t7~J8ts)bI%_vH^}PHb`?Pf zzBA6s!LGyIcR|o=2QESDvXBbjmv9W;`@xr#ELeSO_I{EES2r?un3#&)_nI&8ad~~$ z&!38~c>`*Nw%a%zLZnwH)1R7x`sNSkv^}Y|)0<^xAho;Q3h;U~qYGHrkF4Cb} zj2^?486aJMk?)GG?svO9o(Qs?wefbh70;rZT3uV*SJdftRE=@^xl3L&ZpY-kuAwU2 z))K=n{@3}b8~Jtx0!fUs{rk;6E6*FlH$57Qn8*(Zjn@Bd4IR{qWXXis@4ABZ;G^Ak zxLvnSE!fhY(ilk0q@s+l7|ql79-5bpb8qdXuEyu}+o^}MpFENE@=;D6fVc7bUx#oJ zqbKVZTau|&2rB^Po?zNFM=;XlG>5E-7Uj1J8!Fa^U+!x9^CK(`JpSL#7pe+mK5kWdo5R1 zI-eC0BRzCCe|`&3yn8ctj?kngZ@gB0c_`UA_vIZ2*0~#X^`-_)!+PgwHo8+-ymMdG zgRQ6X4X2t9WUcLhmBy_WsxUb+W5dWlu_?jQVQJrf<3}HAyh{)-S^g)?#)(@ffHjvG zIW1R$_UY;BOmgG|v^Du}!{^H!trJQVO-}MA7k@))2MFB3PBeO}tH6^;bymV|ZdXEC z>hs%QRs{cwhV_2^6iX#1g!KP3xjs+h=YrhafbC_A(X+=)h;E+ZMj&@ zAcGTYkFe%Wv_P_OivGUS^M*?7iQdgMkOC>;MWoZK?5&de96ZEpTr;)ixj zx2&w@v@_qITE>xdS(9K$ydY6bOsJErA|}@~DK8AxSpoi*C-Jd+r-?^wvDmL6vztIDOa++x*=ID=jG z5wm=z&+QbN__puSSUP3-!18B+9vz%o$>iu5G@4C+Jxf4)otGQIX5h{*p6h(B^>)#? z%zK|^U}7#s zm|a}D@~HXqllVhhMJ7q!`{tYa72eI%l)3HT3H@OdO8JUI;BtQQZd{JgCgovds?qZt zM*P9L7y-&OrprruRd;V$u)?4Z8Sg9lFcRg$I(l$eQkMAJel))K)vY=Ez6Abr!4#S8 zK|FBEZz(RwG^?p_n$p)L#kRYz1S?M)JeYj7Th?9p(|}Nm4AZPdbn@5k5M!tQ7o00< zoksfb#fDPB%B6xE1LFzqZni_=cKQ`23O&#oL)*j+o7q% z@g#4nlRGO5_U(5e7df*j?Cc5!o5vNKw%JCK^Q*111VX5aHw0aS!Yt|a?<_l?uC zQqc{sZ^(qfRtI}`$T1P)uwFYZ`_+Z8;461ZI{UVgoo?95{7jaSVprN(x|mob{pBxS zbm3=Wpr1HBsh?8|3td_kUHDGEM+gl{S%=SP4Z1m3Sz#$irj#|{@dG)_}|n|IWdYtm$3eomoL59XaTRden>3xTA`albl49W#zy+7==PG+ zsrR-TuYI*7DyCkH?c+wJ1aUm2W>E_#>Xa6G^_vf$_`En%{`>nlN^2M)b^uBOIW%zb zAt`;Kk7MC^*H*Lo0^Y6u)*$cSlSUD`!?wM8`?V6?Y1QTE*53q-cO$t##Z5yWbqfEKx##7;Soe^ z@{e;?hOOEs4<=Pz$)Kn);CI+p2hJTvT=Y8;G@QHkv&{@jE}P+2YY|_yhUY=r7UUdkj~G%Un${8l$6eG{ z5#KaIBBlg$b|b>4ncJ0Pk1S7jInSZ`sPggRR{8FXMocUeCuME|?)IkyQFH8eyR{QU z(kKH|d2{}Vp>J6ppTR}?x3>D+_JX^4DqA(lt!lB5A>!dms9!m1USwD_s-U$9=et=7 z|AdCix6`Mk>^$`Ab}`Nu^b|f0#a;FONU_UQ#Vahq1UArmRb`L>xG%)M=T;<(WU8j_ z;=t#MJN$o^xoeXB`P$gsc}Ip($|xZ54)#Rh_22IhWri z)z<)i;fauR@#Qx++{8O?o&~Au%5eFe`gQ4?gUf@Qu^3F&B^SXRT?Iy7n;Sh99JR|g zrg?XTh03n(QJ*o-y8v6X623)a(=6P!;K+&yM3mv>X$AU8JH`^(meWVND+}(Dq43sd zl=%&NZoN!8)d_`fL!shT=!f?rVg+%dqWs`2sY<;hv-$;U9!h5Kae7r>qm5uDdZ1di z!1Wd=7qR4@4z|>5AM#8Hb%gbXiI9@xd!4=r;6~HwY=UMeA{M^>a}T1uf$#%DMcCVM z_BDm+4g7>qeP%LnvunEJ=T!PcQz^~mSOfbyV+1qGoPEc(We8&ws7dQlIhE4E|F&k49Xzvv5P!@{YQgA7E}^_dA? z_oehy_8x>@VA0XeBofP75%%;UY5`7S#S!6&ixkl_VJh5HsCjWTr2FQahNCqYkeAMu zJ`;AqmT|<^o}=uqE7mE2C0mx^xZp-^7WE{8DRBi6RbJJFs*%8rqQ#+7yO(zj;Mw+! zBV-3oN%!C9!iumCIw_qRgJ5oPM^ET%N~a!;#f_2}CMdLdhPxL136A`e>}obZ}s>8N=)NK8v_!jUcQ$Q)s@&Q~b>g>pjO z>msC8z8=VRWb;l|7J90ZIZ!{!Yr)e(5po%*c^O&gqk@bPe1OC_l9k1N`PnOr8U#}Q zFwre|qX>k$T$TCl?pH)`qk={-H@QQaGM$%D_#iBSCUN~Hp$`Co za@aAlErhxasT7|Fh^W9KSwI_70ZQ@PAE6akX_x=K-0{;{ZCSAvD1Zk0sh6n6)G5iJGR#V<9^wNi2O$ktj1` zxG0ISB&Y(VxbAQs$i?~Q0wQwrfJ)nq;RC>y#c_~s&zO~conk7*X5qr4K4n9cpgj#C zao@wlQY*)<%F#o@GE-!a+rY%TJ-<_S6IFhB6xx?}SNOXjL=t@a_0y>qi5Zmbj3pZq zNGW`K?2ZxK8Ndb9igo4#|G*RLo;|x8EY|72{)c8{ReQ*Iy-Q9$`)!O#J4QAIHLrk! zJ}TScKsjNCiQQJ}zz-^7oQ{g1=d+!*-KP0@BS|cgZ2up1{ZWt)bur3Lb^m#i|3V)jktuiY5EoIddK>(8GAYwsCH# z%s)cu01rZjzyg-DRkp%NEcHhCmY%$OVSa)LX3;RnVf>*G=ll1$s@3Ry`3e{cf4zJ| zUDMjDY!7|}b9`88MH(1aMwJv^7d$`Fsz9H$XEZX3*ufy}2uk_lr|-ffmeUyA>}!vF z#b+GZpX|bMbANzRKHotiYLJhUwsT^Q;Jq2B2w89?3^h3|)_L=X2612)YUUx zC}kxQE9@Rz)k?~qb_9^+A#)aIZk|f{zz|u@UT6cz(@_yB*3hGXt74r@fWgU?>h>`d zkq10UC=2%Ve3^k!Dn;oE=soW2z+t2C(O8hJwz7_JKMfTjYzjSNb^(%8irKNP^6)${ z+^EDM*oz4!NayE)BR>ZOcIQ|1=gG*CSh{oY z#}MA3Ko=k}8c&t6iw@6U7^wdYqM(yIr`t0z#?K5}ikf!?>CwyBv)LoZebPCl3m0zY zP8y&b>@)OUZi|r>a7?|1!l0`?sl+ISEV=s5JJccOnNWkTpLa=0`Yt?G5=ucu@Yw-7 zO95dkxr`m|bnPvu4S`9e5D>_chs{p6K@+fd`XzR6v*|^QcrS=1X#8(|a2?-61UU~WWA5l$29EXR@+$)21oaA_Gw;8Q3E;1577V1~k0!wza#d14VvM<&lOKn$p$ zASW}ZyEJovlNjW~&Z~S3b;{!XZiNNA#j-R}cyWRjt-hTQgiua-in=O=Z%exjT)lh+ zU~%-MHk4@F?ZyD)XxWKFC+i4;z@K2Q(5-d?kf~5AMS34HaEDb~ItPowyOwFuW|*on zojBl#c3#xTxA&zh)_?EdIoPZED84ljCaA#Oo>I+jx_lmI4g)^C54j3bW{P$4gFz%O zYQuA+eO(fQ`35C>cA(w^Jhb=b#2Ubzl2H*79?&n;`iqBH5dN=-pOev zfRxr?+y)Q1v$zTCR7wN5JA5W^=mKuS!Y0_BxYng;>qEVEeL<|V9gKGH;uJpzH@iP2 zNHPIDE-1g%qR*rrWAd2qJ3J{{9K{;BA`$!mEwF_b|TMT)G9xC3xergrd{{ie^3~90(hlJ7woX#IG`bN zST??4=RhLJbORhiycPBx==z= zyMet=fhh-6+n_L&h3K5!YIQfXkBl1UZ11{ZVyVy(@@_}P)J@^^_NEj4N3=9vN%E&3 zDVRjbO+-Z;ox;$&KWBiV8oQx?o;4N@qLd{_M4JM^U6-#u`n~Q3M4ME>=1M6U$5d1w zIt246TORq!vDbQa<{d0yv?8MY-MfjDjDzqk=Ke8UG!75qX_) zj4=`B-C?;E4BZM$nG>*1X$5a7gC8LkJ!ic!*L4bCfnpegy%n zSO6^BM83cR{6+0)d|;?uAg9sA^ii8JyhDY=ay~5&I0s(*6syMt*CNF_4}wLK;+)`g z2Im}Zf`165^;Pg=N-Hqs%B5*7dNA-o_!5Z0i8hirso>$nE267v>74IiX(roY%V{k7 ze?=X8JXC4Bjx#xiIED9}+OuN{~W~p|+ z%3UaQMp06UuPsTLq>HxJr21G%-*cw#_xt>He((D}&-*;@bAQM0d0TUb4n<2pDk9BR z|E}FM!Vk;)k;W}^yl2#FtR}@|6nWgjegeHb!MbJ)A^|Z=g3w>+ra z>AOWA>>ONrLcooAh6!B6tusYk;1%hEh)qqkp_r>_mRic;jjoJTo_Rp+=%qd(88r8# zwZx-`V7wf!10`j*1LXE%Ilf{56KGN>$DE>DEMgyTB>3u#v?3bDj zM!Euw)Z=&Uq8;-te*A?PKY+<*aKn|+K2ew(cukL++B+KaepZiXa3cl&|Fq*Nkjv~o z&J_C1&2NMg41nNZIEsvTsoL?$#S*?3VPE;E=gnp4G6FG}e^a~Y_SvJvxMgze@#nTW z-ikIe&bf)vTQ@u+LW+7u>AQ0-u+Ew;ezOI+Zu-NI5r3NdaSz^40^@IKXd%!1wf*GZ zI*N;+fPVMr&91C_d4E>z$z4-vJfALss*J@3yT!YcVrk| z0&~=z4rygBF}`D$`xJv^4n>5H;;Mot-HX7ZwWw3#?f9SAM9*$Mwqw1qI20^UDkZ(P z`b_8$a(5Ih&QuoLtaJxF`ZVw-rUY*^^AH*12)*cz0WVM|$jpZ|Bz!xlqzaQbcAcq* z@D4T|c@+qYm$7)WwPd+GFXaKB*;@1@0M5!F*Jrvw3rGpyEeIEyh#MDN(Ie#k9MsM^ zGm8-FaXIH~u_he_bn*fVUEPiMMwPodUe+Y!YdGi>6Oy!eAZC`nC~nw9JO<=uOUO># z)e)^o>}7t8)|Ekyu^aOF&C0Cq6_~7uMI_jUpT(Yn{Vrqy!@ss2#fN!3G$KQpx&?a* z)WUG#i<1X4lncQN{6-|`);Xy6Fg6E<>tTnS3^MY532Y3mfoUSTcAVkT1M#`I8y7y6 zH7vNIOUPp-kmE*xzx-}C@|a;5j8*`VCi)_m8Z%q*2H-nKN;==am0JtqjOU@bSd$h2 z@z6_iY|XUjUjfjGg=p5SWt=M+fE{zQ$vLmC=hlK)Vf9k_&nCd&JP#@S^Q5M@bps~rFJ(LAZyg|biN~@@#ezQI%Hu2mEz(Y^sqfO;UlO?iN#W(210IP{fF^2&?rGeNZl3i&#^cvSM(Sd z2-G;!OhkA5?py;6#Ok*_^OWwL#|6T7ZTSZJ8VkEzes=gSKB+;-)26DEW;o?u^T7LW z+htFW)bUat3H+(G30qmEihCB?`5(8xldJ1qm)|OxHvQu4K6pxIQcuEXjALeXmmH17 z5D$HoY!%~7#QF@SB_=ae={MvDABg&>$>q#ULCfdV=w&FOM4k-*Ra?zZm=A*>X1F2w z8}o*$-)e9<`Z;LJOoglC#Lzk-7_uXM8&UN6x}#a76DC{hz*x3DT)oLQ0Y_y4dNtBC zq`h2A_Vg%pslp+*HI?ue8EctU?GE`51TuOI@^Fh!AHjonKm-{|8wr2;GI)z+@(}K; z$riDa%mmSMx)RstC)Q!(+7iDKCySEkdtyc!Sy#I!$Pco&vmGzJz~jz;@tR zAsO^}C@ToM0bW4Ct5`xl9$cVR^!OIOO3IP^OpXx+tOB3`UIWr8HvWb$7OIt1(lYTc zWHU2Epaun`e{I36dBKWRN@?-Vt?EyIWklk0HSS5!X=|XxUm2gs@p2&KI{T6Q?%C8A zJpvhVVdQVs`ywueCS;rEI(Vs`5y5kK%Qc-u&n>_JEa8zB(-&FB^d>#UTfT(PDu60t zuTc8YSGw0?Kk`tXMZyslXqk$!{SpPIV#e641% zz8Kv`bx~`cy!Cr!{K3SKJlvP&B+9pKzNqG8Wq4T}Zw(@7?7^r~&AcwW@{vV-?$+$)a5iD$Xn+gOW{8oIZ~GYQVEUVlA1Z(m*)( z%%z_@t3k1PwSaiFG&NjA>`QN>)mtN8qUc{hde*#oz}eqXx)o9cXO@|e%y1_d$|-eZTojWKQgIjvmt_KoLTLSr8E|GEFzwO8w2 z1Tx+@eS-2)`y;yAXs~n;$m`+q@b$?l;OP?>LuC=QM8pUhu1d)YQ;@p zl_N*tB+s9=QN=;*fCj14Jw>5@&55%oWk@t_6qB_O5;ITW+g6~oVy^_3UKu7^>JbPTDYxv$KtrLf0zE9@yI9$(=G*dM zY$iUdAqSj^KITV@X3gC>O3vYm&1BllqC zl!o_B^A&||##(OrN^7mN5$GjJNuk62BoewnGtKd!3vZCttSd)s>^fTvSnsvs2oBAz zq#l}GYca-e&B8N5c2$xmtBL<6WgL@?Cj z(6s7RE-#QT9kQfSYc1Ji>Dx(nP+ln#0><9wKT4j%zjk1-`idLkLA( zSm``fzs${;VvRk&vQ2(N0ro#+8vbqR^lIcB?gz5?vX08Z)_bp4I-{19rMAds^Bhw>~B zU(<^gT-T%yIDV=sX-4C22m!p~nd9ryo%IjU6b6b7bXWa@8LKm*;!cG{#iy(-JwFvV zt*Uv+=&Xj=yrp*)_-&?4@_tssP|+#MHccbJ`W`*Jo6D1yYkMDXr>G+tv^+XKNEJ zw^5gp_2wd4ONJ6^Sopj^d#YBprFRkc{beUQt0Ob{r|{vILT$4%BkEw#zDWsJ!_?yN z3$(wT>nS;Ma_Y#3@SkX)d&5z72}9e{iE(>(E!p)-qj7!1!~!|)%iJSM?m9t09AL&# z)Ka1exlPM`eS#SOfd4TnHX=in#f?E|ni1+q>2vx>m#T7aVy$DP; zl)zk;SO+O_fV9?twN1HDRmXl$1&DBbSpXO~C!~p%nojLwk}N9iS_)TALI{)B!<5B) zo>Ly!?j^#6&h^|fZwNn)q$ijV=V&8oA~Qt{SRI3Qst3tzaA@+jFr^Tx8bD-}BzoQ_ zi+D$y@|2ckT_KlLzoJ|oqb(e8QqcmS5)Lqhk0Qa$f?-rZg|7B+WzG*Zr>?oe(*F-e zC?QTfNr44&np*WaInAI6^}9Fffp{+WYNx#8Um2r9KapoeQ6<8Ar=yFO1bI7GeG0`MY#ITMm-(O@}n@ zZM&C>`jvwx#SpsjS>`LNr%W6CY=bg{GHPKf|_b$bD7(IWnADhyZO~F;ThUgug zu&$tBpINEQ#82ED{iJ)BVLQ6Fcdn*j|Lv)Cs{7Oz{x?|pxpXoPv$IPF2mRbr&_w~g zw^9`v*K|SlGAzV<&yv@k=YCA_9H7d@8zM3${~>7pa0)JTbL0-eBrYxne!#C3X_$2C=2^8AF%*#=xC~{ z3Z}Qg^b_{*2#9c#mFnzE;XX}g$hD2INhK>5Itgotm{)w{T_%|9x`*<6-MUZKX*%Ca zIWv&>!G4)vw_8Rkw+xJGIx=wE!gmEg1Z#+#6fbkjex#OZA_Mo0_xShSxF_K!TB(@M zv))nXj5i`PXt$zc2h)JiCmj#)l)G1hDO^r#M zXVI^jgxun*=^YZA)_*rJZR~5Md4|Ok>0-0#(|iy8T=u{s`Pnr1^YvcME9VNt{{@TI B-!K3G literal 0 HcmV?d00001 diff --git a/admin/src/views/account/login.vue b/admin/src/views/account/login.vue new file mode 100644 index 0000000..8f813be --- /dev/null +++ b/admin/src/views/account/login.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/admin/src/views/article/column/edit.vue b/admin/src/views/article/column/edit.vue new file mode 100644 index 0000000..54ddf38 --- /dev/null +++ b/admin/src/views/article/column/edit.vue @@ -0,0 +1,95 @@ + + diff --git a/admin/src/views/article/column/index.vue b/admin/src/views/article/column/index.vue new file mode 100644 index 0000000..fd14f6b --- /dev/null +++ b/admin/src/views/article/column/index.vue @@ -0,0 +1,114 @@ + + diff --git a/admin/src/views/article/lists/edit.vue b/admin/src/views/article/lists/edit.vue new file mode 100644 index 0000000..fe338b9 --- /dev/null +++ b/admin/src/views/article/lists/edit.vue @@ -0,0 +1,175 @@ + + + diff --git a/admin/src/views/article/lists/index.vue b/admin/src/views/article/lists/index.vue new file mode 100644 index 0000000..5670f27 --- /dev/null +++ b/admin/src/views/article/lists/index.vue @@ -0,0 +1,168 @@ + + diff --git a/admin/src/views/article_collect/edit.vue b/admin/src/views/article_collect/edit.vue new file mode 100644 index 0000000..9a01115 --- /dev/null +++ b/admin/src/views/article_collect/edit.vue @@ -0,0 +1,116 @@ + + diff --git a/admin/src/views/article_collect/index.vue b/admin/src/views/article_collect/index.vue new file mode 100644 index 0000000..04a5b3e --- /dev/null +++ b/admin/src/views/article_collect/index.vue @@ -0,0 +1,108 @@ + + diff --git a/admin/src/views/channel/h5.vue b/admin/src/views/channel/h5.vue new file mode 100644 index 0000000..c884fea --- /dev/null +++ b/admin/src/views/channel/h5.vue @@ -0,0 +1,61 @@ + + diff --git a/admin/src/views/channel/weapp.vue b/admin/src/views/channel/weapp.vue new file mode 100644 index 0000000..cabfad8 --- /dev/null +++ b/admin/src/views/channel/weapp.vue @@ -0,0 +1,177 @@ + + diff --git a/admin/src/views/channel/wx_dev.vue b/admin/src/views/channel/wx_dev.vue new file mode 100644 index 0000000..d7c31e6 --- /dev/null +++ b/admin/src/views/channel/wx_dev.vue @@ -0,0 +1,62 @@ + + diff --git a/admin/src/views/channel/wx_oa/config.vue b/admin/src/views/channel/wx_oa/config.vue new file mode 100644 index 0000000..3547838 --- /dev/null +++ b/admin/src/views/channel/wx_oa/config.vue @@ -0,0 +1,195 @@ + + diff --git a/admin/src/views/channel/wx_oa/menu.vue b/admin/src/views/channel/wx_oa/menu.vue new file mode 100644 index 0000000..1a0e184 --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/admin/src/views/channel/wx_oa/menu_com/oa-attr.vue b/admin/src/views/channel/wx_oa/menu_com/oa-attr.vue new file mode 100644 index 0000000..663fd85 --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu_com/oa-attr.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/admin/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue b/admin/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue new file mode 100644 index 0000000..f696f7c --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue @@ -0,0 +1,73 @@ + + + diff --git a/admin/src/views/channel/wx_oa/menu_com/oa-menu-form.vue b/admin/src/views/channel/wx_oa/menu_com/oa-menu-form.vue new file mode 100644 index 0000000..a1729f5 --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu_com/oa-menu-form.vue @@ -0,0 +1,107 @@ + + + diff --git a/admin/src/views/channel/wx_oa/menu_com/oa-phone.vue b/admin/src/views/channel/wx_oa/menu_com/oa-phone.vue new file mode 100644 index 0000000..da27572 --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu_com/oa-phone.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/admin/src/views/channel/wx_oa/menu_com/useMenuOa.ts b/admin/src/views/channel/wx_oa/menu_com/useMenuOa.ts new file mode 100644 index 0000000..f86ba91 --- /dev/null +++ b/admin/src/views/channel/wx_oa/menu_com/useMenuOa.ts @@ -0,0 +1,164 @@ +import { ref } from 'vue' +import feedback from '@/utils/feedback' +import type { FormRules } from 'element-plus' +import { setOaMenuSave, getOaMenu, setOaMenuPublish } from '@/api/channel/wx_oa' +import type { Menu } from '@/api/channel/wx_oa' + +// 菜单实例 +export const menuRef = shallowRef() +// 菜单数据 +const menuList = ref([]) +const menuIndex = ref(0) + +// 校验 +export const rules = reactive({ + name: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + }, + { + min: 1, + max: 12, + message: '长度限制12个字符', + trigger: ['blur', 'change'] + } + ], + menuType: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + visitType: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + url: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + }, + { + pattern: + /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/, + message: '请输入合法的网址链接', + trigger: ['blur', 'change'] + } + ], + appId: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + pagePath: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ] +}) + +export const useMenuOa = (ref: any) => { + if (ref) menuRef.value = ref + + // 添加主菜单 + const handleAddMenu = () => { + menuList.value.push({ + name: '菜单名称', + menuType: 1, + visitType: 'view', + url: '', + appId: '', + pagePath: '', + subButtons: [] + }) + } + + // 添加子菜单 + const handleAddSubMenu = (event?: Menu) => { + const index = menuIndex.value + if (menuList.value[index].subButtons.length >= 5) { + feedback.msgError('已添加上限~') + return + } + menuList.value[index].subButtons.push(event) + } + + // 编辑子菜单 + const handleEditSubMenu = (event: Menu, subIndex: number) => { + const index = menuIndex.value + menuList.value[index].subButtons[subIndex] = event + } + + // 删除主菜单 + const handleDelMenu = (index: number) => { + menuList.value.splice(index, 1) + } + + // 删除子菜单 + const handleDelSubMenu = (index: number, subIndex: number) => { + menuList.value[index].subButtons.splice(subIndex, 1) + } + + // 获取菜单 + const getOaMenuFunc = async () => { + try { + menuList.value = await getOaMenu() + } catch (error) { + console.log('获取菜单=>', error) + } + } + + // 保存菜单 + const handleSave = async () => { + const refs = menuRef.value.value + for (let i = 0; i < refs.length; i++) { + try { + await refs[i].menuFormRef.validate() + } catch (error) { + menuIndex.value = i + return + } + } + await setOaMenuSave(menuList.value) + feedback.msgSuccess('保存成功') + } + + // 保存菜单 + const handlePublish = async () => { + const refs = menuRef.value.value + for (let i = 0; i < refs.length; i++) { + try { + await refs[i].menuFormRef.validate() + } catch (error) { + menuIndex.value = i + return + } + } + await setOaMenuPublish(menuList.value) + feedback.msgSuccess('发布成功') + } + + return { + menuList, + menuIndex, + handleAddMenu, + handleAddSubMenu, + handleEditSubMenu, + handleDelMenu, + handleDelSubMenu, + getOaMenuFunc, + handleSave, + handlePublish + } +} diff --git a/admin/src/views/channel/wx_oa/reply/default_reply.vue b/admin/src/views/channel/wx_oa/reply/default_reply.vue new file mode 100644 index 0000000..f8e765e --- /dev/null +++ b/admin/src/views/channel/wx_oa/reply/default_reply.vue @@ -0,0 +1,128 @@ + + diff --git a/admin/src/views/channel/wx_oa/reply/edit.vue b/admin/src/views/channel/wx_oa/reply/edit.vue new file mode 100644 index 0000000..6241b89 --- /dev/null +++ b/admin/src/views/channel/wx_oa/reply/edit.vue @@ -0,0 +1,189 @@ + + diff --git a/admin/src/views/channel/wx_oa/reply/follow_reply.vue b/admin/src/views/channel/wx_oa/reply/follow_reply.vue new file mode 100644 index 0000000..96949ee --- /dev/null +++ b/admin/src/views/channel/wx_oa/reply/follow_reply.vue @@ -0,0 +1,129 @@ + + diff --git a/admin/src/views/channel/wx_oa/reply/keyword_reply.vue b/admin/src/views/channel/wx_oa/reply/keyword_reply.vue new file mode 100644 index 0000000..b9f7c28 --- /dev/null +++ b/admin/src/views/channel/wx_oa/reply/keyword_reply.vue @@ -0,0 +1,145 @@ + + diff --git a/admin/src/views/consumer/lists/detail.vue b/admin/src/views/consumer/lists/detail.vue new file mode 100644 index 0000000..a92becd --- /dev/null +++ b/admin/src/views/consumer/lists/detail.vue @@ -0,0 +1,134 @@ + + + diff --git a/admin/src/views/consumer/lists/index.vue b/admin/src/views/consumer/lists/index.vue new file mode 100644 index 0000000..0d5b07f --- /dev/null +++ b/admin/src/views/consumer/lists/index.vue @@ -0,0 +1,94 @@ + + diff --git a/admin/src/views/decoration/component/add-nav.vue b/admin/src/views/decoration/component/add-nav.vue new file mode 100644 index 0000000..b01d037 --- /dev/null +++ b/admin/src/views/decoration/component/add-nav.vue @@ -0,0 +1,79 @@ + + + + diff --git a/admin/src/views/decoration/component/decoration-img.vue b/admin/src/views/decoration/component/decoration-img.vue new file mode 100644 index 0000000..03a0106 --- /dev/null +++ b/admin/src/views/decoration/component/decoration-img.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/admin/src/views/decoration/component/pages/attr-setting.vue b/admin/src/views/decoration/component/pages/attr-setting.vue new file mode 100644 index 0000000..d4c90f3 --- /dev/null +++ b/admin/src/views/decoration/component/pages/attr-setting.vue @@ -0,0 +1,28 @@ + + diff --git a/admin/src/views/decoration/component/pages/menu.vue b/admin/src/views/decoration/component/pages/menu.vue new file mode 100644 index 0000000..1027e41 --- /dev/null +++ b/admin/src/views/decoration/component/pages/menu.vue @@ -0,0 +1,44 @@ + + + + diff --git a/admin/src/views/decoration/component/pages/preview.vue b/admin/src/views/decoration/component/pages/preview.vue new file mode 100644 index 0000000..34a4f61 --- /dev/null +++ b/admin/src/views/decoration/component/pages/preview.vue @@ -0,0 +1,67 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/banner/attr.vue b/admin/src/views/decoration/component/widgets/banner/attr.vue new file mode 100644 index 0000000..3d5beb9 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/banner/attr.vue @@ -0,0 +1,79 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/banner/content.vue b/admin/src/views/decoration/component/widgets/banner/content.vue new file mode 100644 index 0000000..7633243 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/banner/content.vue @@ -0,0 +1,33 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/banner/index.ts b/admin/src/views/decoration/component/widgets/banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/banner/options.ts b/admin/src/views/decoration/component/widgets/banner/options.ts new file mode 100644 index 0000000..e33d921 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/banner/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '首页轮播图', + name: 'banner', + content: { + enabled: 1, + data: [ + { + image: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/customer-service/attr.vue b/admin/src/views/decoration/component/widgets/customer-service/attr.vue new file mode 100644 index 0000000..7dd0f1a --- /dev/null +++ b/admin/src/views/decoration/component/widgets/customer-service/attr.vue @@ -0,0 +1,38 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/customer-service/content.vue b/admin/src/views/decoration/component/widgets/customer-service/content.vue new file mode 100644 index 0000000..99d4f7e --- /dev/null +++ b/admin/src/views/decoration/component/widgets/customer-service/content.vue @@ -0,0 +1,39 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/customer-service/index.ts b/admin/src/views/decoration/component/widgets/customer-service/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/customer-service/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/customer-service/options.ts b/admin/src/views/decoration/component/widgets/customer-service/options.ts new file mode 100644 index 0000000..3a5efda --- /dev/null +++ b/admin/src/views/decoration/component/widgets/customer-service/options.ts @@ -0,0 +1,11 @@ +export default () => ({ + title: '客服设置', + name: 'customer-service', + content: { + title: '添加客服二维码', + time: '', + mobile: '', + qrcode: '' + }, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/index.ts b/admin/src/views/decoration/component/widgets/index.ts new file mode 100644 index 0000000..20bf4bf --- /dev/null +++ b/admin/src/views/decoration/component/widgets/index.ts @@ -0,0 +1,14 @@ +const widgets: Record = import.meta.glob('./**/index.ts', { eager: true }) +interface Widget { + attr: any + content: any + options: any +} +console.log(widgets) +const exportWidgets: Record = {} +Object.keys(widgets).forEach((key) => { + const widgetName = key.replace(/^\.\/([\w-]+).*/gi, '$1') + exportWidgets[widgetName] = widgets[key]?.default +}) + +export default exportWidgets diff --git a/admin/src/views/decoration/component/widgets/my-service/attr.vue b/admin/src/views/decoration/component/widgets/my-service/attr.vue new file mode 100644 index 0000000..a29d894 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/my-service/attr.vue @@ -0,0 +1,38 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/my-service/content.vue b/admin/src/views/decoration/component/widgets/my-service/content.vue new file mode 100644 index 0000000..9034090 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/my-service/content.vue @@ -0,0 +1,59 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/my-service/index.ts b/admin/src/views/decoration/component/widgets/my-service/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/my-service/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/my-service/options.ts b/admin/src/views/decoration/component/widgets/my-service/options.ts new file mode 100644 index 0000000..f54952b --- /dev/null +++ b/admin/src/views/decoration/component/widgets/my-service/options.ts @@ -0,0 +1,16 @@ +export default () => ({ + title: '我的服务', + name: 'my-service', + content: { + style: 1, + title: '我的服务', + data: [ + { + image: '', + name: '导航名称', + link: {} + } + ] + }, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/nav/attr.vue b/admin/src/views/decoration/component/widgets/nav/attr.vue new file mode 100644 index 0000000..3128196 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/nav/attr.vue @@ -0,0 +1,36 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/nav/content.vue b/admin/src/views/decoration/component/widgets/nav/content.vue new file mode 100644 index 0000000..39ca477 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/nav/content.vue @@ -0,0 +1,32 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/nav/index.ts b/admin/src/views/decoration/component/widgets/nav/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/nav/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/nav/options.ts b/admin/src/views/decoration/component/widgets/nav/options.ts new file mode 100644 index 0000000..1eb3cfa --- /dev/null +++ b/admin/src/views/decoration/component/widgets/nav/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '导航菜单', + name: 'nav', + content: { + enabled: 1, + data: [ + { + image: '', + name: '导航名称', + link: {} + } + ] + }, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/news/attr.vue b/admin/src/views/decoration/component/widgets/news/attr.vue new file mode 100644 index 0000000..6645dc4 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/news/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/news/content.vue b/admin/src/views/decoration/component/widgets/news/content.vue new file mode 100644 index 0000000..197f917 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/news/content.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/admin/src/views/decoration/component/widgets/news/index.ts b/admin/src/views/decoration/component/widgets/news/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/news/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/news/options.ts b/admin/src/views/decoration/component/widgets/news/options.ts new file mode 100644 index 0000000..dde2c1f --- /dev/null +++ b/admin/src/views/decoration/component/widgets/news/options.ts @@ -0,0 +1,7 @@ +export default () => ({ + title: '资讯', + name: 'news', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/search/attr.vue b/admin/src/views/decoration/component/widgets/search/attr.vue new file mode 100644 index 0000000..93f9278 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/search/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/search/content.vue b/admin/src/views/decoration/component/widgets/search/content.vue new file mode 100644 index 0000000..db2a07a --- /dev/null +++ b/admin/src/views/decoration/component/widgets/search/content.vue @@ -0,0 +1,23 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/search/index.ts b/admin/src/views/decoration/component/widgets/search/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/search/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/search/options.ts b/admin/src/views/decoration/component/widgets/search/options.ts new file mode 100644 index 0000000..e02e298 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/search/options.ts @@ -0,0 +1,7 @@ +export default () => ({ + title: '搜索', + name: 'search', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/user-banner/attr.vue b/admin/src/views/decoration/component/widgets/user-banner/attr.vue new file mode 100644 index 0000000..73263d7 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-banner/attr.vue @@ -0,0 +1,79 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/user-banner/content.vue b/admin/src/views/decoration/component/widgets/user-banner/content.vue new file mode 100644 index 0000000..0a11a01 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-banner/content.vue @@ -0,0 +1,32 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/user-banner/index.ts b/admin/src/views/decoration/component/widgets/user-banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/admin/src/views/decoration/component/widgets/user-banner/options.ts b/admin/src/views/decoration/component/widgets/user-banner/options.ts new file mode 100644 index 0000000..4adc70e --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-banner/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '个人中心广告图', + name: 'user-banner', + content: { + enabled: 1, + data: [ + { + image: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/admin/src/views/decoration/component/widgets/user-info/attr.vue b/admin/src/views/decoration/component/widgets/user-info/attr.vue new file mode 100644 index 0000000..93f9278 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-info/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/user-info/content.vue b/admin/src/views/decoration/component/widgets/user-info/content.vue new file mode 100644 index 0000000..b64e7e7 --- /dev/null +++ b/admin/src/views/decoration/component/widgets/user-info/content.vue @@ -0,0 +1,16 @@ + + + + diff --git a/admin/src/views/decoration/component/widgets/user-info/images/default_avatar.png b/admin/src/views/decoration/component/widgets/user-info/images/default_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..de31d02adfced125ae228824df009132f2a5085f GIT binary patch literal 6093 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 T*+R{{00000NkvXXu0mjf-T0C1 literal 0 HcmV?d00001 diff --git a/admin/src/views/decoration/component/widgets/user-info/images/my_topbg.png b/admin/src/views/decoration/component/widgets/user-info/images/my_topbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8984438323c87a2ddafc2a593322309292fa5159 GIT binary patch literal 142469 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 Z{{c!4-k? ({ + title: '用户信息', + name: 'user-info', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/admin/src/views/decoration/pages/index.vue b/admin/src/views/decoration/pages/index.vue new file mode 100644 index 0000000..3ff7ee4 --- /dev/null +++ b/admin/src/views/decoration/pages/index.vue @@ -0,0 +1,105 @@ + + + diff --git a/admin/src/views/decoration/tabbar.vue b/admin/src/views/decoration/tabbar.vue new file mode 100644 index 0000000..c139695 --- /dev/null +++ b/admin/src/views/decoration/tabbar.vue @@ -0,0 +1,221 @@ + + + diff --git a/admin/src/views/dev_tools/code/edit.vue b/admin/src/views/dev_tools/code/edit.vue new file mode 100644 index 0000000..4d4c5a9 --- /dev/null +++ b/admin/src/views/dev_tools/code/edit.vue @@ -0,0 +1,388 @@ + + + diff --git a/admin/src/views/dev_tools/code/index.vue b/admin/src/views/dev_tools/code/index.vue new file mode 100644 index 0000000..871de38 --- /dev/null +++ b/admin/src/views/dev_tools/code/index.vue @@ -0,0 +1,246 @@ + + + diff --git a/admin/src/views/dev_tools/components/code-preview.vue b/admin/src/views/dev_tools/components/code-preview.vue new file mode 100644 index 0000000..9c1aea4 --- /dev/null +++ b/admin/src/views/dev_tools/components/code-preview.vue @@ -0,0 +1,73 @@ + + + diff --git a/admin/src/views/dev_tools/components/data-table.vue b/admin/src/views/dev_tools/components/data-table.vue new file mode 100644 index 0000000..e4d2d49 --- /dev/null +++ b/admin/src/views/dev_tools/components/data-table.vue @@ -0,0 +1,102 @@ + + + diff --git a/admin/src/views/error/403.vue b/admin/src/views/error/403.vue new file mode 100644 index 0000000..53905ec --- /dev/null +++ b/admin/src/views/error/403.vue @@ -0,0 +1,15 @@ + + + diff --git a/admin/src/views/error/404.vue b/admin/src/views/error/404.vue new file mode 100644 index 0000000..caa3d7f --- /dev/null +++ b/admin/src/views/error/404.vue @@ -0,0 +1,9 @@ + + + diff --git a/admin/src/views/error/components/error.vue b/admin/src/views/error/components/error.vue new file mode 100644 index 0000000..5f0b959 --- /dev/null +++ b/admin/src/views/error/components/error.vue @@ -0,0 +1,57 @@ + + + + diff --git a/admin/src/views/material/index.vue b/admin/src/views/material/index.vue new file mode 100644 index 0000000..6e6dafc --- /dev/null +++ b/admin/src/views/material/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/admin/src/views/message/notice/edit.vue b/admin/src/views/message/notice/edit.vue new file mode 100644 index 0000000..fee2422 --- /dev/null +++ b/admin/src/views/message/notice/edit.vue @@ -0,0 +1,122 @@ + + + diff --git a/admin/src/views/message/notice/index.vue b/admin/src/views/message/notice/index.vue new file mode 100644 index 0000000..672ba03 --- /dev/null +++ b/admin/src/views/message/notice/index.vue @@ -0,0 +1,95 @@ + + diff --git a/admin/src/views/message/short_letter/edit.vue b/admin/src/views/message/short_letter/edit.vue new file mode 100644 index 0000000..504de9b --- /dev/null +++ b/admin/src/views/message/short_letter/edit.vue @@ -0,0 +1,130 @@ + + diff --git a/admin/src/views/message/short_letter/index.vue b/admin/src/views/message/short_letter/index.vue new file mode 100644 index 0000000..0272670 --- /dev/null +++ b/admin/src/views/message/short_letter/index.vue @@ -0,0 +1,56 @@ + + diff --git a/admin/src/views/organization/department/edit.vue b/admin/src/views/organization/department/edit.vue new file mode 100644 index 0000000..07e3f5f --- /dev/null +++ b/admin/src/views/organization/department/edit.vue @@ -0,0 +1,182 @@ + + diff --git a/admin/src/views/organization/department/index.vue b/admin/src/views/organization/department/index.vue new file mode 100644 index 0000000..720491d --- /dev/null +++ b/admin/src/views/organization/department/index.vue @@ -0,0 +1,166 @@ + + diff --git a/admin/src/views/organization/post/edit.vue b/admin/src/views/organization/post/edit.vue new file mode 100644 index 0000000..1c582e0 --- /dev/null +++ b/admin/src/views/organization/post/edit.vue @@ -0,0 +1,127 @@ + + diff --git a/admin/src/views/organization/post/index.vue b/admin/src/views/organization/post/index.vue new file mode 100644 index 0000000..45f9058 --- /dev/null +++ b/admin/src/views/organization/post/index.vue @@ -0,0 +1,128 @@ + + diff --git a/admin/src/views/permission/admin/edit.vue b/admin/src/views/permission/admin/edit.vue new file mode 100644 index 0000000..41a60d2 --- /dev/null +++ b/admin/src/views/permission/admin/edit.vue @@ -0,0 +1,289 @@ + + diff --git a/admin/src/views/permission/admin/index.vue b/admin/src/views/permission/admin/index.vue new file mode 100644 index 0000000..0b88014 --- /dev/null +++ b/admin/src/views/permission/admin/index.vue @@ -0,0 +1,181 @@ + + + diff --git a/admin/src/views/permission/menu/edit.vue b/admin/src/views/permission/menu/edit.vue new file mode 100644 index 0000000..4686a10 --- /dev/null +++ b/admin/src/views/permission/menu/edit.vue @@ -0,0 +1,315 @@ + + diff --git a/admin/src/views/permission/menu/index.vue b/admin/src/views/permission/menu/index.vue new file mode 100644 index 0000000..d4ec4ff --- /dev/null +++ b/admin/src/views/permission/menu/index.vue @@ -0,0 +1,157 @@ + + diff --git a/admin/src/views/permission/role/auth.vue b/admin/src/views/permission/role/auth.vue new file mode 100644 index 0000000..3e16834 --- /dev/null +++ b/admin/src/views/permission/role/auth.vue @@ -0,0 +1,154 @@ + + diff --git a/admin/src/views/permission/role/edit.vue b/admin/src/views/permission/role/edit.vue new file mode 100644 index 0000000..ea95aab --- /dev/null +++ b/admin/src/views/permission/role/edit.vue @@ -0,0 +1,114 @@ + + diff --git a/admin/src/views/permission/role/index.vue b/admin/src/views/permission/role/index.vue new file mode 100644 index 0000000..e4b517b --- /dev/null +++ b/admin/src/views/permission/role/index.vue @@ -0,0 +1,108 @@ + + + diff --git a/admin/src/views/setting/dict/data/edit.vue b/admin/src/views/setting/dict/data/edit.vue new file mode 100644 index 0000000..8620e7e --- /dev/null +++ b/admin/src/views/setting/dict/data/edit.vue @@ -0,0 +1,129 @@ + + diff --git a/admin/src/views/setting/dict/data/index.vue b/admin/src/views/setting/dict/data/index.vue new file mode 100644 index 0000000..bf20d7c --- /dev/null +++ b/admin/src/views/setting/dict/data/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/admin/src/views/setting/dict/type/edit.vue b/admin/src/views/setting/dict/type/edit.vue new file mode 100644 index 0000000..28c3408 --- /dev/null +++ b/admin/src/views/setting/dict/type/edit.vue @@ -0,0 +1,111 @@ + + diff --git a/admin/src/views/setting/dict/type/index.vue b/admin/src/views/setting/dict/type/index.vue new file mode 100644 index 0000000..1719726 --- /dev/null +++ b/admin/src/views/setting/dict/type/index.vue @@ -0,0 +1,135 @@ + + + diff --git a/admin/src/views/setting/search/index.vue b/admin/src/views/setting/search/index.vue new file mode 100644 index 0000000..280d29d --- /dev/null +++ b/admin/src/views/setting/search/index.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/admin/src/views/setting/storage/edit.vue b/admin/src/views/setting/storage/edit.vue new file mode 100644 index 0000000..28dae8f --- /dev/null +++ b/admin/src/views/setting/storage/edit.vue @@ -0,0 +1,196 @@ + + diff --git a/admin/src/views/setting/storage/index.vue b/admin/src/views/setting/storage/index.vue new file mode 100644 index 0000000..029d7d4 --- /dev/null +++ b/admin/src/views/setting/storage/index.vue @@ -0,0 +1,53 @@ + + diff --git a/admin/src/views/setting/system/cache.vue b/admin/src/views/setting/system/cache.vue new file mode 100644 index 0000000..1861d21 --- /dev/null +++ b/admin/src/views/setting/system/cache.vue @@ -0,0 +1,261 @@ + + + + + + diff --git a/admin/src/views/setting/system/environment.vue b/admin/src/views/setting/system/environment.vue new file mode 100644 index 0000000..f6e580e --- /dev/null +++ b/admin/src/views/setting/system/environment.vue @@ -0,0 +1,148 @@ + + + + + + diff --git a/admin/src/views/setting/system/journal.vue b/admin/src/views/setting/system/journal.vue new file mode 100644 index 0000000..fadb294 --- /dev/null +++ b/admin/src/views/setting/system/journal.vue @@ -0,0 +1,128 @@ + + + + + + diff --git a/admin/src/views/setting/user/login_register.vue b/admin/src/views/setting/user/login_register.vue new file mode 100644 index 0000000..dd9af38 --- /dev/null +++ b/admin/src/views/setting/user/login_register.vue @@ -0,0 +1,180 @@ + + + + + + diff --git a/admin/src/views/setting/user/setup.vue b/admin/src/views/setting/user/setup.vue new file mode 100644 index 0000000..0c67855 --- /dev/null +++ b/admin/src/views/setting/user/setup.vue @@ -0,0 +1,65 @@ + + + + + + diff --git a/admin/src/views/setting/website/filing.vue b/admin/src/views/setting/website/filing.vue new file mode 100644 index 0000000..fd96332 --- /dev/null +++ b/admin/src/views/setting/website/filing.vue @@ -0,0 +1,93 @@ + + + + diff --git a/admin/src/views/setting/website/information.vue b/admin/src/views/setting/website/information.vue new file mode 100644 index 0000000..616e871 --- /dev/null +++ b/admin/src/views/setting/website/information.vue @@ -0,0 +1,150 @@ + + + + + + diff --git a/admin/src/views/setting/website/protocol.vue b/admin/src/views/setting/website/protocol.vue new file mode 100644 index 0000000..c219451 --- /dev/null +++ b/admin/src/views/setting/website/protocol.vue @@ -0,0 +1,58 @@ + + + diff --git a/admin/src/views/user/setting.vue b/admin/src/views/user/setting.vue new file mode 100644 index 0000000..46c55f4 --- /dev/null +++ b/admin/src/views/user/setting.vue @@ -0,0 +1,162 @@ + + + + + + diff --git a/admin/src/views/workbench/image/customer_service.png b/admin/src/views/workbench/image/customer_service.png new file mode 100644 index 0000000000000000000000000000000000000000..20a0b8965c6f0998f192c49b9b0a820dbfe5f2a4 GIT binary patch literal 85609 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 qFW}v8RY=Rve7$e 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

@2XNu`Nc>iwV14d~|I_=)TPYOi%Uj8WVj znty;m%(0%AA>vYEWw{r1g~(A~yXJu4eFR+PFn@{uf;NqepfR>MnSFeP>(V@W6|M^! z#PgjV6>El#sk)y?Yn;)T4?MZ5z0YgyeeM0eHd)N)8vEy8>}7D`B%LJp%0DjOYgVW_ zt6lcDmC!*V2gxRtI(z#5%U}9Z+Da9Oe)F6A($k6&hz*avNoSy z^}QCq;G36d&2=pG_^r3zOt;^5r%4r_W!aRzB)X9wK~fkAG|-yGMwH+AyWg>EZoKgp ztDT7To$o)Rq_FKj`N{OhKmO7D*`e%<0CqMa#^x4nukRKJ4F5sR3t6OiqLuwNNL%u1u|I~k^9X|c3^!wlc(Y!ajll5AC z^;OlmY3DkfoBU430}b%$JIKhjNVg~J+?0LrjxeRE#lOq80^cgAS~uTvizQy6&hg04 z?y!UA^dI$UqvzuGyje7OPyIA86f^eEE8*x9pZK_qi-bB`HC;R;phoFZcZC ze}2hwet!Q4e@`3|yYBM+hSj%g3DBy95GMl3O?Tc^uSt(R)Ha`& zOK(c2DC}}K#r~g}!=0BdRc9F`f{-w>@XE^@ii-8ORpZ~rNpjXXBei%DR^6n~W#uv` zQjz+I2g|;(id)nOOWl-p{x=a&wxF|Pw;a!werx;C3W!UK%fyW>+Qb}%_tNCoKc^TZaL5KIg9~~@k zt%nSeY;pj`)EsgdRFAR|ZSdsukPYEAszsZpV`&_z-g^D8}nHgzjdXM>>b5d+DB2bWbE+A)WI)*5XP0c5PzhRskU-gi}vZj)4`D zaN=~?@*`sGDHee>WXQ0JQE`cw7B9mO+m@N`aByJWzn}o+>6e zILR}i%1nETZX`F+wa6L7vnsvh*b*7Ki|Wtnt9KIk z&J`dimtp_?<%)kXulG`mD`^=J-m)YrB=%^Lxc6Qp1}a0+z-mIyi}2o?>^UM`+wy4> zAn>45$uUsAd+2XnWL4&*dqqscrt_G5?T@yuCZ@u+)yQE26 zwN;moT1~~L1qcHMsf1b-S;d=So{8NoK7a-)%!Ox=A5Za9{#^zH?1~uLa63*^n(P7t z1O_;h<&={Y6LLj1 zy1F5saQ7=Em2bQ43IPPyshON55Z!TSrH|bfiUps1=_Hd74m<3K^tQr%!{T}TvBy{( z!r7`@c)LzVi#D@31kZNdK!GW3{oX(+-v9t007*naRJdm7Hh|c~WuqU=bFP}mSXO0@ zA1B*!>eNe3Whk0z=x)VBoG7szor+I$m7(Q${dj*{#~y%i8!7|VUoB1-in%IL2|yS! zbeMEh>D*elRmG&o95cewtntDBgw9R*G(lyUKJ8Ki1PZ3U^2)2mENoP20pJ^-q!M9> z<-||$*+?RGOX<%%d#sYE7B5ySH`j&@u-T}bbOQzsQr4bwBeJ;MLy17cl-KVxa0--F zc!JIP_8VA9)uJ+J`<#-FRDsA4T||JeBxf{=VXrr06R}KD$+ioYr z;Cq(bRE&)TuaB6^kHj7#s3jgu^OFZ@cfwc;6|OB>a9d<7L2gay0FfBT0P^lG4cP#qfS%) z5a~z@dvbNM_0RweKq5xL>lgTkF~M)p&(=q@h!1PSy8ssER5{qNCuu$ufO+)MN6nqe zd!QTk5)$1SNkZ6?xToA`2)^MS9~%i#1zlT9h$_>r4S+!4LkCOVu|OiTUb<*bDW`gd zxzI@|8y@}YeRxcEy>=P%tbvA3ekLE)c=BFIYf0yADf5eaJVP_Kk4`}uHp9zNOK`>= z_c%-Y2i-anui7fEa$h9KSVyHi3Q!-q@txHUC>^sHT^SoeUL@%lAZQSlb1$Ddm%jdn ze9x}887q@=OB?q_<7)K#@_Wk+5q25q7KSn2OK}$BNKg#{S{nhbM)5}UkF?BIt3lwi zT~j9}Y6$BVg>4KhG$&#N_;6tOOnf7*shR@u9!_*F4wobEsh4DBPgyRPoC-i(a{gX_vP;JK7LV{HFZpZ2U>%n`My(xuAIAhIXdtCZ4fZR~9T1ZTdH zBhOFw{QMWLmx!r1*J&|ci7<$n@d@!RejcR;vC)%&4Zvok{5G-dZT&=X%m*KQFr6&J zrsu)aort8PAqs-(+VK5<{p-UjymGt+K!t0MqAK54Fpu$bjST^!;l2nuwujiA4Fq6)yuDWx&Ax>A(Z_uZ*pBqql{r;+l{Kks467UNaj4Rfl?`J>9853w#x zIZ;W(Il&T@+^AUlVQx`E4W72ZDorFxn}xTeErjJ7{KIsAzU7wNvZuqn47kspdg>Xu z9jTb~wrwT=>v-$`&{d_j+^ER!(Ro?SFe)B+U^g@52EY)yOeZEk-CCz-Yh!1=h@DhF ziflTb+FhIUaFqhXzJamN)T1C=x>w6}AYZHoOZM;k++{ZI{-j((3n&XNqbn&X_sV zfCujg;{Bq93nVqXXL%#9(g-%Idqh2U>z0$7RsgMA9bh{yhaJ!6Y9TgPvff*GS zE(|~jp}ggV4PP?Vn2$JWxOMsQ2tXBC)dKCG5!+~2!zcj4!P<28g*IF#m908n)sMRF z9$tomMnNi)o5!QJ~F};DjIFs`dKLSSoN5^>M9u(En?AC44Ty- z5ga6IIW`f%6Hugc6M#U=xT{q{4Z5H+qgP*k`P{Uz03mekcI=nt;GYe))Kr|N^z1mH zv6EbR<$PNgz>4H1Y+sC(s$Si?m6MxF_NL_-Ol6}kJJ1CnAn{=EjDRlwW_`BZcB>K$ zG~RP<0t6PH0Gm5h>oD|JTzk`HDPFI(rlR42GahZs*bL}uh`VGvE)@ED!_G=sjuuH7 z&-(2Hzn9zR=v9~Y_;)E&W~8qek^(!M z(w~+742ZaxsPt!fCXN}QY{%SUt$Yf%3J99>$#U1;A(a6d5PQG%)?LiChfDO}gNKkp@p-5}li9#>N3E%<2*XS(S2CT7?iEb-tGVyxmWwQ);ID9bDQZN-& zj;u*{AZ?Rwg#7;hbxE0w(B)+#<8aYIKJ@t z&)M(FfWTPz{#kh}X3m^tBEIutQ*}qB)Xropn%Vg zJML)bPN;0HZ{W59M_aF}o=5zI^u>Sl6d@Ga(&KI1>Z~!f0&QA667d zdSmv>3zW9#uM&HOQK^;@gQ+ry7O$ziKQ^S(!pY&l)c8|P1ZPPD*`70~5>MgjJTB1$Yu3asN31kkRHIv|^|G47( ze=bi30Y!0g;kMd!*Y6kg7PFY|+s4JdU;pMe=_yriiZa&NDt1xuQN0?C;fto%;8RaN zZJP*(0wv;i(|bIsvHk+p(jqn-hNqj=D8>t>dgB@9^D+6R-D$>jGDv0`VZFxSiiF^t zpVC+V>nrA)zW3hy<mHEXFnm z1XPmiC2_c`(7*r8r?*#UpdHfv>gyN@QABaBCVK!4X^>VZlSa@KB0DEJ-G}HqSsV;` z(9X&w(v+o=xQ5@=io&%gV(^c5p1SY;`_m&TJQHK4t|jTmoZO^2BYpW;)WJ*1Lpvy0 z3A#P10<3w0fh!=_+h8uKhejs1Jhx#tHxqL>QznXtsa^N252K_=(;~tWg9(w3u zbr^e~0_?bovHie1KmPGgD;>QV!>5$oh1B(z$(;bV!?R?s*B}>vl0epB}md#vme+W&J0Tl*Ah%?#N}pw!!#%DjJd&>eckDC+5}yLY+NV z_g95V!@TKUg;6m=(gGPRJ6utRJ!N~za9ssz(2Wk;(2dxNXz54jG6hnuR7WNBbTbB1cR^~#6)N2h?;LpG zL3XdPubxAm33R*WnjcxxTC6{Z)%8x%v(KL5g%d1if<`S~ ztjDuN=gpgE;y(paEV;?{g2J7(cSvr!{PG2=WqMJT!rcb8@QMX#+wHb4QN1x^FDD?V zrlLY{2dlpT`sON%Cc_eb@<}J89~dBDRJ=oz6xl5fK{XX+up!E8*kOm;spWp=4l)?h zV_`2KmK^b^!v=Yj!YbU3a)k*5%i}SaBoZk47l0b#tAYQsYX1?i4N zwXL`1rUek1mU>|w47J!JaB<=RA#|4y8v&2OqD2k}&;UarhXIk2Bx;ec)d&#q=`9aSfiwIo+yZ5?!1XwyNzgAVGh-cGxygGw`dyoCszxpHSpx|5PA5)1lBmcJk06%Ktsms{I`=qg zhg8AX!q~UncJxnFGZZaqdp6ke?N1oL|Ovyz*n zIsgbr2m!MHdO#?s9?4DSWvCdj<#yC&ct?^b%~0O|fNIRHic(~CfIJ#_Kxk*j8j#UQ zxb@=2S6lXBj~+dh@%7&-87CX%nK6I>Uzq} zxKeh(w{wZ5y>xFxiOb<+T4B* zF&`>uD+vzC=O9T4)yYj=ExBm{fS_#0P|-a789>;k?p$kmeYpVv8^Pg63^yIfrEkRl z5oVD+_q+=%xykhcg@mr#Sts{&Tc8og9OwEO3og_KMZ3ziM-tWDO0#xxkVV}vO;Lne zgu2!mf7sBYL}-G4{PgW$K~tAra&g@*xd8}d6yg%~7=R9nAly>PT9*{XTWTp)=jYf+ z#FZa@#8FuVaw&#hl|&uZ+oU{-xc|crS35iD>28(pXrPF_1ab5y(h+^GOEjM@qQNCL z)_zLTd71nJy&R?=FknFHW_AADs8}{U@o(Y+`VmtgKtP>it|UVZ=-=NOiT+4BuQ8mS zjlG6oGsIcIs*>ra=N@pteyUwKxI%?`#jw%yZJDORRg9sX3zO1{&{#XHa`jM{?(72(MNWI<|rAOTZ||M97v4_+YJ zzd^r9+9NRQfCCP&fGNtjas1)_rK~&=xX_JQjF&PXu(`V_!V~WZb^_MbBwxLhwtOVu zA;pkH^@8$OkcRjkxA+LT)UQ&8C{e4iwj7=$cx}A#CK}ry&yWi$bT`o^?%a7D>u~eW+^UStgLp-95jKSv zUqq}5w@{OXq^=_o|L+pFqP>|TeMjreQ$I<^MJaSPZ4|^j zPnWvGJ?$x);(*X(s*hK|&6Z+)fxo<7+wP!K+~eiceGHsv=<$ROdyhnaK1@g42lqa! zJ{Yc3y15c#5wYs^Hlu^z5+#4VAXNc7j*pM)$vEXbZ|FUtQNlc&SUih_v2gKn4^gHO zHr$AHnFd@$3Bq2#9rVY46G4=L~~mBhkGz`n>QAwTghOU(<eXk_$};Yb!qOiqL0|Do)8j*7C^1jcSQkbdt8$czy=&!GGS?Pk@U(A&TuAj)-bnd*ifwdXu^3w5qeD}*z?H3w&ne$>INGX&RtI#FJ zmamDig*3?D@PYNcWR5xQ*DXxWLzUb&b8 z48TeGAFozQ_VHWBMR|MoZsY@_0>SxC*0Y9xiZMH(1GIzZUbXd!j#I8qct6U5e;Jw4 zfxXv8zFsZ~p^CC?{DBFfbCWM{|j*tP*cME;CY(ouLbSPayR$r8&kD*h`!vCz~qJe-Ht^C^|3B`|13;?kZ2xEJy;re-*h@aUvDa9mqJY?GHtY?g zqk;-pV!kA56cuSoRiZKW8hh{9v0On>q1}z=mk1jTBt9DL@!baFGFhn)8t{~>DH}lwZ=69!ZjmDnU}#u zK1!~4uxdi2?EWjSxQWS|?{ntaR(K>zGDE~g3G>bMvWYw({n>(a^ul;RCMeX`Pr>wN z&IAM^{xCvW^(cL(jr2@HeKB|ydZhtjv5bmo3N>_Y><$p5K=J_{nyYiQQgs;s)aq^^ z$Y*2dGS5aeqOALwXZ6Vm2z*G43NANlU~mr`09Gc#oeO_{8W3*3{Z8rs_t?=*du?Tq zo<8mVR87e0j2(c0(H9$;jiuHoBrzAO;?u7S2+NgydXk>wbs4yhQ>lQV#DY@P+RS-0*zGQ!b|1PFZ;65lta9%ZhZcn|RbUI)ZI24|fm zK5g*n{~AC5NQqsDY9J)5 z!{lYCjNZPgcleJ00%Fu0`R&gYeV7?Vh`3Yc;uV*=+mS-60D=dDz`oR0fN+=CYrd44 zafK}&FQVdr&|O>r)w!4`MD$ULLwH=2*>NF|{DFx5?*atacyQM`t(W2#blMIXG{};u z#wdV=90;p=tU*9R!0lKWAP|fKpI*Gk3M5G<7F{W1j3OXlVUH3*6s2*|;i@C}XNH)X zV@f&H?Ow_)Kf_OcK={r8!S@d0P^kqORR#!12&8~R))OTw;t)xciwH; zj$Et_00G`l*T)M7IPN8KkoN%)xR9)fb@*3E2q$(w$qe&WP*(?MWNQ9D2MDG+%EdBa z!ekFD(V$@uJwiGVp`kP7()n1#CSJu>)@_CD_7VCMT!N@dW*pgpv_q)zZoBQ8UT+xF zXf4Zdlxg~j6aTlrJsdt%;#HhCXKBz`D1%O8$b);3iA{ppSrF)x8R%3+PgeaXIik?zBa72Z zvazraP-4>o2kw`*%YYS0ROSI;?da#g1CKv{#G`Y7>{|*64B(F zgrK#v^UlAqC|9Qj$gu|soST2U%8)(NaZCzdN^ucAK{plc#)w{r5gV{$$&< zng56#N6j;k}BR(>!$X za|emc_blWc)5|yQzV`cEnXq+ahR4FZXa8|P*zjfSgU4LFt~A+izw?AB{%fcZY0_?~ zj`ZB~gh4y{Geo;e3W3J#O(oBKXMScE?Knv}0jom*8v%h6;W_1BnExY5{oZxgT}=0X z{f##*cEG-?LyaV=Lk>B}>?8llvUM9i?*IBb8LM~SrE*gwp%vGn45|kod~k|Gvyjaa zHy18u)KHTweFs}I6jhi=&;M8nK@qHZ4ncK9Yi3Ib5ePo}?6dIRdmp4=gpgvS0K6`b zKmMfHmT+Tge)X^|x7yN@uONB#%1w4!nC;_GtvA#_lH4rKTK}UX<%~4ib-!qlpuL*$k19bDQCQZD@tn(WJ2%o(FdYCKw!#wdreE03=VYx_GiM=34VQunktxKFuNuPd1MRn|2KK zI&Bgf@3dpJ5rpTvH)DFrR?$MiM_oMoN~%3MvyY@ zuDjHtZ@%_z+g-D@Yybct07*naRH=0R@>}AV`^_ z?lq} z5{Rk^2qh)U!}E_%2oFwsJp9z4eOReT(2^jgp=C;&U89pv6HlyLT@lvQmi}wr8-ld- z%o6?7EL$6z7OxB)6}4C_`t?sF9sO9mIINaomoXsexB##~Prs-JK`aTeMx0nXW)$&= zgeCE|zA6sYQAlue)q31iVYmAi)eAe;#b=)co|$^)ixW|`e&`6daL+;qyxCmSH#Gaf=5=X=1Y2;~?- zVp$f6M4T^DF2htauEt=a=FOW}auWt=jD0`+M9~!wLnfs961g48b{sQyY|2fDjRKBH zB15}&?Iye0PpS1w$~GQ@bX|r*0Kvx&3bkAQNG7I7vjPaXQGd0{O;u0gzxx}mqdU&K zgfM)>)t3Iu#UyOJ@kX|}V{J!U(iY=W=76ALDA!yqF9QUy+6+V|Zn`OMN2Na-Ab9&# zA#(%-(w_kylAC;Ck>E8@G3gEnPdr7LIlu52Oq!%}X;~s^Wuv&h^lL?Sz7d{(==JdQ z3vIW&;9zmAe$$^b;x^+uQCR0OWMP-(^!$tjGfFN(qEvoIv z7kEZfNeB?lA|Z5Fa?_7VT?7sQ63_55P?~S_=rM_nLMp0M1q!H8sD*4tin~OBA*Nuk zBupedzp7RpqVzHWK(JD7&O$|O2c)r`eyvh&l`Yi&%wNiRxJuqUAV1 zY$ad(FQWOzMsVq+m!<4^Owi@3&v(ed2iXZkq@t6Wpto&e5s~?-CFgoq50DadyONtO zy6}<|bvvJ5A(to>fvGBmCEK=}p1CxTR77Dauc1ux01aV%Pr(btT%@&}Zuw%n!@nelIL}|D&)@ z;jU5$T-1fB^42CV3b< zBrfE3r}qdgM3LrK6rTBedGH0~p?i;<5V)9|iK+XJJ8rkU0J|fL`yuE2xDu^AhIw*J zo?{ugw!L%!oTKz_g4)JQI+!S?;<)L&Le#hlk&2lHN?50FzfDx<8h|owJOF`o`+BM= z(OZ#(dSm7Ks3+gw355PharEeWOb}VSS{vWU*q|T~j895-hv(g6_HSr2>Ri1_+NoHYa@X)q?QT2cL)170W^m4F?65`Zu)dwNMC?1>A~+obk7<~#>Kkf;Q=z5(zhqp}7SD-Nh<6>PVz*#dW*Fmn z>q`C^*4J2QTWaO9)!~^LZ-$xoJRLs&@awR4xuQIwinnAgww+VAVKWfAh58${4W+UP ztWxZMkc}boIbsWttua+yDcVbl%-Y7O0x)0@<4ei<&DgdjLZBKlP#S@o>^FRc$YV_JHERHROhagNeSk*Rt7_}WRRs2Bdu zq_uO{VDxpq41We!loIp3Q@+nxw>&2T9&J&>(dptna4)_OzoT!3hED%?0fHukh`YDn zhOds(pX8>NVbsX0%^omj>y`L?wuTU~+`^ z{x&UJhn~MZAarhuw54_pu)PhWDZDTn556ok5n%_q_N7Yj@^joC9J+NqUPd<0Pl^6? zpU%oBmpQ#>{Dg!Sj|Y~Slz7W6H)ViAS~rR=V<_ZiJphM-Kd+_I@Nc+bj7bmq00FK= zjCV*ArCN_9kc}OCy`EE7JQxE+lfNJtS!e9V)9}<&&&sZKPhvRK_z85byLMEn0(N;? z_sZWDDd6(U^_+zZlJ#3AH~T@x97W$Ih>AUqC$oIhO*dNguR^Z>IzYH`;9zAtzG#yH zqPAD)GA=}X(wAL!g_DJ9@*o1eT$P);DVHHNd<6mm2zsqb$p7QfCv2gi2V(t)naLv5 zQX`lC8^}v3IV(JqKsc|)`uLZ*pctG`MW2ESg+kdlpr+q_ZzLCH;E0#yG7KAPj7b<|?M?N3s*2+h-CX3ogUrg@qA}1p!-YY=WqJ*<_ef;q4e^1 z|M^-d6Gz2*ZB{$0Z3CCvJ~k#X3N(QehZ~bku}x^R3nk3eShr^Ax%)ohkdB?r=3s51 zYwKsF#`_C-8@h|e4XLkd*AtWECil(&2qY_U6%uQZIX^duhjGS?8L2sgZEN;}4hZSC z5(L$^NQt3x)402dLvZ&q>Gsp*w}<~T7a-91lqpkLU)Ql7H_AzMPgg$TzT5`vMeTAqdI=CuF^4kQlY2y;6E2(DKW zn6!!f&l9Uu85Xa2BGj)fzD51_;cIil*vsz>pT4EYy)vSX90JTP;F5L$m&y44J>A%9 ztJGQYNee*=W$#W)-TXx6V^D?m8gL|^M>7Q$t&r|fmb@5scQE*GuK4N&hwqgs?IcL&d2)5sk2&WQaLrq?3ySFYBvV@;szCe z``bM$Y=+EdW&e`jv1uVOeP0!&y)DGPmX`0&X_D*Wp8M~g9zOc;qtpqCi;CKc^o>eK zNE%!$uH(BLXMFsWJ^SFp4{g$TAG=3P$r#QmI{_E1cqlZeQzWv_;xO^Xhr-OiJ{;Ds z@*pAu1k|GUQFg}oDWO#9#K~Enw3vWS z&e8A>Zx%MYR}ZDes~1+XFgnfoUPES6{!aQ9C@_Ol(N&R);ZKv`~s6-r62D z&7v$Ee9$2Z?LN@jFUS59!7N9A;+lI{q%yCh61>E;B}@HfmtAJ3ajuK|o_gvTsdUez ze%-7|Q}J$GSZQ+8i>i+F$Rm%K)CV}%7b6lB?X_i;{-dGg~p zCiTUuS+kbv)Tt$cp9@VQ$u=7TZlbiy%pOZdil64*JsrK0EhqF|#gZX($)xCJ2jjx)f+Er(TJNrhi2ngJR z6yUBx^-goTd8baP(A;cLpoeykPH5sq;wIc$q1UKU{F) zr%8G`1h6&3-h2Nx@lchI0F7;ar{p`B!fb7;4K^ryfkZr8of(TNK5OpWuLDuA@nZdQ z4^(>8a3tM2idQgJZMWTa;cHbeqp}p=jq|vd>T;6S{T~N}5m$|rNT%8c>KPe@@YKOZ z~tL*#Ry~Dz-HxKjMvV}QQCAr;OFNeObylES&TelvG6zF}W z9DHRIYOpL(V`0V0)s~~e6Y)y)?b|zN^=sA-_nfRkEiiQ1c*vW9h<}D^Cgi?ypQLdu zlFLAH6Ke-M0?f+Or%f^OKi9>5)0LMocI=HdgWQAh`aV&_r@ahm=^=((Q{4EEmY3kI z5_Jfzd~10^Ac?VRPX=5?raqGpMWL2I{_)QVu#wA9WP9#EmdlVSQjueT;Vvc}kzzb! z##BWFdiZG}S8VT1)zZ6IoQeQ~S-G_q`-@ZY_%2-x5UBST2d9H1fP3ZIqs$x|H6p#` zJq#nc=?KLfT&skrCz4Q7cnejgU9siWV@&c=YXAc5M^@Gx_m-YRSuG}Ms9cp#J^fs= z5KGOfJXyd~I|)w8HwH^qJ`rAe^zCqUzcFFef)(0c3OYfmU`esV*|-wTYm~w`72(DY z3=W(4gCtc$Cs-}H7aNIeW{>^$4n2CE7TPHuf>Y!EyC;Od%iy(Eu1Cgp^}1EY-n>pK zL>c5QCT~#7AW4?;s3r?Ya2X zdcXRfxgD{}$J3re0}n$!FGDdFSsD| zR7tz)Tq!`1+wrEvwa1!juCQtni1GtMu*^*W!Kv*f#mab%t1>qrI3P_@NHx!4PLVpz zGoi#Q3bk}oeFzVCb`C|zQHBjuc?j)c+1Z7(vp}lTW9j0-^Jop~R8u zN(f8@62c{yTxx|oT;hPGnDTD`!ZijwOb%967=UqAe)G+DI&ID|ROUjALPCI@iS*}3 z#s0$tVG$;|i7dqG0s?(AK#(LtBqQP@{h+=jfIuaxr&X-RbbI|DNIi)-gem}G(b6Zw z&4d3M9=PLSr5Tg4s594IL;X!Qz1ax#p^1hjC3wBVn(9M+DC%X{Ypa}wt>s>X&!4!7 z&9~lKs)8a3mDXHGq0RHY|1SKX4O1cp>^19GoBFeK@zStp{vwmG2)bIJbl&1cixsaR zrek8A)Sns#2=0vZ<(pO?OhV8egwcj40_5S;Z(pn0sR>N*Eg<21zP(woCeb0tdQIbVvfY3wb-;AkQH{ce=uv;BK z$UNxSbbm~0E;82`FQ;o=V=&HjG55GbDbZ(cZ%HUnv*Xpmb#0@Ur84lm$&=+mOuQMy zNjM-#LTKGaK-%5Xto;C}VH9dqZkkMON2@#O>NCbmz^aqfszR=RsSSbPALjz_i-N6i z0~T6|HZBBS?7jEiH(I!3kG}FW*u1><9)C5Y!I#h;?M_6p3C-F_$%K*Mvo)DO33vI-h1zONv3Wu$?jYB08{}8ZdFgl&~5&V-e_| zJSfy65k~IH^-5|XaU^Elaf&vT=!#K>q$5OQ2NyzYRV`QpT~)$SW-p@wip9Cmo)bqx z&k^|1H_D-z@h9mV5=1LSwsEA7iytz&R3D3 zo<2dnpzdNEYv!PF`rn;wm#G(!RvF3fZoGJ#Wm zPm0+&c>#>otT`&BEsNEwlD=?{=UQ;(UT<+63IGHL1&npk0v(%;1P&!JzaVLq4#!Z@ zT&T@U$K()O%KEpHs$y_SbHg!uCITn%@YzV3p3U5UL!4vLWe!Aqj;En|`w{)|FjNN+ z3VA*TBwL3`6cO+1i@-&_eAms_^b2>78m}ZFSCLF_H-L8#wOi#vER_wRlmr8f)vo*O z7WxgiIJ8kPS1p|;EoJ1YMLM#6zgD(^MT)U+AP)>WZ|X2j{=y^HYQs`MbgjU(jnu9N z+Aydmgk!H1E!aGX>ugdCugi*8gmHhoHN5ngiup9>KyF;8occ&|tOKtcQlO!S|X+yt+pTck_Hv$%=IYeeE@$dA@%cRMt^`pAo+7Gm-GWT6|1m<(ncf>2-s z1KAOZ1Ty;`aX>ik^sZsE&K<2lZ0(wLVRc?lTACCc@_o0$ISeNIs1DRlhz-aElm zy69qtbKv^xuUDDBHDSP&gQYSc{<~z}a50r|EO~t<-tdjGQ;wo@($ecR|mz5gh0RyfyX%XoU zChfzeHlBQPj|}!BUm+0?@a|l3MSrV5KieAG-ZR$|;) z((k)vx^i`yX140Sm;hB6%4G+oY16 z_~>JgB@;{aXF`f6lrOOm^wisbj*aSaFeNwlMgTlV!wPp#|D7 z{P4}s;pcga!WyMKFPOhX`n*&f?FT!(NrM$|)>SF@BTqawoOI@?VI$cO>MLY;p`sig zf98cSOTtH%g%M9qH-D5Sz554s^@AW^c856*$NSfi_l(Z^}hS2Sf#7(GAf!!hqa@} z5boT!Z*L1-o~p=D4?|X2HW~S1a#OB@2_U-t_S;qQTDc5~(XO?|Wtv=wtE5hns6;ei zRGSHvKUJZ~71y;((U7@z7pLM+s;Cs72P@O1mtL4tLZBVem0a1gD% zqSBobLl+B~&bA`0h?ZnmMIzIDfbj9hb5t{+pOHpHx5K|>RUA-s2ZRty$qXJ7GhmXZi-j_6TA?BU{MYo8aWl+ zX0X|2dQJhHir>%sM`+$uDva`sS1enj0IwzC?dRSP&ph{G_-aXsBr-Op3g;@gs-|o; zn{L)2oY=ERIP{1^&AYH%7X91rniT$Y`?#=1HjZ{m?=IHKRY!Ao+4&cQ(@s1=mTs~U zolJF+imnb9&*ZcRACjB0w$z1&+6+sq_T&*_u)b;ZwV|T|nJmmn_K2T#I^A}|En)Vg zX$}a8(TK)KG)OM60JCLfgXo}I3!Cn>M_4C7Sy`jLz9W~L0m64iABN{B77Zp$okA@D z0;hLWt4LIuEUP?#aMH=ABuQ>A@>73;icdF+=a5iwycV=aS+>8;ejpDg0-}0pIg(X2 zaa$d9WCucm0`NG&j;jdN-Xu36mz2snf|$fAD#->D*W78RiBnNA4@e)GSNuJI&{eS* zKZxhj0ku?R*^a4{Q!xUdr?NF)dhLyH?j-}m7hiuHPL-&8QjZhEBY%H5+@sU*n8O8# zg9iwl+WQ99#60ori{Z3B=gKosM`C-|u*=RnhX+(n?giD^Y$Aizy?5Lees|!$HoyG* zAc^D83Tk>}+5;AdR7leQH772mMTOKULW;j=cQ4xJ_xba5Y+^i4A6V@L90dcv9%B4|0J>GZjx#vm}L_)YJ z0R*1|Huvn=51Ja7Hu4e0>0%Ko-R-b0kMnFtekk^e3vrE96M}zO->eT>>@Pq#`D6!# zToMOTGJRugJh-S#6|hbd$?AnU0fD`Mq~m}fA{$-w2|yrG$tl!qC!|&+Z7$Q{+fCe! zs9f1EqXn)rAbEel&wIv` z?}9X^7Oqb-U{(qUPfFjXd+uIaE-AgC#jq3k|fPH$rs!t#NyMwf_{rxD^`p1!D!sAjg5coSP6!^jc zSA?AiLJ}p}O9J)j_f8ITKc5>~?6_-acj#fEmOM<%PEB=m!X@X)kG?>*r0YB!-7T*c zMS8dZYv#S%N{7fW zZ7d_SO~Jeaf*Hy+PXBoH(eRk@V))!4i4ImtJx=b?V@8`Q%)LlGWY(hJ=K=)!2#Aax zJvLD@yc*R(2Oq4{`&b!78?l;@uoANd(oz4XJxdJv&vTDsGrJB|T&Li3Lmc zx@)hy-tLLlZ-2Xo+^8p|_F#G~ruRc3Yq%glprOdwmf2|BoKeS$zl-P@|IFNwwlQon z+%RV7YYjyAP7-I3GTNk*Q>;B(^*(v!FCS?8b9L2;E|8}ZR$uoUfB}O`vBJx}Q zGcCcn1~>cE@ZgZl_whdaYm|?b&u*`H<>R4FJpn8UK>Fnh*$tlin~Fs2y725jo-jbzL$ME6i8W|rNk9Nhu~dp_vM-FkZCt3?x{K$N|bY$?Tc>CZ3;H)$uI zgplbu@Fug?uFrm|uVu24(Ut`-#w&TBa_cZ_%}0Z1_IgY0ySRpveNr7md>%kZi@iP! z*;lfS^apy=TM8>CU?|e}Zlh>8*kq}S^V57W(3&r~$m|Qd@4lPG47~l$yZSu3Ym^A1 z6Q)Cl4i!YP2t?>|@4iRn8+yd4Q4+S=Y74vPqmLw>T7ga9fP_fzy6dhvIR|2UAAhXA zq3b2O3@o@v4wWT0z5o9EMt%`h0(|DYPn^8m10NS$vZ~4rWv;RHFDzE*a(#IOjP#6g z79hMZ`xQwDpNHbMox@hL37mQOfuW5ybzFSbFWcY>mip?uaP@UJhsQ)uzf$^eU7eDf z$=KLk6lJH#ez2)>H;_;~KuHEM*(q-P)2-niMaM1Gsfgj2d=ZSt{iM_PKJBE?9KXG( z7$M9RDa;Kct_iPL#VXZ)l!s{8^`Zn*6eQ~a@5X!Yeh{u5Ff@FlAg2yT92uH!yS<(G zoO}~6>6c?&`G(1TWshU#_hRHj`FkUPV-I-s)z^*N(myK;TW+yMpcY3(Y10oZPJ2?8 z@j}G|Yb&Wl7@w_|DM>ZXYvucdFzrv3bmaHCI?UQ}sx~}64pzyrW(V*$3cZKX+egLs z5J`KG1i$*)YhjHHpAr0sMBPRSb=*TC;S^BnzCHKc!;06If7jfjTm>L-Q?3)!Cx?g5 zo%@Z22d~1dCB)+d8KRm56fPyl0DAxv!O|vx(&Uh;5QLOV*TYv#E(7-v1qg^> zRGeTGYPpk}c!weK7{KNf7aCEA5TsOY$jJoP$`*Y230ku9Y2!n{$?t%$Dm*v)xs#WeRI&T6yM>*8vtwu>4@If;c0#UMwx50c zX&60ZM0n@bSMAyR9dd9Oblu3%&Z0wuLW7OB z4CjfLu)SP*H3;BH4R?!twaVZ`uZVUj4+Zc&JIR83$d$7|B56Vg!CeXY`lP}!XE za^EQVg)(M%8BFiee?x~{8IC&YX!%7&ANJ%k)&wtHUn_jZjOpP=l@mMroPG*ST5Hi~ zTvznh=I+|X!e}$Ecp9UYTy*iJsp?4RU&L<15;I~19)rhI>IA3Z-ExUiST#Eu(6|ky zZj2groeW9>5hMg{a0;l9?N}Kg3^bRhO9=cRa^5eA=a;&Aa*grQ6_1M`#a&7yFcEw3 z+(R#iXI}m!?6}ANq5DyXhDP;eEGvaCkX6Qyr*d<;*wP||P=6tm+rrNIJnE|!Iq8d# zdz4FOszzLwsAOvuh{O-#ZTN3&<%1Ny{FOcXpu>L`296pY+Des) zaUVoBjvYEOJpaUVp_x>;wuh^Ts*1UA2u#rl{ja~u0|LQDt^y!kUZUhCKs#gag7t zm0>$wfUq=m&&8?-*+U+*%x4s`$#~|>Sr3Gp-*D5`0UvudFRMk>MueE8Qj;~u#6{T|igU8NK*wxLb$ngFC(V6FnkXuOKR=3aX+4xa zey{iO=lF$x8+z-Mb+>?1BXhXp`^TUhGnXbI*2|VZEkKZ{ifFG;gyJPD!*c?JH{bXo z94Wu`ZaeL)&}8?~$K)T2sYo_FE5*WyAvuvw&%b?p^OM$>{d<|8#3jZXx_i$5=J^x! zdA&}|r&V0{`axGIOm5Mq2tRUm24&l=l&wx-PQ#&&Tbe);8B>4G_W8{EH@5t`r<|LQB1(Zg7t zz+yY)ci?W%)t}U&$nh8YL6V)*ru*2lmpXOoSRrUCbA1pE%BGJJ18al*!@BfH!Tq_JS4;x&l2+xHV5U1I z5~tY2B?A?64q|)pnQ?Mi2>D!~Q5x`WdSAVgPg=Z-`d|99=w3>{n~R9)H{!douazx^ zLd3|-_lb!({%+|66`rwl*;Dcis80w)3R9l1@@*eI{XzKTvme90CmtWR+hJQ%1=9J? z88cu5knHjli;}+|&tbHq6k(s)#@8IC+*SH+#EpbD&K5ESUi38%frlS>DBLvSy0B6@ zc8Q*cm*J$|r<=;KOyRySKJ$Edc>2t+_-Bk%39%Zy_Ijz0pFA6;=E_r5R!hS*L(Vz`I7dsH&*7qGY`v8dSu`N(^q|}Kxcx-~ceR_ohMA*SQx!cVL*{?F43SS#VJBd}CWbCcJeS3%f zqN)!)sR+-A%&e&Gr1uzU2CQ=3$ztdLu1gChyq-aZnf->Sope;oF(+?DYK=0WAHzvheW3j~I=b z&!D^duh*W#JzvOG5FpSH7WSu9wa6;@YSVY1UV?OPlAA1-K_^9gA(ESpQW6by3@Fpi zI^%atCdDa;KJ=^nhAyPT)%gw)f>4{qcyAUoc@`vspmzB->Iy7lRdT# zn;)>7jE=aLd>rGS4hZZqcdywPC-wthO4#_5lO!%1Pftw1B|R^hCsdRIu{%JPa_?<- zhkO2fXDBm~TGFG&iIj#~>TfN1KGJm>+~rWJzHW5%??Y=5+15}^f=SZHiFSlj5jQa7 z4G0sue2#v`DwkoJavA79V}ojlRi51bT)+z;KzcKE>QuW29HR;oxeW6a3)ADIG=-YE ztno6Ok(*PIdl#ro8hHte7bhE4b`dIileze7tpnP@(0S}}U8IhFFI9kuO7aqpl|kOa zkgIbsUu22iA|A%5j+#-?DmQg1sHuVh0fc?>DK@vCFeEqKD_=jl5!sGZlc5uM4J@PZ zsKX5qsA(6)GYCWI+`ktPC=2HK67&z=Ir!%)1B5;T5iS-6rxxUuzdz>4Uu_}K52`%@ z2$9^B#_=N`C&L@plEr_wz@!>FUe_!y4GRSbB?5$n-z*4gS~LvX_BbpwX-S-gpYZ9+ zPkG`C{8MLA&N%E{g0OEnBm*nXvEl(f>F}7?D&MEQno5*fr?~r{!<{$&uecaz+aTH4 zYSR*N2Ov=9jiR#rz@1c6r$1TRtq(pZv{Rx~O=V_ImQk7b0Aljjh#%1-Iz3T|1g9Hr zAeTW!S8Q`b?$Sbs$$bKZ41$-8w~l}?O;w6)-tZ#TDGUVHdw2OV?SV>OgGQ?_S5C;#@T1aO*R=t;F9{~j75L|Lq zy1SKf`xQAA*O-&|D8O`7qMGBE+Ts0wiQ4iZ1& zvB%~Ik?Qm>jwf6VDL~M;p}q`OK-Y0yjd=|vj@<{T zVyXZk&TX64Z3PH3%wK=Xsb^TaJ%E73Q8^%#iECh?CpRhM(_=P*JYkonvK9M|ReB$e6iV-N?EgHas`A+9UbrZgZx5nn4zn~H?cFyff zop;|!7LsR$U7-P5wtSgQ9w_hpZbjkr(@s&i-5u3O;vl!#bSf^W9$vw<3&U;BAu*+DERQRi+5~D&*H>=FE0lR z*vg^PLoHHt)P45Z+nO~%sHF{6vm~rrxh^c0{b1eu0)(#@g<4D3gl`)uXBN;Y+R;um@5#GM@+Dmp6*H-xLc?0@~)pF}i_{;5K^>VrD1Saqr@uZq|Wb3q| z=0f*wpW~{=I5q9%a7sXP$k*`>FoGyz!FzVW|31yydk`t6_PeN3#i#b9v7^V83q#8TnN)SInH&t0a z&~7QzNSAMoL_k17gsLCHnRx9Zm-1;^ryC+6P>ui>r;i(RTdFvn;Ud{>r%&R6k$>e@ z2?%ikXSx+>E?UK7hE}FMz*Bue_VRvJRz=K+Oq)hB#a*{G6n44cEOpW)uj~3_bQL+R zR^}Dcko_IXKPy^jvn|}2_tE(<`sMW}Ps@liqO$qy290M#j{pbFGzkf)w>N%55GM~9@{%m;>6h~3CPP`GNVafYT1PCj_vTqlLx=YuG zuWK|6-)yy`B#dRDX|pw9*PXXg(b2}nhfqiH5zf%$z+F-zDa0fLl!sEax7rMY(B7?F zvBn}0>(r_*QWO!7)@!10WralR6!m?O=D4IBoRk42Exj2A_d7c*ChuQ>)lM0X!)~}i zfUrmS+ob!$m?1+f9Gv2>7W|a3L)UCjGi<-#|AY=od>earx=M4dvHno?Fw=1-3iZ`H zLCeR9`r?Z(+1l~`g|Ow8TUb2E9C0uZ6XWm6J#~#*%z?Jz2I8=wGSU}ce(ArL+Je7+ z-+lKrHRYcQzFM2GIgzKc-8S1=tO^u>uzoS!9t~JC?6=>(d42t?9VE|>KBC4a-ShrX z_Yu!q_CARR6P25&_T=l@Z8iJsvyXY{HgsK8wdQ{@Adp>k)>-FTF2g#KUvvUdq~vhb zKF9?KfZ@jSG+#Vt=TAiz2%mnY0LUy$L%%=ZB&667v}17ecAG2 zscv?DYl_*;)h^2NBIjq!cV1jYGcmFAB2094o$PIq^Iw+ z+sd4 z9U9MM<6=}K)EAfMDW{%h8JrFXC1!W%-MhEnBQFEdr}Pa9wFe%U=>#b`q(Pp8Ykb^Y zcU!b9k|h-WQ>Am0Gjp6whXUTS$_lkWkB*AyE@lU~ z$$B4>>T&@BuNI50FprESc?lkM7z604+TPXw{VxQBpz28JTn5BHfEKowqm=Dv$d+Rw zj8n1S1$IJl;cj9Bb?bJ#VPSPHHY$4PBdXlwo6!M*`VYT0APkc0HHI#;m^yXpC|B6T z@Toioa5p-8u3NFm_@qSlh5}OY&krgNK^sYN%WGDymzP2H5k6QEmVdJ-)L&X^D#Lf% zZWexb#6F>IYw`ooF8pM4Sv;419l;`r5%fc!#FGHKwT(uU_Pl*Kpk@f%pAOJ~3 zK~(F9J8<5QigA#t&`458tLE(`+BZ{Hqtt{%2U#z}7lbwS6@QOPMA`P0YOj_UT)NRc;a>5W{hULW2qSjkX>blOB9aP~JTN)7TeSD+ap(6@4 zNeFN%GO2E7C=t18f3fGDkOc?X;E<^x(jIvUqHI%+!DA4n+A~zYP@+0{31sKxmN=>h zIu2S+nEI5tUR@Qk^k-!|;zI1BLLi8<$GWUhz+}LVXz(Nn}_n z{=`MHA*}xpKv*n5C<$LE@p=8hyM*5zystPAJ+{EAL!+_SMkHLhNE>}^SoHb_Vd2t+ zq4^FSL%U7eoAdzbKo-A%G*_(P8Fh*H-_l+Mf?}ER2tT;uOMxv%-9%)Hb>1n?Yf3^r(*R+t)E1{*bC;U~!Yof% z%drq5Al!MUNL)-sDzk9-88fFF*8md2f(46`4Jkml;&LTfUo>A2|*7;H#$d| zi>M6dTvGL)VS^Qzl#&oC0s^i*lAG`gM}Fn2L23 zqYs0P{bJm>I}!;Y*Qiu~Gy#O6!$zd|5ZDw{51uSOgfA3iboSXvu~+pA31Q%s11y*+ z4G77GDNq6`{_(-kK>9g0gw-nq2p=pBYv;(Q_^pUiWkY~AW6R!M!!}!Q;p61^=!;kO zeaQy;vu0SL1zr5$3!$WGZN&lXtl}>6TIlqvDT8IHfB~an1F(o->SB5dmLBIjQpKEeTn5hiVYp)!r!Ypooa6q7PLs{7G zxZT6ZznmGGx9^!T&vA}??l~lG(g{3WaR`xF3zcEw#0fHZu9Vm36f5OsQi(tTKfJD<;e4Mjp&d3P}QQf@#_B-Sa8=tH=I6PZh%|#@HQ&b=pTKX6xK^y`c z3HMvE*FV@jv_lRKqI@foE4BhcTH``sQZb;iNRfKn z>%oQeu&L>=-cOehGA-lT?PveH_{Z4-gmq!n+T~%v&(iaMmW^hCMD^lTq1Ni6FmGj@ zuz!y}VrHfaR3afHBUCC7!TK+UU|6bTmnE~G3#BdUhn5Hak5yqRmT$ej3bD3S)L%W( zwMXz>qEO;59(p0PlyuNx*PXQK%8VbdMT@2~Hr5y5=oC$)qfBo}oEe`V(XqYsOt@5~ z#!3_~QHB@8lB?Vaxx?ODhnpu{9NKpB;ICX4ZDUYN*DfT$rk0I0>kQ7#G&LRvz(#fm zV9z25$qoy(K|O{Ycib^&HfnVHegFLrVcrkQ*wh+i6l=>6&2uA^-Xu(rME|Hro0%GZZE!kasXyLGj70SOq1V4 zBTRWIqhkN6GpKO`#0m92ClZUzXWELLDdVJimU?`8d@6hX@*k!9)>t2wtt<{pS1q#B zVXaDEU|cUNsjDKbH540hibQ>R6#T5T{@8y45(`Tzt8G=7=DzrHSW~(-wA*EC>AQ_2 zb}u(zYt^cCXh;b(EV1hUeAN^9Vb0f~lfblbita3tulKT~mE3(#gNswi}24oqAd5xWmP^=rb3)jcCT2%J_BaY%iCWA@%&!v7W5eBw5erG`)WFKg0KPzWI#cliK&m+r+-vef*@BhT9C% z?N!`E)mgjQV^Z0_e=#6{e9&LR&f`)-nF@BEF1O!a65H=KzQqUt6u7+R>Z=r(L~>JV zEo1;i2zT6hXLtv`#bnSZ(1F2`)Z;%YHyk~km~TRgdz{og93(=})Ii$ArZ?#qUwm!G zsW^DJh)x%67C}ZnIfbhZoEUf9F)qBV_whg#x!Y7cb@+(ErpMYQ$(&R*%{_N!j)A^K zWomL3NYSqB`73^$q4T{YES2$Y*_uUR-I4~O=At&CUX2D}z1sajlG(2N9A-s8<5;^ytTdYdE=u!42v)w*sobn_bA7HFmx?=B zwrr)b3^i*ebs?z@xLOj%dc`a>YS1{R2Zg5IeCwrfA%L)SWg<1bz-ZZwz$Ar`dtj0qFblhKe=%;-*|Q%C z4~w4Op{YpBQq3%wiRjF$uDV(gngTVFx-{qAx^)eQ9(qW!cH+|u=}7h=nU(@D><&_i z1Cwx3dDRnw(|YylxxpT)!p0@{w|*fYK%w@vB@jW7g1!ea=T%n?mHrIJ8@UWmn+Sy4 z1foX^UDg822M8GMB5xr8gJEdWBwTx{uzb1g{u#j)i!t7;G|YPdYgH0wBJA*zl`l@O;t_0QI?3 zr;b)3iYm;;hnMGC{?kLDPKhD~wTYLlkwI~OtI%l4=AluYhVqTC4&Rq83ES?zmtHxY z0JCt>LW>-2uAF_`T8mV`rI`}RYRkw8Vad<)=V^nj6`Qko4K)^={542l)C4V@zg&y5 zSU&x&9Au;(pr-=>_3AZ{BvM=8urkb5u~vG$?bh3;RiMn*P+KqlQ!0Z9NlN9ph_M;a ztd$C=>NKnw{&&)lu-DN;#I~hEElP=w>AwIZRhX~|kf=0W_JEjnPa)nZ7P?%0K7#T? zoR;5s?qB|Ln<_WmX(`!+xZ`D*K4Yqtj3ab;$&#fh@VQJZOX*yO*v^K9-$y`-xeUa& zI3$%?aub=vsp2k$V9qZ=fsA{91wi;lfIum?6{%9!!-owr3bmn@-1JOB-xXA7v|gAs zYno~c<_84o_GP;E2)U$`n*qXw7bWb@yg`v-7X%31y5$7~>PV0;5cB9+aJU2EpR*PU zKW5C!aOJ?k1_*8lEeepZU@5K)5Zp7NF-V>jV;3MRtqc%WE_^Q3T>FDgbzFwUVa<;% zL*wP0Llc!%U$bsa_@Ty%u!U&JYG~sYVTD%vRBoQHEWNt2Z2-P&*R56s=SBhqsSY~v zzWweSNmx`NUL@CSyRea@l~rq38JNHK_Qzq)O47wz8Hkq@FH!(jW0i($ zXkffdISrhcwd>Ti1xs*NWEEhGKqxX{+^yj+N;^kTDM>OdEhkRFl&w0b-r~L2h8_0m zrT%;`KTk?kbg{jL#UVh@`^y2rRUUqr)7x&lJ^b~KJ5zQB;t)s% z!Zy}T@f5IqJE?D3lHBC(()7~Vu-zKf1?GiZ1_*mB^k2<&Ircc!B>g`L2r~Z2%K#um zm4VGSRMn9X`yg2*r`@9F^j`z13^V1@sSFSX4jN*-g)ywRy^J`NJ|h|E{PQj_(20gE zf|-af&vyX`z5Dbr3B^G{eIxyO0|9|JgeQ}P9zX$?QIrsJfeY_2WC#_no;4|jao9vm z#z+Xc3Xo>L$Lgi;grXH6gk=iAS-x_qB!t$X@v<#LBg(t0-LF>_hfQ|bUXlQ$rSKY1 zOoWo|;&IT%iXipl&p!wNie+i9uVkrup+&3aRt0+DLYR0;w6V#5pv2sks_i%@Y`OWC zp@BdL&%%PmqPADNEktfoi@J{LASX7Pg*F>0%C3P7xOJq$F)b@)Tz&J6*TRig4GZ(W z`O<1Z)^1QYG;AV+W}BvAyZ_lZ9DMk$VduS%4)vSumMY~Ism>Y0v(G-$C4{j`ZX%W0 zjF`x{j zbO8{k+=QB`ejO(X;cDd{{8vf{+16zD@uqbmid0^!>N}CIj^Fj|)62p?Z<9;sjW^z~ z3FY(p;*o=_!3k3Q%5Lv3B4T;#&9`hJu&DX&HCK!6;iU^+_pSsR~IZetZ*!8%RIwNaeS`(7ZvB5W*xst>3Ltmcbp7~)$+RBcYNG0A>cRX@U3y%|${}Qj8eIc_DO0J2`ER5kTdUl#4x~KG7m-RmaHKKJt zQ~Hmu#Gl#pRIzVyVsZ^!c?)ma^6im`X&sb%3Du6@&jz>nd=`9)dQ11jWRuGBEXtHZ zy#D7WRWxOu)P_Z&WPwx$0HL;G-zA+uTef(OKtUpT&87`QqvkC_WBJ2vOk!@A25FUS z0Jve18hkW0UmC|BRo!{9JPn(7+B`H?4gd?e`3g+O!X~AgpzkJzeg+Yu~hf7;yBC zk}CX=u=&ndJ=iu3yvvQXf1xTvY(_Kwt{F=^A2{TqUW;qA{JQo-C09zax9y$))<9g> zG0Di+h4(JkI^~c{Znr+OMk^!k%?)n(+t2J%_84XVyMS`=KCo0ef{8Y6B=ppsciKsl z6pdPG5vtsV@`DOlC`qshM!ZTDCaMPe0Es-Z^X4L5X`dR@*inCZ(ovTN5?%lqx7(@u zj*?m+mi$B&aqwB&l<0Hf19n!iQU{FKlK&+F*_=6_nw2{)9B8q3*<}|abA9I>rFmz} z;8w~RfM7FzHxtPC8fCyU?_mRNsVYBhrH?Xh^W(VbbDp#FE<07ooXa&)rE8aj#os;< zmah5P0HI0o7NLoZigr@lPf=K>@mL`{z-n#yMw@IDnu|98f)dL;NLC<`i?%IIcu?V3 zo&2~RQ87>@+E5xkahoDNP^4wCfT4BEHd0YkS;!Dwt(oBAs>w2CPcB-rD7>o}kT<`c z8&<0yHRJ-V+o-94fUHO!PANL>bN4Wy*zcG_LR%R+)CWJkX?R~bB{rd+mw%=Me=aDd$io0b`hH7KY?yY04%Nm;MI{<_tlj2D%jNW7Xi z?+2;9pV`N}17ksTG1ls9lB`xs4U1l?c3RU^iHdag*~$s7V1Le<)N_cB*jg3S;F$PQ z$y&aAoj!i|-FLSnszR=U0D*>JOtK;+$;7gG@40K7MY>gbIdGP{ESEv{fH(*s?-f^E z77!QnU2lno{SqtG;+cCiOR@>oo~{`=%7|DP1;k5o8ScLOP7^b8U7SAfCR+99BrUa* z420vy-=j>nufkbppPTUa`>8N!5K)JOAy>Q@_)nBEM{?7;bz(!c@$p=SqmMq)q8p!j z>Y3z5YB_Wg_ut(nSyWc+H9l$8lJ~<8Dh*#MKxn$Ob7-6Zf=xFkkNza{Z-Exn$|eoM z#+^0|4aq}Dq=bYM#We`-(fclti;Js~+`m6bY~NVp#iEY(awLV7;zJ~y8M_1HY8yBK zg{AUj00?!Z0)F??+%R|E2cf7Iu@CHh2M%gddXSkf05;B!zd2AqxwAdHDzP`;I@l0E z`0l%TR)u-RidF6+*1KGI;rZem$e&M<>-l~V1*1Brh%k~CS4+9ZNxULi3it?5}67KAKp|+$A!m2xU>XdIt%Y9xjAPgKh#EfHB@?AgeMVmfR z9PydZM(Q|-jrS80(lvjgAz8e{xYEd6*Bys zkmNF?$u-l-O}R_C0SF{S{o_&PKO`q3fIw(0=-S&7mB`00HFd?9jB*+x8FT@HB$Qsg z`ljjtBJK?pucUM34^61&oDHXAM(WA!gBbQLT~6I29pnp_E$$ z1p3uQEK667P~|47Jt^$lB?MBlYgqX9uf(b7Cj*U>`uh}skSLQI%N!R{+o~|B+;;XRiGc8y>J46a(Iw{AG67hp;((-b6Uj|fZUQW5kKiB5vJu3R zt33dLfSAXX{}45UjtVuNA`(vkp{F)?v^{w2!r+8Lt$cJ|6np2)`7A|;<~0&(7_TJR zjt&UV*f`P_Autm7+` zl~_-OS(}O>$#eC5%fcZHb#no7Nxj z0sNq>NH#&+Rtk`kU4maOTed(nW3TIA5R;QgVNE))Km5NM_1cF9tqxQIR$(G*b=Fc< z-;HYrKp+PJ@)uJ9^hTG6WVNSG@9JE!J+csQyb)F{51%J!YNjfZp+QEPnVVdM7O1arR0ucv<`=#=>)7m=D>YaKtr8c(#!mzxINd^e2-1I|ALI_5? zHX;KMA~6v5hzFGdj@nYlRe*%xfIv*av*OxkH8L>72i$YFrx+K0xvK}20SUpxe~d6{ zum6B6M8ADp18cN#iR6QLhcCbUO2JGqm06w+{cfnzxqttA(z$a3!Y7}6X0F#&I)OlB z#L~fo5|shh>r?Pb`UWBYorI|B0zw?)wW22ri)8s;qM#oYbS+gR;VO;ALizYN+hHq- z`YX((*jl+H^+kK;0s?8!G8oDZvrI{78>wgtqGXfkxtwiWzqKE5v7LH(` zp}2=1zn9y%vAO^1SahU+XSKW_^B2A@l9qY$R%m(D(lhI{3pMJ9AV)tnYBwu zeL^RTOut(ygnRd0m3EIY1!|S*GHKp7dmCS{iAxHOyANbkG;!8`%EA^HB9+tvz+fOG z(u`l$RjTgJJ7e%9pd{&3@(1m4?n=H>7f6 z#5Pq(w{G64lf{Jidn6K9vTjo?ms9ByJBprbMn$=_BS4Vnv74%7*AU2Jyre{-n;U}} zE;*gK2RFFCm3tC)-6a|oUr)$_e9gCO+g=7jMU191{mKm!;rqDrqYA_*Ar)hYjL$Kt zQ2$38d#LREuVhrLeA)RVc;uHe`uYncE6-2G0`+8HtC@?=PpCv)P7Qu_+KUF9xU_sW z(n%xb+w#mw`!Pwt7YQHu#QP#F=V7pSO-H_!dybDv^8NJU&9{l-=NrnflxwD($=IQ& z{1`YzyO)u7$;Gd@==s<`%i4Cy=839^4_Mq(-i99xo~-0sV^U*)bzB`~Cg9u0~c|AHL?RyH9e? zb>fnD;E(g|(t{qn2Z zeq&g~FAjhI-h1;t*#qk;5J6L8$J{8fdz~#@HZ|5HaQh1`JA3Y4ZY>)FP^>XdtW(z`XbF`{LR=(LnK^2u=?=Bk7QKz zaA)%}$S?%^QLb?3c&ejL^;XUV`dl3e}QT+}G&aRGLmX3Fn{J&z^Ii=+NTxn=1Nrio%fb z2IT{UF=K8pP_VOAo2w;^Nmi((WnMtAz6r4WTy(~yhaP$`Cxseg#1wQnzN>i|FevhKx)_!&yy$$n{$xWK zJtkF=8$ciwo7|RsYq6^N&HQ~_i}$K71N3fOt_p<=qhhw)RPhPF3=q`b+_?gTUXj0GIlEPhW;!g&IO(btbj=+JDLn$*W>iTx+nWt@uY8#M~u^;;*Y z+@x&BJe8aH-e~o0>QoA~xXOnOhf;35PcBI<0>T}4-j(FYcuM<&0)$55iKqYww!_@* zIOfJ1JY`#_4RHu$@#1zoUfG+t5CJhfUX0r%GGO9mfK$=itRe7)Q*lxjh1!PCd?p|e z;vdyt4x0xbn4ZKT{HlPE-I$BmUyIR&%|Nh3JRR9Um8Te&w-uyxTz%YM#XmjU(e)sV zC6gxITL~a!w`E)1?tPbRM{T;e`PtlT)MJjRyp$Uo6+kd461QXA+}Sn+#56Td90Frt zc@~LH0Z=4ZB%jLQwH?p2Xfu~Y?L`03ZNKL_t(Xg6q&8 zOMXf{%ML^|J^5s@Asa7-hq9k}=9wZuJ;(03|9&>A_Zv}u^5jXOLj^$a-y?n=c0#NUInW{Eh)>Csb{ z?J&1%O%m7P4L9BB*}eJuf-w6@Bjjx=o^ul=_~)5sfL7*3lL;OP@TV#s&KPL?k_J0 zs^q4=y`^)z{+wIHk3wC1!NdrnLI3lgZZ#`EgjT#{bLH$`t>h*UyW&FN6BAyuUe??D zT&M6zMKSVQHXIv-zQOOGt1X@fbr+G3#IajExmG~$J|t^Ze4nU?LUToe7pFbwkAJ^+ zZ)_F&RB)rliNo$NQhNG2yNBSNTA}9|XN3I^pvrWv_sYz>kK@OCRsskD8i1ONOG3Y+ zVU!5UZb}=UIB{Z<8%2sY=ewl*SlW^;K70mBWVM^T?*bea3T8!{FJ3w{Yahk$G$g z4hWMbO)=>*s)yJcZn$A=B@#lJZPeL+n{9pOomwhBgZIg%DT{MW|DJf_38@YDS+X3T zHhBUdU}YvDqt*{iLwIr7LOjk5!e56Y}XHz6J{>>B`3VK#)yPxsirM;>{^ zfmD-*gN|5~F=IyORnIauj_(OIlE|$4+{2ZRLJc56^tbu;C6WS=TyyQl=8{y_ZE}>Q_!Jof^QPNVo#TNY z?kS&WmtNPE0YcS6z7Im2U*^r3%hIDmRBWMT;i?1#U-Us$XFgH_5i#0&kp3N$fpR4` zWz17fk(rZ+DoB}&5x*;z(Dzk^$^7;f03~)>iLbkSBBoIO6<{PVqiDU7e z%)Vs*J(oC7-`-SIB$0W@hlIJ(xAyJZD!FP-67S&X3*pP2d+u(hFp-pehUJ-d{hoG~ zko8j%@4$jVD5!4;=Av@wK3yD?B8RLJ(A?J$|Z?>V-&Hk@*~6DuGo<9jl;6!Ju3^HBo0>= z5R=b9%si4g`K{h3F7~>z1Mog<`qz}$Q(|T4lb8be`J?D<d6{<*u~Eef}WB`PtuJcnGM*dF#6)(^=|*r(zVNxQ$@bB~mS zUDUMJPE%;NLZ=fRk z5HGJ3V-jvHA0RI(OQ>&ocayhA>;osyFhv7C`q&dTshmjYruW=)cM_>s`6-$?K=h5U zY9bXalZ=yI(vIaNh*Evf;Nd1>#|wg#X;Y^t;N%MCChGS`n4ZOjAecb5UD~ zWNhk+bs4;`{+KeUT8cWn`6ln1)z(zOmudHf)*^ACYBnrO5fF&-y-F_QSVRW(nBQSg z#RKvyMJoCr&_M@;XA^x#$xX7xP7sq(VWG>sAwM2lz^0@88{GE}=4DoL9Y7c$qaut+ zo~IrxLJ(_gdAFnM&<+TtG8A5IrQD+LwL^#Ys@!zX1_1(I28@dIlL@6@_dw-y zL=Onh2mPs};|4+i!P8NZW`+(Os(X%*{yxlf;aF0M-~tFs6}wC=(F$f8;W-;p^9LU^xac>4^2yOZ6f!Do#^1YXBi8 z2iBJXa;iX{L#4dR;B(G}?FAPiwz)E8j!~$0#`OC`8`X~J*6k!CxgnIF1BG=%oW^8@ zL;q2=98iOJ9{|Bampf(*L;gduAPIq%IO(2#=DB2Y*{JOm`(J%Ph!VnCXPslQ|A<)_ zU#?VPljFJ^Yk)vN3NOiqXs4IQ?O0Jl@PQ*7b@*^4H)+!`*hmZ=lxH!)`c^Tysj?;M zeG?$)G*2E}Ryi+1ga zCn1`3@iy`>V!Q-+$enkKwD=wc2*)XQ;X1{<0|-$}CGiTW0^RWV6X5wPwtYfmYrpf( z)w9pA>^rRA4hW@^tlC=N{(XSp5(1oywlVd-Y|;&p5DXCHLi8$3Zd@i{=zf7OEKVn$ zc%p1W2`P_$$1^q*5S&8oZtFASi;<7)KsYJO157$}d6G6AaR^>erPP?3XC%o@kj4^+ z;PWj&kc2?|##F^_xbf95%HmCxm!Tpc#NxU^YnXTkv4$u4L$zgJnhqeeX=l}|aBo`e zPK^;oj>vXIs)*^&roQS~56+$?wWU)6XqBsv1p@*L`zeX?j;tk$1K%V}Q2KLqC4?xJ zQ|$@fIy2S@c>#puB_WVz4R0ZN349j`0hOU*V3JP|2uX4i5<)cIkl&vMgj^7i8zCcD z^^rSpy?p6h4hSSS9c?759tmf^k#D!7sSFfw>5YV-MM{_|eRmL%njxtIuyP}-SeK<& zQ{)o~!2!Xg3ge;_AP~$%0Lx6dzGB9jXGl&oLmxp#lozv8MFBv#4{;;1Kna-fKBH=> zXsJ%re=8uU^cjgaQM5j@uL6@K!Nfl0nu%PW0l2sjNeDuLX1zJd>J+1W;}pi_XPZt9 z^y`O&(02nRgj*9%MfaLSPQ{8UL;B>7fl1K@hV+71j>>TS@h7B+cjy~Yu4GnH+woe_ z`9+Yyi$VIcS8mGm#-+o@Cr+4bk_f&{Ha&KfsRG5;DzMv4Y7>$OYl8d9kc6ojPs{&n z?>qqSs;YE<6S|HC91sSO1S|cCSVs`Cj0I9?AwYl-Y62n&5Lz098VC>)n$#pDKnlH! zsEmjRj{2;l!V?fsacBd=2+8|?Yn^q@zUQ8EOY*nyUM|Mu|G%f~vi7&vUgcZooO`ax z6Gu$ic+*WcWJiY1Cd#e=fz8s5V;B`pPcow-1`f_c=_iDt{JRuwG2CHB_?N#0lWD9-+dq(X9om~b^`~p17_W?nAfT{uvoDFQ2EQh7u%LdP6)dX z+PQE}5vH?`_ezkbjIZvZ$_W^43{r1S zmF2sbpJIsczsLM!$*DGiyd&J3Wp^O5<88~pEgSQ=$LBsn7MBG3f5yPG2{ZZ7=+b}Y zl)$jqwS694M)_2^9otQEF>YMtvk+q)ZEKRaY?7slTJFx2UA}nEC(HYpaOT%zN34}nQOM*Zde*h%N`-5OV2HQSCrP_Quw z#Me`y*s2&esjvFe-sLR=tV{OMw`{KYV%I@h6ycToj!0-9oc?UoFrnJ3ib@hT+y8k!X}ZIXjs6dgEN zDl_Ub$4%Nv+ps&Gd+zicFv@aTw@~^0v$E5iprXatYvKdt+LylcrQAM1r}Jo)1Q4R$ zM%`W;eKQc%f5WDo6Lr---J(po0RX2*=+ieIZ=nPt)%fNAl^Yb%V zBplC%jR)o*+FYLW2wis11krN{@DkDFk5VqfXtPyZBg0()_FGldg@huGN9E^5Ur$%m z8wo@vyc$?a!7X02$QJFeVZ&9(_hnO80egg+^ZglT=sgNu1_0B_060RILw0!2?YG@xF1~ITgl{cNjTjdf z;`7hH=sXwd4-8#z$+{@4U-y86%HJ zO_E~B)&yIrK!n_|4*s<~TQ_9VO zOqIfp0ucJ9P)n>UjLL8-KK-einyN(hw4p1bl*b-gS4D8{SXa#6KAWY&$?W`e;vX@|XhE29Vov z?i@KEW8s<(t{Gwqrc61xajO8q%oPR*ke|-$ z2@v887$mE>9r<06A=xhd`PUYQ;2MHdU-fl@lEQ|_^;!oaL9R(8r!83hmum>7S~u4j z2;S@-(IBuMqM3`yGPVA5zD zl(`)_hRm0S5XTS-!I0dQq(VDX80e8CoA6(C?km}rSgvLR%G{KYSPUPqImifWrD zSMoRW1x)7R#0x!TIZ(aV#m>(Y-A8V3l_;}m={mewP%@TVuIq)ZD@6k2v z^k{tXrl?v}HP-yjJuULRC$fV&A2BEq_36h}H^eoAWja2^NJW2Q{9>%rvE&`@tq2XF z`B@=-xhj^-MERc~J27tYJ;SteR=LUKH%r!vXS+wGd6OwW+xp_eoXbPE8bud?;OPA$ zu@B)-&*sy7>N4#>|x7D0)Xxn>b-92rn{K)2+(*ev_U7YJ>`R`9fP(Cvvr zQlh}{*J71N3oyG!_M*)<+tlJ6$^vJiZ9BsY@{D->MjLkhAMpX?ZWMyB9IeidRM-PZ zRPyj-k9@?B42uxal4uaToXe?y@QIIq+!n)k?*FcZd>e@A{~^{KFkpajGEjIoevd7L z6!h}^q%G$?cso+{A0IqzxnJ)I`vz?oFmOQQ14`KHR)@c z8wXLQKmWxqvQ3VFp;e47j~E6Q_Rex0{b5f3{olW1+8-a}bVCudZoc_u*}`vKCukM- z-S_XF+>{O11{Qhy{iguCTs=x1^4o;SWw%rbR0gkFV+_b{Lnq}ttn`<=d1>OU(XFS~=$ zyJZ9^%rDohq0EW=$SJ<*Rzlbp$@4iHGZB2g)VhBy)h`%%?B zy|$U_X*cQ0BLoP+*TC;EBn?)!<0+?{reqla!TU3Cpu(NydS!>(MFzrWvPWt8=%-6zFHlyOZhX6l%kbb}ibAePisAU;VoR z0&Pj%j@CA92!}Np6=fu~F>W;0k)7+7TW+=pTRb2yzf9hUZ&pXDFZ+ni=%R}*Y+Ni` zm#<>?YO%Q6Wjm5YhC$ZZk5tM{HkXA91PGAErsugf!V&9)z$_~VFF=S4MF0UWLmh_! zfIv-Z7l-Go77{dZRr z#bQ;c#RyYHhla>>p$>NHhXaChDzZbwPGBYDWK<*OeUShmYyu>}knxFe2|=LfuJ29_ zEd~H#-^O$$H{rK-h9d&HTu7^O8A2sIOYf6<0Ap_>(k|00ieLo2OV{BA#&VUX(iY40EE5w-rHEdFOeae z0~q4~AI0_8E4fMFSf1-x#B;Rh00cgW1Gx;YAyl(Sx045sGvq%IrtMn8l1xLG)CLe< zG&y)m6}){t_Ol=`48mwHWWHiMqHVar7pp&1`R+n->BNUnBy^D6L>z)8Q)u`$AP#}R zq!J*cClKNg*tuPW>u<$Z39MiMn~h(Ysi|~&>9qI?K$v7vT@kkWF4~qI8Av*E)b@9@ zV_l9T1MvZVxeJeRDxy{JyKDlQ!LQZWSQdi7k?10URsaHLN8Vw9Ns2=tm?;GWJHIRa z89*=%K|wk0c63dEcmmR&@xVaQ6`7bE8A!Nk3kW)zKqnrt802OE5Do}?W*UNIK+-ir z^lszEq9HW9Hoc#PoYV<_%w;McF~p)!cJ0fWWbdh2()rODr(ypo0#O+tIlj zL$!yY`L^3`Ri4Z5<*GzOAokyPbvrUB@#vxpFH&;TrM9s61MBi)l|CbyvTQ?$CISe& z%b1b${T-8s^%Nhu&A)RUW( z5T&>e3l5X<5gCC+n(FF(00^$$@&^W+XH>b#=btj-tE+O;RxJrcY3DI+5a1CS18DW3 z4{e>?(@DR|R$wxUMqEZ~{P#53x9xu~wSC)2r+G(Zg zfApi|yMDUoJ?7K)d+J2K)9;)6%6S%}YsC1|7OGd#HWF?y#_~JVQjDbkYpX479I1l+ zmn{CDwvaqS=INtK&?yKr$n#j$DnzwQ3gbOqWYnV$5x@_Akg8JsRo?zbS)PFhby0z6 z;J^X-Shn^ymh`d>P+F8Ho?W#dNuu(^xCm8;mtrF`#69xJqkgVtzgM3CHrT1q!hR^1 z`Cp6!(WL=jKAI#(NI)h&j2C6v%O0mxuHk;5257bzY>c-Tt28=#2ogCr`-)*%bX27SdNK}E7YtK8&((69!-ma*x&Q=^~JKXpnP ziQ_{2O$S&6PXFY?N8>rSGO+wU774yr)Z&!zvdZ#XUfj*QP`!Xw4S4J><%#8)J_f}7 z`?m}>V^Ho7-(lg7{+M;!8tDu_(Vui|q7VFzT_a)|Vp5@NApu?#~};m%U>Ot?*YnWRqbs8dVx!O3<`ex~1NN)@wU zCOg0PHx9`2lsrQ^ECe#nQX}_j|E0#_v;FqlTcjDTLZ3t;JU3K)`n0w?_r(`~P5cgb z=Gqxy;%8F_K;w0|=(wI$kyjI1Jr84G)Yzy103ZNKL_t*FP+6GkCcIanqOZ@YK+9K; z9B08f0g!`rMja_T0>Ngt-FCYfA^}8Fe`m}%*WORw|BElex(wS?e-Wnap~${H8ejX` zrH$KezatMJ=a_l6Xw2>WKYEP05PdN%ZR{~@ce^hDGM&SAs&~7&Mr%0Yh$D^bkal8u zhuSR7H3=|DpVOOzD-VSC25)-nHU3jI$G(18yzGW7rYmsYAaFC( zX2c=T9|V2_1@~Na)s@Cu*!fc+6Zd1uKk$HqR1fkmS@4B3Chelyf#Z!rEemtiK%pVP z7PKs-+&Z_b`zsLIW5yqsGbTA849o$6%*7~G&siLjRVQW@V^XC4YC3rhYJ)FdLhOpgN6z`3vRXrAq69 z6SE3Y$8t}`_sA#=)I9|Mu(MX#Ul?EF5THH~hxtF;&`7l4Y=*G&+Kq)uZ5ImiH)m2xPn{Kg5^e_egyzsm@ z6*Z}Z-;NT68VmePB}C1W^`C{ovk2s&wj=!+G-z;M6O(ZrEq=s<4?g&>0tncrB3l

(^8b>J|v|H<1md)p$=i7_}{Y|&3X`Lxc&qUFx=0;rZVTxVyf(ipe@kY~VRxAhK= zK;zXPFYubS)mv@qrFN6=eCPiB+jV7iKKkgR?D?lmJ=K_v{hZ#gI+dUO>}Ty>03q#5 zcvsSXrQ=g)v?CD;KRf&j(Z(Hi__UFb5FbI?NY%w&vbrqmFlO^CG9h1n`BiHhpD%vl z-;BIvfl`vGTohCDmbbiFb9#&c3IsMh$M0Cu*il7-sdiMSA*2RGAFpBztNOz=WG)hf z6_$K%!L|3f&wZvOE6I;03(Y^bdv}%Wq;0$JzV9?eg|Z@dwjyu4~^I^@1XdFike$wDhB4|+F7rt&1FgVzi$J}JHQCk%z& z2bZ4m7#SF4opdd~7{98vHMObkzU*B**~cbEu~pqn$F3|mRaWuP63W0^H7V&D-F$nB%?ZH!WKk|`n^3v?x^d=^d*oE(Z z|6vb|!a$@!+C(I)&1tHxu0su04v1t6?e&1{2Q@sCvNLHg_ zG;tO0Q7poS77Fc&N)Amh8A1HXv$+SRDSyuEMg~L7L*0>u=Uas+*?4T{GTX;SjrZzZ zkbXY?`0w)J!JF{0k3$x^y19rOOVdT}6GA)+T4B(QVRwKql?1s|i)lCJG1kl})OX?S zV*ZHJ@0ueZlM(uatU>$6GZ+izFUWM#-Pz0dx%|Y3<4*8w@KrjN(Keg8lA6KK;kiQ# z9)FCqD-GEza=*soNxnl)bCOk?H;+tZPOHMIrDR{afzb2z9f}&!i0&&m=qI@K+V%Ry_p2IJuDa?A@INWPk9+& zKPrr*6D=XixdGEp00NV?k0K&pQC$WeVuncFGc+eiX&xW$19&Jm{wJO7-B!^MX$%x< z)MZei7Ddp7z!9lPR47l`S%yf@OK=Sg3N`Ml0|bnTyNeDjav5m<-bw@-E6co9jHcwe zb;PN`7pvSjLTp`4I4v0+E`w!h{(KUzyiaTC7&uQx#SP@P?G_NYkNa69JBwurpFSW; zu-hTBI}p0uNkg!gCx8HV=K=C|d0YqaF|M8ZM&q;QspY;PQ*DcXbEGZu4II?dYvUe| zICMEkzsJ@DU&o9YGpy)}LvJK1O*UHnvj{^r_q-PXB1F21$vR|lwsN3nR z%XIleJLvetNs~mCCEvKIR{bow2@v`1Zy&crCEpo+CnmfTPDKFWcKODAqL$hq&zCE# z7YenQ1Sr(VTy!D}&m|x^g`z8!sqNTJ5gtZL_^zscZDvi96awJu*#F0j?m&h(}+mC z%_}!n({6vg1kM4W41T_<%*$Ya;0td}A-^PLtO#(m)5HX3(#=wn-u30#ccwS6=V$P`=O&mug zDse5Di<2bN%%?LZd5J(Yt3_7Yy)_Kkq+9o1dF5;??qW<}+@tp0a07)}HtuS4Is!r< zC4fMome^6LpE!4JYx;9nZ>_nAcR``%Y1Tft5rYI1>)#T z6*r*jLE2}DuHV0LxN;yI5Q^vXE!Xq>J@(iuOKx(|g~-+85CjO)5F(g}$inLt`=4tF z$+8TMfY^nrEj2qdgtwX7u~$F{4T0=H>VlGk!B~$`5ZJ+rUnt>Gy(pFd!4^*ldNu~! z>@_!wbpDvjP|xEUCqebG3qTI=D;nWMHqH0;mq+Oo8Q9OUd8#T#k@K( zkVmC1$~A=M?#0+%aphHJ5RSC~px0W0@(tuJ8`AQXg?bYqr4lwA{ z@v3xWz+=Mdk&19CLI7H2LvRgYvbh6o67(NuciILZ9H4lIm^cwekq|7vCdEI(!fo%XXAj(fldu zSYmg8U=(*C=TAOFM6!F&IDe+q91MZu$bh?+zOmas|AI#yGI=AFE`6wW)B+Ivd>lf> zkzudB_c1_lAr~Kl+>VDIKE}K$kgQs52z>!t(sc^XDkAQRT`-=9fL^x%Vpe|#wGaVp zB0anP#Ip!8g6q)j8yW-kiE?&56?@G9fg{8Ia(@R+KW$0R`1~9@d9*XykpgL9gK*Uz zIdnj1)>%?J1=pcnoOPXa@eh##O%$xFubUXt{2Mid{qTNNi zX3v>pAmTq0NxD*Y%ou1tclvbH5CRZLn0QvZ4CfwRMy&q(-~axO)sZ?iApM@_k~Bi- zEN34dw3Qp1im@ovw{(!>$N*Ci_t=E$4^e=WV`ukevBtbGM39Y;Z3*j*5s&6&=T|pF zpr7}ecg?y!goZ$zJXGxP;rV#=YY=Y$CqW$`5ckhf!>a4p&ftkkmQ&yKDF6XL`>A3$ za(At60{n1YkuB%dtGw-;H#gmM6BA6TZJYLz?PBYxej)eO0RqPu7=c{lvDIVmKnuWd z86>Z~31HfE(+?z6=Y>%*G&9cqRO9mbar(3md|;EFk7wKufd1^~Kg;Yw&f@?f4pp-1 zatT`IuM7zAXk?lIZ7XtVd@N%Qi6%@Lu3V`oYy)AV@mPoAt#ND!nl}Skj(l3Igyl1~ zMG+zj^}fS4D8}sZ$5p+`=G2Q1!`_wV_QYFaBS6z2!6|ut1D3Eiy$Loa2mW@Sj(|{f zELAU?JKOdRJ$xA`7pfQbsfg%|-<1I&9`DOA{nRaLHy9!Grix{^U@gafzr3}kwJ;zI#5K4o8MDqiI4eYH>cuM_7-bT9L+*QvS#T&A2+Ai ztDEaY`s^?+eppC z03WMCnmySgF@2#^(8!*p4F)6dJ>PH*mNvz>Ft3oAY^(Siug2w1BGaMsAm76hR#(A~_lGqbxM^r922VmQ+ z7Sg3kH~p=QuHy|9m{=z3a1oaf_)-N3bwe5Nyihs%BoJldYdiCd^Ui4kh2@f z#hp{p>m{@b$5J~k>`N7sedJ&gH6t-MdxoKHss<1ma%TlCgvlEX~`LxZXN*{oiAyfT} zO+bKf_L+@Oe|r0t@$Rg(w6>H`{k;TqaV$uW5N=dFH|M3`ZlWlsOqrYk0*zY%2+K16 zUENav!ephSy4#VRWaEJYWW=GgJ6wnRWr<3z8cxQASOEyUkmvn8b33~F?Ha-a#YQ+F zbk(fI&fB@|p_MzQ&heFNk4f6en zy%mR`Tn4-hUfjjibi54h0D*e}INXj72rHQ(`Wk^RfG}94+^Ey&JE{zXN^F7>&48%a z!7B|$0SHeRAiSh9bG!pk8mC+a0Ktz8yvtpfvbAH;T6@tSrdtIIRzo$merRztv5NmVI?frv8$1nt6<(k4Cty8vm~2+0%`Ac@@h z@_C#||Ah>f`zj8>cK~;BPL>~;f+M}iw4H|ae^96`$gJ|51j&#jWxB5cfg~ybfwLy< zBwBN!QK-SXJWTNp&sbmhLjn~%gywe4;t&E5ZoKjOS`C4FN$QCh3BVE;vZX(3@ln^1 zv~iAYj3voUhw9JrEW{A{6cBb*wj)JrEYL_75M;I4=9{Y2-vPOuCF}?s8P1tL%`}AN zX-5?xOZPCHzB%*f4v{0E+v|1KbES;>v z_?g;QTXz{IiGfE|h9=B@)}MFEZ~s;K*`Jn`cE*gEZjd3!NdHkTjxg=AaF~jzU;a*3 z-I=pyc_y1()M)H3s&MGL>d%@*JHuegt@LBj;_DSU{D8ktfBsqQ!AFXGq`9h8j9v#L zQ5!@;3;B*}9N=l;KQx1JW5<~R6(N1`zhAW9Gd|mI|0z{R+EG638|@w&9@$?o&XMF+ z=TV_=H{5W8B}4_gGnxovZKN|gg5FhhTvLVoZ;Pua7Gg##Iw@(+3e?r?_wU(HNo|+A?#CWLpc4kQxzcf zeWSczc_oagOC@XDn9Q~Fnxrz50$`oIb*pW4)DUk6&E@!aeug(>Ukc^Ude%A)D#aOa2{#jGC!Nn{PC0c`*SP63yV z%sqntHvcypbQV*d37h%NZD;b4<1ENKNHoDeX@MO~oJA%!lv+E*2s6`9y^#7gDtn*(iTG< zAlQ4LZe>@j?A+gQ`w2(II3^107>`noTLLes`O0zF?yBG)sgtFF3QMuO`a4<7>2 z2v2_U$)~J(Q@-x>9c0K(Q;SzWG)~_MMaq0e8m$S0Q@ct{K3)McR3cDq6? zr)G5-xQFMx`OR-KV_!rNHiMiG7&Zi`+5uk19->eZZrbHCz>`2}^DvUGwI<0;%a+T~ z(`2@}m@y~Ybia|F6cvBs=l~$>Ah%;W=iFn_jj}t$B6ay={Q8L_aeCu3pWUHlm*>bZ ze9sZ)mQLTp^Uj%mmbgS!K-S)r#Uf-0VsqxqHA;2+t*!+~7cN|2o5mm+V{ui+^RQP@ z*&G^ncuAw(!D!_r%?@BC8;>*)d5w7V5x@f2`bbnTS zBD6NHOXI%dn)oixd&T`lB1v33Yo-97v;@9mF*~k(ZA>C!3Q4{Ah?DQbIspu zG#nXHK#1M@K>-3`>hvWNoVbTEJXeIfpZ%<27ecqpWSdA)YzPs&7P8BD0tnbld`AyJ za5v*s%3QRPaoJILl~q)9Wzj;5Y}{$k&^-TvYljXUB;)ratIcudw6n9d<&VATrt76W z3^Wgh16dyd0uPS`?h7$q5D{_3_wgM98Vj5IbN_x;70E+E{oKa+EY3!LW()O+#ojz= zaZpL~;>&7buYf?8ta6h8;V+i0=9PF&Lr__BGaz+ycxxl&0bpLrZC|4yk7rJj%8ARV z`4bvKKTCfeG`Y4eM?3BvY@q#YPS;-hosAuL8k}ng1_(- zrdTaU>6LWPjRJ&?`w|dt;>a+WBZHsQ)0ph|UAmhWi@I1q#aTN#9856vtH;5EXZVE0 zC)G3x&BU*X_VD-2^Uv!-LnwfaS2*9}0RjYf#bGx&K}knD?pR$9vd!AB{3`lEyaPvu zsIbh%C!TP89`8`TnfolcN&fUdW?YAyTd8YEa?^P;&Nt41*tI;lX{D6VbZ(8F`=0dEZ6OXwe9hZctc<(!;yljvFU&u%E_szRuzJ;0k|NRUQT&s<_sdGCbAFd&c$~CdbTVP$BbI#crAb1Pnd9ERh z$oMi`PD8fi$WZLsMRw)fxuidzm)q4=m4-m@+}dle<3)eT4*|rqKA@^2A&P*n=}MWl z=c&EelCBlVZ@lpUT9ggVa%u>-DC~6Nq?4K!WT0H2YMKyY=bB6{VNubHH1aPJL?VGH z2G0|EJ$9dgHj1n46UG>`(CT}eSpA*GpQma**UvovT$My`J~E`hQV345Z?I!?zE2G~ z?0!+Px^5TbS@B)i(61*Y@qx?jkM?FC@8{_D=l6E;ttEYuh%6%b;iYi&f(T#iFnUCXJz z12J7)bSC7mi?ly$(YDY?_&c}|;`b~>1Ru+C+0_}Y&~|?2vM9&9@Gv02ra5JcD_myF za-2!`jCcp{_UhL@f&7gJA~eGo>u4i}t5{IgOR%@!#&{O>8hl4%w@bCd^r_rK7N}*9 zW}lc-ehf`4z?Z&2ev46&_kbDRy<_iG;EA$WHsC{G0(^wqs;gyRIjoJ3ufm z!^w7z3D*g4AOsbz0$g8zuMgFvAPFHm5C)%^1pcnFA%seO!37r>*I)=eDlfU|a1pxx z5u)QmTBU5o0>b4tQHDp0RD?8B6H1Yi?Y7%io(|sg-E4SZU0zRTywel#>2BnB7ooS* zhA;{>Zqs}WAHIi0MB0yiVBY`(o`3#1qs)8u+2`_SepzhDd+oKScqXp0s#3AbvMEr7 ziF$;~`~DaS=IFA^E^FL%*IhpLvbrN{XP-SSXU;0Wi$#6K6<1{}SUzKna z>Zqf={sXoGeYdwlv6%}heWyW5yc}jzJXTz#I(dEJ~MxMzWi;OwE+az5`H1|%?y#|XV!UKx8OpAAjRr3sLlinjqqF&m9Db{B55N% zEMVS4j0BaAf?EJ#F{9%CBi(k~!}F@1!S1TDz!AiEn}&rhlgj{w+O-zC?1tpk zS0k6<`bwkXvdRR>PJ}!29>$-eBgZ0KZg2%u^_6>0RT%I!@@B+1;GVnf)>|6C7x~Dp zRE#F2JDbt5V~;d$0V-~VrWJCH_Hf?0*aJS@0tnso$)}+pobgD-f-Wzf0ol-Lid3AT zTn3H?vA*y$O_qU>H0WY0DrE6Rxt|A14u1dpr!%=y33(Z#@iJI8XN!rT-eyqlPuGAj zDKjdXeE=bmG*F{&?pz0isZ@e=Yo$q+eS9FYzPj`Yh4 z2)qkHfI{sLTBzZo1rSD!+P}{Mf!Kc|s>$p$RBjrlMMQlAFU#gK03h6S(+!nz2+KOB z^o z$mfT3+34^QZ9Vh|6@T4-|NZ&|kYlU~c-c*~YtBNYv5<$+YCDcSA_D|ps0`j}0)!iH zyrEAu1Quoxv&KTjjS5xU+R_xF@9DUufWXenGuBz>9iqv*O;M76P=82&_Da(%7ZSCI z%EZ%?x*bEdF%W(x(Gb#ir7~HT@v^*f9~weLD*6uY#&F!mPO>^9Pk*+>EfQI{KidKV zaR}0U_`EK;qYPqz$nvbat~G>-;txm-It(}!nJL7YY6w*W(yhREb6qPSJlGf`4Z#_P z+>cBf81M@(n5k+|&5??HN89I#^z-3|AIfbAoPkNw@j4UD_Jg{11v+DSpRPzjT=RU; z5QeLY@iyChxN((u8h`ks|D7)&-a{p-FaUMaXJ31iTmN(86sefcKlg&4Q}sKJB~)$- z&8^$#Rb3bT0eGel!v>_Jk@(5zu9_EK^ z&u`!N@A)&4wPRKPGdMiU?}~fw(>*p``t!E8y~VOlsbYP);wNB;qK_Quu)DnNZErV^ zK^!%s|IAGs83G`dXIwo}k@{`6=O%x7Ih||ybsy^*vCF_?=}Pn?^L}keBhkP3k$W!WH^m`^rwh> zOWV-=yjYsaYm(`06b@DcRgA8_Ax=x zU|+aCc`nfI&Whiq*T=s>(z6sf_5oEkDtF9m2xe4-=g+OFAsAH}LcAB+GwKe6$Uz^* z^Eqe!TocGFBao<{?;<|n9cxzX!sW$Y07A1dh_^HY9&rdzYk3}re^04+0*b0Wt(sRW zfOb3SE|5!&l^V9+C>2J43&gC<2N9d_AoiD`mNf8n-nq5~A3dh3O&&V!ea9WSneO33 zfBq7Di~5qBhz(RD16sPLQEzp<8}N9~rWL;N0uYKZh<>`fyzl6NKG=xv8j8*#KJz-S5<4$*LF&R*(&7C_(tj~{1 zjojbVJAS{)%Bwa`IN?}R&7+Trj=ODDFa>{I%CAQqk|Sd&qxaLF_SnPxFMt8Tmj}QyP8f zp*nt?X>}QFUbP;fP@{5Fgh+SO=8zd^*ooHsAC;y9kXS~eM<3ic=%9mIWFy9!duSV> z-`vBI0gnlw6o8Ni&Y7!^O(l+?zEJrd`C^f?`S6E1i^U)B3L5^h%!Q`X3>f_c2%ha& zmU*rt6n*;ib8~G8b}H;BL>;yQf@@S1YN2vd00M0!rv=+pH=nKnVaiEUO=wcYBu;*g zO2UWRG1U<6z4u!>lON+=)J*r|`%vd&fI@R9gH3u5CC4wj^lLH#ZB`n%%&2(ySMtD< zv<(gjQu~rm00MQCQgJOvG08Sywgg# zskn>f*6TyNp=ul2lHAnIH1>WC;{apQHI#PG-cL)N5*aX z?x1pS1(`@x^RaUcVVWm5HOZ)7chyyM8q>~_ZA$$_dxO7n;i79R>sUr#FH?o`Y15_) z5d3ILTgZRtTR_l}0jqrKTctzT5Xwh}7&HLk=%Zajh~EVuq-dFH4k&2N6&>NMu{1;Rq4R)LJ5UWCHN#KnZfzy*C9VVr0PO8562K1(_>tj!93!G5TUgMKthaT+0*Q$)Z+>?L_8R1FHw!d*%0#yZ95!^^8RE3-mX7fYexow)&F4MuoUFib!0fCai9{?s-M+Q=kUj^KWGTFlQ;(AH?SFb zwqw6M0@rgt@T}-)sb{+#$?aUoN#x=9X5ld>A>*l6AY?e!Oc@wxt1~lkWWa{t$DhIs z*s$Wg(?w%0FDdBcZC#=fL5W?_H z)jSxda8W;dt&$5aJ1^b#oyX5>>EQX#MLaqKfl=`aWyiGxgrK-)QUbl}0D<>m=)xTp zACQ#99twJ(C4_C8Y1%*~+Sim2hZm!~@Ot?<#t%ai;FE$FBqJnI#X?R2*za?Ddw3X{ z0KxFVC%UY4Rke?6B2meNk%gkMd*A!sXaD9%lTv?8}4D#dA4Xs#{p`BiRMN#ifUES_81eZ#-)<j$)aXkhg6f);?$e6*J6h=kb$GBBjZu0jLLqd>KF`oS_$!(1_x{I&r8W6&$me*ASU=%Bc!!Ehc#$5VooVmI>yszOU(7h1KgQ8CpJ3hzb##sxYuRA~r2yV*tM zVwVb12qFT+1V`R`r(L(Wulipppw{h%McWF?bDUM9WO=$!LeoMpLzCp$?Sh|DAWB=B z?qsoN`R|(duPT)_c1qgdJFB}1>(pD`8&#m}9_AohP%M}zix++JT^gfsLd|Cj)xj)O z`dqVOfj7A-y{GX#CFZV~ufnxi#;KQf&s>$+dpwNE!H1$W$N}$v&C=uf&g*$v;#H=# zH3KuO-d2J#2Y;7sk^@(kv3e&3#cgEoNXI@6N-ArL?Zz}c)`aqiC#Wu_p)936148Oj zfpRO&Wk?%-@4eqN4Z#Jt@E-@=ws*=K8VjJX*t+^3lZVy&vP&;9BTy<_ab$>G1{a{> zzFD)*ukR;90dN6H<|oynRiv z?VN5!a;rY+4ps+psk++<2-%sAJMM(WpEF80o=;5vuDkBivNM>D=W-$9OKdZjs8_-{`uR7Cku=B%l37MoZ-P#TVUc0ubz@W78ME_yvvg9gQoc zn)6w*zYI%qz!Qzr5?Nd!*%FnQO1uX--prsO33s+)?KK4b0u{Q=d}7ngjDi zTs04MAWMjVGiNzJsg;X6YnnxpcJt{15E?4Ob&Jm2C*>{{8pC8%MJmRiBhaBCgqjwJ z>N|AA{WsI7`R?L@MGgr44Sg@a3@<|~AUu$TE+aU;Ll(If7YGo_6ly%1YbU5&`|Wq& zcI1Ui8kB>-M(1bL_5#n6 z7Y8A`=}v9S>W?#axVvlJYZ z6&WChh_~=hs$S)W!v2k;k2*@Wl)dE+oGZ`C88+5vGEmUpq}mjzsNo{NOq1V%&kdOD1aD=O5M&?06f{K)6P2EUt&B;j)vDgM)J=13F714)aeDH1 zPYDqAwEBq_pQ(m)0t8fc(yBRDx`A#bRc<;+?n*6gxi?||ae6oH_HTc?Ty6`sP+!hG z1|EjYcYqG*=4WPArD!~3_s(_xSsAUjR=;I=LNDZ(o;6creET%vj!k521$bI_oNNApkT_C1_7=J26h3sI|T_A79p8*6d)K_19EteN! z9XQqjB4`M%aP(`eD?qsIwp%JR1eY(ycIM2P1_)X@CXegN5PJO$i;U4~XK5ml@ku+z z8zAg0-omS`eJoU-@%FdBRRwSZ5X=(N0tk@Ia!xAeF_NSW$?)o z*IjpNV_V?IXN=*J-;*X!$)Z9#Pkz@L0yc!QwX?kq!6Oyjm&-y=6H{ESVn-}2s-Yzm zT!{!02AHZi1fD^1(_t2=$eGfGigUlIgW^=IqfiTA@aYShFdul%mYzQ31L*3k3v?&r zTDoEa@ceg$#~=)gRYF?$y8YdSrPy~5>L8|{Xj^Jsj&?>sP16n84}}KSD!kFIW&>`t zC#>tuPj&0RJOkOt(Qw*^<=)poS*Tr0C}`6BdA>{fF)j`GaT`OC$?9|MGE^ReLQXx` zBAvIgQMc@EqD|Nfcz!_@*DMDy*6xAu@9;phlMNf2%q|uq7xM!krj%#&-#j!SGo_(x zXAtHc!HDh0IeAAc3D5XEU5HA%{7l2?569R|ZC>m1M z5V+2%*wb=XGAhbFbNS`uGHlV(hcw$U7EkPw)r?7w_5`><6&99!443bH@4K@^tImjA zHJIh!fzq6lE#ARo2N&upjrWQ4(k$0CyOxuZii?2VUbg{=?|BbxD`Gdgd4IcW7y~>i zen$4TMI1s(vYO8omuSwtZ8B;x%vF3$Z0)G(hZ)(ArK$%gc5Y3v^>{=t&oK} z8BKR%9kN242-$s=c(c>SMzwlg)w+lL2Z1HC89rxW1(XAlTSSzQ_8G0 zK45VOBsX<#Z&!d&WIMVVAG-@G8MNKiM+UqMgf16MM(%L3#x}U|iS2A(O zAAh1;PIsH?28hCsf3+ea$pPTpoPKOv^$T(gZjdVsK)}l|PzFyT`+BSXTsQfy{m|z# zRA}`&on!my$VA(SRD_j?2tu%`NkcGDZ^)aWdz9Q1yZ$QT1%%p+MZV`=BN{L1$Ut7u z(xtB{dT>V_1?vn`ZU%WHR*F&o9jWTi90l<(T%ssgSH=37VQ`VWGjCBL*zz&Q z+muR2ab)Ti*s294<|_VncXR$J38XP+sbCLo+n6J-+%(aSCFh^Sd0^$Mnf1q zdQ4`K_jmD3R7EFQtqxtL96ZTQ0ZIc0ib74rL(E0hhk$VO(Z{Lme2|4M(N4dyO^`7> zmjM9`SKCiM`IM|)f`ca{wy-QYAS`d=GCQyvo9rH5WW=UF5sJ-;kpR>4^zcj{Ay`>MvdU@xn`hEam(BL7`@SZd~6741jhFYdk{;fDZ_qReimjBR2 zbGp}$wi^=26r=TvG4;dV5RTQj~Cc?JOp;bn+3SwsXDF$mrT)VIsU z!s|xGW%aud(Qg$(l$ zfZ#j!63f7YLXEDF?fAm;N^UY>TVgx+VTX-roUY`ixq015S>+XE#7^Ez`g1cN3=tq; zGxE<7UvWSn4gq7NYq1TZP)h*;&jBDz+sNG9Z@+y-qH|&6B6%6G8*v}UkDG74Ub6j< z4G25#G(^;JPv@Sxp+g57r{ZkOkfgSw%NBV+*DuEHIItVBkOtLk`D(d|uQ@V6vKq`l zv7l2xC>tE_z4uMldN`wsrBPbn~po~cxec3{pYjMMv5uOI29vjJ$(XW zF?H%xWwl*zlS*GU(vjg>B?t9(WN1JCyyw(Y&u~D{e{3{p2xNR#7kl+11Et)qRkDne zfxO;WLq{wEdFbEnyYJ!Y&(_zaiVZlxsKF`rdX0`5j0fj>cr>EgQ&&=I08`k0hz|e| z{54A(W5#%3lGUBmIC+$w1H!Gh+-y;RyQyvDj}UBzZ~jPSJ91<|LjVx4CGn2+Wb?r7 zh-~*_K<>65eQ{l|F8}fOq^CPj<7t^J9!8=R&(V<~h=>SGTGZ$1&o|wiB{vo2(&(7m z5S%e71q256o8KgK`50YQBrwJ9oLcQ;fP6Rf$S?lw*5qF709Q57y5lrfj+S7VcMG?lXg{#w_kf9{E2WGHY*gR~VcV5!qMvGSD^(l{_V%xgEys zuKp@FzNP*9CqMa#y8|5$EL@iO4*G-I?m=xUnH8VoU$@nScy{bt?D9YU@&7jOl^GS) zCXQ5uchfdlhP-8-%dzzbKWO%bAOH9#mXs7TI$*$tmU#8J7@&S9L#f?CMxhM2TWz&v zmqx|DSl+!q16ijmeH5Qzp0Iro(MmEDQID?i_&jX2)fRnO4xZ|$b4Z(Q4XK^Dfm03RCzEg)M%*hw4Jf_NM?1!C`Nz6wWu#4~?T-0RWs(*|DZ@JKPx}>p_TNPW zroY9-t#HfsnU~=vX$WpZXiitIi$iD@z`x#4Zd61=7-KFa2Av%~vM4F`T4r5t*P7U! zAr2`JcBz$H-&VmQRl?Z%yk!*~XM=~5Dp5(GhHA$#s0;|bj#Mlh1oxV27Bueu z`q#C~!O`fIj;2mMsWmXE*OxS1pCMZQyP~gX0236*6V51De@H(p~dSc&f;}8~v z3LC;FKiN#7)(H@P`qQ7P%FaG^l;Dhv+h(#N{ygHY*&foVjc8NjRhI!G768HPKWt=% zJFg?zeTl6)L5m%NT!yRX%`>Ja-n))`?1Zeo-J<9ITAugqDIlZ7j;AeZ6n3=9bBTg~3XaiW_~mw@0l1XmA36?6)W14abze* zf?ags1KNIM zQS20JIqoLxJb%4U3J6bHF%*bQ`OvmQ%)EsC8X&L>qxe8-bAt@4Z2>`{&QniT zwqq8pxW*c*8MPS(T(TXp%kV5>WQGnIl2>8scJ4yVq)&&rh-%#ac2vC3x8TYGi5T1#Nr==bcl>RJ0AmA((ELx5A!?QtFg-FJXs1|nrU>Wno(fk{}DV=`zw zgLcjQxs|NTA-aCO8#}_-*GcfxcT`_noJT#E!Rs=_gvH-gM~1SYDR#4X&m)gKsx?GQu=0h|YC}kk zn(-vs#-ic8eY>(z&5uEf@mv3?an`gmGJwNUiCE=#1TIckh#5vkd60^@-hGj zWQ3)$1CTsidg(<%x%Kl2scUq)bEns&R_d}5$Bis*$STVdDmXy%@DG0AL@XJ}D(wrF z+6ynl?bvKXsPi%eFz~)`=R`Z>ydN?aZHYECgI{4~N8)6G++tcVXHub~q<3Z3Tq% zOm5AJhiB~r;A{JnO+Y|Q3y>BQ)Y8x9YavMGJ?^23cKW!5+&S}*eKHSB)MY5&Q)egP zon)#SQ*`DxVT^;~4tY!4m5!Ucrbu*(CKMo;&WCq7`s19W@l5*Dt+vq-5JE#ZQRir4 z-b0WgmVhu+Pg;rrNeZ_0Nsr1k;qT6J!gN7!|5?d&n=Vd%Xa}@a&kEp$HOUg9%oV%T zc4)Mlx_6V%y5IBO=bn4c#@ii%9->c0u<}@^8z)3Kf0E{4z0AM}*&+In5N?mXak(M{fFlbs zKzvOc9r+$P@J*=D=<4RNYe1MVSx1Hh5Mq)&*rW(pN@EGqT_`3a_!XnUu~WFK(D@LW zKfYT<>T6uTgsjLUE!oe61vx9vs4^-VS_?!@QgV~2q}j2Eg+QWK?B3-8hkDPvc}i}o$kFGWya$4d zMG7~KybRVja*fvVx0iR?>imEsx%Qi6XY0Jz)%L5)N+9Aq;7GMrAnd_+>P;pLT!Kb z=}ai%7Z5ec#-%Y(q~Z+vnV>j(&3$dTbh`IxCA=2M#o* z9AoJ%?ZCX1z7e|YwGS9a0nfXX+@um-4hRu6{((f&7HGmpXTn&YRX4eq+@ZXUXv@otVI zxk>RQRZD{f#%?}Hbak$Exjc_QW}Fe1^rAWW95pQ4^Q4o!*b$o_UIs$g2M!#NJg<2N zXFl;BMOZ&klw_6y_O#6@+MO4*Mso;&`835{ECy*=Me*ty9wcfZ>#xYP;QbI%b8?OH>C zFxjd-9jiD5_cHkIk3V=}4}f4QpEwmEm>V%%}Z?Z$V2CSn?bqi*A@rkt&8d;C9K&g8WfBs738+-3P!s)~{aU}4- z>I@)^SGMC_q(5h%$C)-ye=eb9wEbiW&ccOW9*y7ep7|<{isd^M#B>~SHO&m*5$& z^yiT*?pAG(cl}Xk_n|`s2(sn4y{=#5DBTkpLT`YuRBlISU5+EFC6ej52_Tfm+KR!P?KY{%BVE(0Lo zc7zXMQhskBrVFeKZ8|`yCxQ!HC5`GgQB)(23%;WjwuEM?GM?)(0sbzFGtXL*TYuwc z-jxM@pkY)U83H({@{ewIMA_0}J(wZ_uEpZ@gc#z^C9n|s!GUoFW^DIk!n zMSi^h&OHnt`p^gMy$?O~kh~pkbK%6X!G`Ng5H~VH*{2jC7m6xv+Gd-rE0deLS>(N3 zLo-QKdg!6=H@SGR%b>0K8ccU>Zza1t{R!DK?|<`ag5|x_TdkI*o?kE_`!eV za>V!y95_JtZCKf4#t`G>!w>&JUhxY?!6IqR*S^cbhd=zGEV-$3YrD`8 zmMT;1$5xxci70(yVuAX^_={tqU#ywTmfc7n_ z+vS_vR%|~_BizH-c-t$4DtTa?=2ysQF)p3QxwXyRYBXH|Li?_CZrFnZtb@LEMTly6JYBtJt@$f#lq$i;&y>D6WjeBCV z>V8hU0)!NUQzIU~Pk%1X{h>vqsm!fM3wv$`$8o-Ghr-3R#eGE^n#VDYG4;q;M%-lq zgg%g!zxyL<#^LYYuD)nM)na<1f%x(OLau9dJ(wK@pxS|6qMxgITUPx>H%UZ6RCr$PT?vqs#Tk9yKfB9bpaL32JTQjRfR^znuwuXqwMv6A9uUz)h|wtG zkpe+Q)CD36MyW+(iSdetF~r$r~hN#>;8_{-`^tupsK=G5z(5O)*~b#X9LlxP~9JbO1>9bClOFIK;%Qf zJf&%Ubobp${*{fl@DBp7tF)}XJXNJ47X#=?UdTx&FB=Z~A_5-EO`MaqPngmhQJqh4vDKA&dm~8N^0l=1K*w50HEiVLAlmp9G z2yU1Y!KB@6=#D;s_Z%gFn7CfJ`pY+6qw0U{)R1krO;-uW92Fs<_8x6IJj85P+6eVBi6Y(LYf1=?zeu=|~bF z*d(le1F+x^g7-fX^yra02?b36KRmX$y{baK@-5dp`j5t_lJrL&o%b<>=P5>?ZqU-wHu~vUOG?@)q)~wWf)1OFucbYJg^ME0e^}6~()onAt)L0u zhi`5Hh8(WA{wiZfuC?uv(_>bxk^dXbJZ7JMY9(avEBL>gZj12GH*)s_1xLFon2?6j~IEfV$!7s8$WmEih|&iiv`v9MRsi> z7YFR+^n%WWy(2#PSj9CH3^q49unFwb&kN?>+XgIwBKX6OR&2=-MM1FYR}q%HB$l*X z9B?3jPl#mf{Q>(brce2zX`vY!KP9rEDMvO*x%-whDl1+1%H*r2jv;7-PgesyO4^)r zaKdpB@R@KDsG4Lj^a!=HfR30Z=EgY@UVB5J1~~2*#nt1DHCaCVT=I9p^xGqFCgeK$ z!wm2`Py}pl0LGlD7(3d9qil&H;Nw+-_dj%hbG2%}ebkPAHioHpKNR7yCp%|;0s$EU zyr#4NzKS{1%onm*X0}C{au-HD*(D?_0Jvgm0&Ca11(jSKa3CPdOnGf*Zk0j*yvFjmGUQJf9SUKPxo8|5s-6+8hx{-?sp_@8En=7;+Js?}mk z9&77e0kE9`t-#)Uxe~(N`?|k*4E@IyQzNXa2`gebB|`*{g|TBtDb7FJU<)(gjOO$7 z^AT>HCsz0I(G8t4{letS4Nf^$?TjFaG*R;xL|FJIL9d=+K_*sKlwC*4lEA|cX{*WP zdsH}IeO>Hq@bN$W1#SQEp^C{9oF-(~6Ut%rA}-3XFHKY2#}o=S5Aa|PK1gj%CY4RE z%dc4{)}*votM37yJA?K7id5PustipT4Xu1fEFp1og2E+0+_K}Cvkb=(dF^M;4F+5bV2H`a z?3UHm|5)CBSm_sVC|ln&$=H!^mC<70zaI-GRzBaKbu*hnCsRlEB^_qf#dj?X?{!4cp`Fe@Qu zPBA!efLq@sDSYqRnWKOHzL>LhChz4L)!>Z}M&nOV`%8bQGk;BENP zN4oNotv0*_cYTzp2)wd0)U~%$Ht^CruP20W=xsj5HWOR&99+ zN#Uy3x>~`Uy96sb2qmq4)Cdedm}|s}zP+7*XV(;V0q(p%el%2&1knDUbgW|Pl?EF( zIq>Z>yCqKVnRkDLXP1g~wEVv}BLs^-JpP1Xip$1QJ#`M<&WN;I)L}i*-pMj1;0 z%Mg8mEcYhQV6}wpy7kp1(LDz;_RTMx=Gi=T06+bhm zCoT=%* zms@tscBI~cGvobqjWbQJuXLs=mr-BPnQ%KkdF#IjHlvsR{aAvo7&OqW5x8%iXsd)+ z`L1C0U4l%^TkJHZ5fnH|b=$N09>I-s>Oepol=9f8`x6kh zEQ>Wf!lr%OfyqiC-F4Hxux(|m!SBM|e0_xpM^MCux#ynJD5@$VqN`NPO6ya<6p`@&GD?0x zw2Ki)scLoKO-0wr0BN?^^8);ZuOyPx=Q%OWYRCr$Poe7Lp)fvZsm&X7z49m>0g|;kJHi1T=n`lEL!AfgwS_5sdr70%X zR55^9Y#T{RTLsySLsL^jtVV5xVx(2DRjf@drpAI53W!hy3t^pM8JHPnxy}Eccbvzp zZ{9s`-W|9%d3j;D%Xk0(Z#&=l&Uqey@B5yu&j;8C7I5T9PxA6M;CWMky5zN8Vgj7$kqD?y-YtRWy-H2Z*S!G)DhvVT~*XY+nO^vaHD~7}MlVI}oP*@0+m07cf><}QW zE+~NQJK)J@;e!K4i)0Bptk&mR`z`ra!|k^;U$PAw3g4Rvjr%Jdkeg*qB9)U_lpR{1(7i2i%@;RISFnF5Wv#>S2n|Mo-o48q&o}njg>=0$Yn~2 z?)W}TonkD(VQ_XwKmdL|?AQfMRu~iR%-~xxED3T?_s@s1W1zCi842zPkbpATUpx#4 z4jQ-9Sv9{oOVGOw8v+m9Z!FtU{BlEpfL6Bf`*rZ#dg$3RJ@7@EK2ZzG&BZBM!nyM> zb2`lU2Ar*MVg=y|5O^BAoIV2&E{8*hpnLb$39z7FsDb)ALxNIM-6yJ6BLZXvLp}jN zz0W9_;zP(WLU;lK?eA&w{FSRs5N-`b39Nj(TON!W2?GZh&D#AQoG61H-JO}Y^Mp$z zC}P2YGLUr z*uE3;<;HScrf6(Jl2vYV^hlEtiI9-NIJ^a@oS*^9!bPUuBR}4pP(cto2iIK-^XD|p zr{zz36~dN(!tzH=N*gsR5CJOEsZO+Xu^DiNR1yaSB!ko3A3;@h%RVtkQ>)?Dufeyc z8!}P{G(qjC2khDd%N{Z2?Lfnv#{tQyIQ7WGPEu_*1ZZF)0;*dfz@~Axd>L+^WwIs> z)a;Qukb7u(Xy57__*6NS<%s|(Oh_vYPe2e@YhlsP;qVd2YsCefuY^%on!${n0I^yw z7u35qta~1wS=)Lr&ly=mU*lFC4&Iy@av;%|mPnArv@@qc}KfEJ!01luF-5Fw=fjwhAeS1lG8&!$JHev-enly~ zy|wMpu&$Bd!6bNc%Fn(?$hXm_ugaDQ3r0)4FSr9l@V;+W=N2!Mit0R z84}n^6z-h^6Rt^?q{C0Cx*@`30Son_UwyhKA$ds zw)m#8%iOy_MMQ_%?)bZ{0VsHT{AXNc4JA3YJ9L0M3PfMRyqG?CYrRf zUx}Fy2$}UXhRdA`O1-m4POMiwFCr#F1yU(IVf-SU3!zEiu3EX^>nTStx zX-KcrwVpK3%MJln)1@ua{^KW1o65U8;K)%^HFc1}rTLEOohHy#!O3zsdNewzs+3{iKqx6PBlAAJpt8Cl*UzG| zWS0P|3(_vzreb@AqSBaaWmL9fdw^_~lSSaOlLfV9e3pn{nR56+Ok0m@*Z&7oqe;0s zP_~Y-fX0>(6Y!C4bPNHp3u@6AvrB*lJ`Tb;AiyrpXq<*B`_aOT4)n8W#RAEzg&N9+ zI(-^?(Ln5Vc6$0?C%=O z$ihk)w=uwW$pyu@U%{Temq0PD0!EI2c~LLM*@0GEj!rA&xF3jF?T;s9azH>lCD|^} zQ%`mi1A;XI?VOa)Smclw+VoeMnoX5$gFtJywyo)ro0PYGLF$ZFhjdzPDIr13^m1GC zR~w9`7FFk0dZ~#QrN^xujoVVxA?+Y53U2|KG-hQAV3_M{TVdbcaPu^naJ6Y7Q+fQA z*Wk^!+RpPM*_aiKCemz83ijWm}iWdfe7Yl0NA5*FM8lRjs<+?p&7DS(xwW|3e^>zpIGM9FGc zTZ{BuftksDw2n=a?BlP3h4UcM)uhWh+DG z*Vx4&S|s?LZ$jTb4echo--pN6fQpD}KW}Y;N#vHPws)bnD?l^3k2F|)KK+Ve^e8AS z0Cn(b5Gl=W4SYQ>vJ18CRt3LY28R!~y;VUb;JLa+Agb+9E+{BPXs{bO5)^66Z_Ia~mM_bz!xB@fN``CJr1wEZM$;fWjVL=E6DK+r3hc4aiYK9JhMN!-K?5r&jmFXoa625n~>0P1mx1qMEKb; z0XZfoCLkst#|Y&3@v#NO1mqZj96vs`fS7zv zhw6a&NpsjP0!o3q0sBMq9V*FX`Y?mF=dJSmQ>Ug?#3W>gcY!bM*Y;tnz2f3IhJa(o3P~h3;CVMBPtc$Bi<>bKZio=@ zc01t&zW*9EHMe+!2A%VK-}gLEUw%GiWe?(ccL8~Bo*Un#5dyXNeko_p{KOkRyehyx zumIl=z5^mop1cXqyA7Ct?+?NA3S$^UAmIBIc-}!^8@~UvS5oqFD&GGGG3{C72PBKJ P00000NkvXXu0mjfmfN%+ literal 0 HcmV?d00001 diff --git a/admin/src/views/workbench/image/menu_dept.png b/admin/src/views/workbench/image/menu_dept.png new file mode 100644 index 0000000000000000000000000000000000000000..0d198e456d303484e4153fc4db9ab830f0cc64ad GIT binary patch literal 3047 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 literal 0 HcmV?d00001 diff --git a/admin/src/views/workbench/image/menu_dict.png b/admin/src/views/workbench/image/menu_dict.png new file mode 100644 index 0000000000000000000000000000000000000000..30ac7be12d1652da7af2fa4ff140ccad2c98a15d GIT binary patch literal 2162 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

&@{YT{NL+N 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 +

+
+ + + + + + + +
+
+
访问量(人)
+
{{ workbenchData.today.todayVisits }}
+
+ 总访问量:{{ workbenchData.today.totalVisits }} +
+
+
+
销售额(元)
+
{{ workbenchData.today.todaySales }}
+
+ 总销售额:{{ workbenchData.today.totalSales }} +
+
+
+
订单量(笔)
+
{{ workbenchData.today.todayOrder }}
+
+ 总订单量:{{ workbenchData.today.totalOrder }} +
+
+
+
新增用户
+
{{ workbenchData.today.todayUsers }}
+
+ 总访用户:{{ workbenchData.today.totalUsers }} +
+
+
+
+
+
+ + +
+
+ + +
{{ item.name }}
+
+
+
+
+
+
+ + +
+ +
+
+ + +
+
+
+ +
+
{{ item.title }}
+
{{ item.desc }}
+
+
+
+
+
+
+
+ + + + + diff --git a/admin/tailwind.config.js b/admin/tailwind.config.js new file mode 100644 index 0000000..bab028a --- /dev/null +++ b/admin/tailwind.config.js @@ -0,0 +1,119 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + colors: { + white: 'var(--color-white)', + primary: { + DEFAULT: 'var(--el-color-primary)', + 'light-3': 'var(--el-color-primary-light-3)', + 'light-5': 'var(--el-color-primary-light-5)', + 'light-7': 'var(--el-color-primary-light-7)', + 'light-8': 'var(--el-color-primary-light-8)', + 'light-9': 'var(--el-color-primary-light-9)', + 'dark-2': 'var(--el-color-primary-dark-2)' + }, + success: 'var(--el-color-success)', + warning: 'var(--el-color-warning)', + danger: 'var(--el-color-danger)', + error: 'var(--el-color-error)', + info: 'var(--el-color-info)', + body: 'var(--el-bg-color)', + page: 'var(--el-bg-color-page)', + 'tx-primary': 'var(--el-text-color-primary)', + 'tx-regular': 'var(--el-text-color-regular)', + 'tx-secondary': 'var(--el-text-color-secondary)', + 'tx-placeholder': 'var(--el-text-color-placeholder)', + 'tx-disabled': 'var(--el-text-color-disabled)', + br: 'var(--el-border-color)', + 'br-light': 'var(--el-border-color-light)', + 'br-extra-light': 'var(--el-border-color-extra-light)', + 'br-dark': 'var( --el-border-color-dark)', + fill: 'var(--el-fill-color)', + 'fill-light': 'var(--el-fill-color-light)', + 'fill-lighter': 'var(--el-fill-color-lighter)', + mask: 'var(--el-mask-color)' + }, + fontFamily: { + sans: ['PingFang SC', 'Arial', 'Hiragino Sans GB', 'Microsoft YaHei', 'sans-serif'] + }, + boxShadow: { + DEFAULT: 'var(--el-box-shadow)', + light: 'var(--el-box-shadow-light)', + lighter: 'var(--el-box-shadow-lighter)', + dark: 'var(--el-box-shadow-dark)' + }, + fontSize: { + xs: 'var(--el-font-size-extra-small)', + sm: 'var( --el-font-size-small)', + base: 'var( --el-font-size-base)', + lg: 'var( --el-font-size-medium)', + xl: 'var( --el-font-size-large)', + '2xl': 'var( --el-font-size-extra-large)', + '3xl': '20px', + '4xl': '24px', + '5xl': '28px', + '6xl': '30px', + '7xl': '36px', + '8xl': '48px', + '9xl': '60px' + }, + spacing: { + px: '1px', + 0: '0px', + 0.5: '2px', + 1: '4px', + 1.5: '6px', + 2: '8px', + 2.5: '10px', + 3: '12px', + 3.5: '14px', + 4: '16px', + 5: '20px', + 6: '24px', + 7: '28px', + 8: '32px', + 9: '36px', + 10: '40px', + 11: '44px', + 12: '48px', + 14: '56px', + 16: '64px', + 20: '80px', + 24: '96px', + 28: '112px', + 32: '128px', + 36: '144px', + 40: '160px', + 44: '176px', + 48: '192px', + 52: '208px', + 56: '224px', + 60: '240px', + 64: '256px', + 72: '288px', + 80: '320px', + 96: '384px' + }, + lineHeight: { + none: '1', + tight: '1.25', + snug: '1.375', + normal: '1.5', + relaxed: '1.625', + loose: '2', + 3: '12px', + 4: '16px', + 5: '20px', + 6: '24px', + 7: '28px', + 8: '32px', + 9: '36px', + 10: '40px' + } + }, + + plugins: [ + // require('@tailwindcss/line-clamp') // 引入插件 + ] +} diff --git a/admin/tsconfig.json b/admin/tsconfig.json new file mode 100644 index 0000000..5540a4f --- /dev/null +++ b/admin/tsconfig.json @@ -0,0 +1,19 @@ +{ + "include": [ + "global.d.ts", + "src/**/*", + "src/**/*.vue", + "components.d.ts", + "auto-imports.d.ts", + "typings/**/*.d.ts" + ], + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "isolatedModules": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/admin/typings/index.d.ts b/admin/typings/index.d.ts new file mode 100644 index 0000000..a95667e --- /dev/null +++ b/admin/typings/index.d.ts @@ -0,0 +1,3 @@ +declare module 'css-color-function' + +type PromiseFun = (...arg: any[]) => Promise diff --git a/admin/typings/router.d.ts b/admin/typings/router.d.ts new file mode 100644 index 0000000..9fae641 --- /dev/null +++ b/admin/typings/router.d.ts @@ -0,0 +1,14 @@ +import 'vue-router' +declare module 'vue-router' { + // 扩展 RouteMeta + interface RouteMeta { + type?: string + perms?: string + title?: string + icon?: string + hidden?: boolean + activeMenu?: string + hideTab?: boolean + keepAlive?: boolean + } +} diff --git a/admin/vite.config.ts b/admin/vite.config.ts new file mode 100644 index 0000000..7b4adbf --- /dev/null +++ b/admin/vite.config.ts @@ -0,0 +1,59 @@ +import { fileURLToPath, URL } from 'url' + +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' + +// https://vitejs.dev/config/ +export default ({ mode }) => { + const env = loadEnv(mode, process.cwd()) + console.log(env) + + return defineConfig({ + // base: '/admin/', + server: { + open: true, + host: '0.0.0.0', + proxy: { + '/api': { + target: env.VITE_APP_BASE_URL, + changeOrigin: true, + ws: true + } + } + }, + plugins: [ + vue(), + vueJsx(), + AutoImport({ + imports: ['vue', 'vue-router'], + resolvers: [ElementPlusResolver()], + eslintrc: { + enabled: true + } + }), + Components({ + directoryAsNamespace: true, + resolvers: [ElementPlusResolver()] + }), + createStyleImportPlugin({ + resolves: [ElementPlusResolve()] + }), + createSvgIconsPlugin({ + // 配置路劲在你的src里的svg存放文件 + iconDirs: [fileURLToPath(new URL('./src/assets/icons', import.meta.url))], + symbolId: 'local-icon-[dir]-[name]' + }) + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } + }) +} diff --git a/docs/1.go-打包.md b/docs/1.go-打包.md new file mode 100644 index 0000000..d65bb60 --- /dev/null +++ b/docs/1.go-打包.md @@ -0,0 +1,13 @@ +# 打包 +## 方式一:直接打包 +```bash +go build -o main.exe . +``` + +## 方式二:goreleaser 同时打包多平台 +```bash +# 安装工具 +go install github.com/goreleaser/goreleaser@latest +# 打包 +goreleaser release --snapshot --clean +``` diff --git a/docs/2.go-运行.md b/docs/2.go-运行.md new file mode 100644 index 0000000..a042544 --- /dev/null +++ b/docs/2.go-运行.md @@ -0,0 +1,34 @@ +# 部署 + +## 上传所有需要的文件 + +- 打包后的二进制文件.exe +- static/* +- .env + + +我是前端工程师,所以我推荐使用pm2管理进程 +https://pm2.io/ +## 安装 +```bash +# 需要node环境 +npm install pm2 -g +# 之前有一种不依赖node直接安装,好像不能用了 +``` +```bash +# 启动 +pm2 start 打包后的二进制文件名 --name like-server +# 开机启动 +pm2 startup +# 保存 +pm2 save + +# 停止 +```bash +pm2 stop like-server +# 重启 +```bash +pm2 restart like-server +# 查看日志 +pm2 log like-server +``` \ No newline at end of file diff --git a/docs/3.go-nginx配置.md b/docs/3.go-nginx配置.md new file mode 100644 index 0000000..0d31d0f --- /dev/null +++ b/docs/3.go-nginx配置.md @@ -0,0 +1,27 @@ + +# nginx配置 +## 反向代理接口 +```nginx +location ^~ /api +{ + proxy_pass http://127.0.0.1:8001; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_http_version 1.1; + # proxy_hide_header Upgrade; + + add_header X-Cache $upstream_cache_status; + +} +``` +## 前端页面使用history模式需要重定向 +```nginx +location / { + index /index.html; + try_files $uri $uri/ /index.html; +} +``` \ No newline at end of file diff --git a/docs/assets/genCode.png b/docs/assets/genCode.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3bbdb807499489bf390503a0bf3dc892f1c2f2 GIT binary patch literal 300676 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� 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

1LIbPJ^H{@Xx9oJTWe*O4&su2q41#l}SgU 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

yaS$B#Na_{T2eV;M4j2jH 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�nea!a1-T)u~5&7fymF?ULV4Odm6T6f1C9wwg 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 literal 0 HcmV?d00001 diff --git a/server.code-workspace b/server.code-workspace new file mode 100644 index 0000000..8c6cb20 --- /dev/null +++ b/server.code-workspace @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "path": "server" + }, + { + "path": "admin" + }, + { + "path": "docs" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000..5f5b92d --- /dev/null +++ b/server/.env.example @@ -0,0 +1,15 @@ +# 可配置项参考:config\config.go + +#GIN_MODE='release' +# 项目端口 +SERVER_PORT=8001 +# 域名(不建议有) +# PUBLIC_URL='http://127.0.0.1:8000' +# 数据库 +DATABASE_URL='root:root@tcp(localhost:3306)/x_admin?charset=utf8mb4&parseTime=True&loc=Local' + +#Redis +REDIS_URL='redis://:passwd@localhost:6379' + +# 上传文件目录 +UPLOAD_DIRECTORY='/www/wwwroot/x_admin_go/public/uploads/' diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..51df7f7 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,60 @@ +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out +*.prof +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +# System file +.DS_Store +.DS_Store? +.AppleDouble +.LSOverride +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +.TemporaryItems +.fseventsd +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# IDE +.idea/ +/go_build_* +out/ +.vscode/* +!.vscode/settings.json +!.vscode/launch.json +*.sublime* +__debug_bin +.project + +# custom +# env +.env +# binary +main +# air +tmp +dist/ diff --git a/server/.goreleaser.yaml b/server/.goreleaser.yaml new file mode 100644 index 0000000..e8c4f23 --- /dev/null +++ b/server/.goreleaser.yaml @@ -0,0 +1,46 @@ +# This is an example .goreleaser.yml file with some sensible defaults. +# Make sure to check the documentation at https://goreleaser.com + +# The lines below are called `modelines`. See `:help modeline` +# Feel free to remove those if you don't want/need to use them. +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 1 + +before: + hooks: + # You may remove this if you don't use go modules. + - go mod tidy + # you may remove this if you don't need go generate + - go generate ./... + +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - windows + # - darwin + +# archives: +# - format: tar.gz +# # this name template makes the OS and Arch compatible with the results of `uname`. +# name_template: >- +# {{ .ProjectName }}_ +# {{- title .Os }}_ +# {{- if eq .Arch "amd64" }}x86_64 +# {{- else if eq .Arch "386" }}i386 +# {{- else }}{{ .Arch }}{{ end }} +# {{- if .Arm }}v{{ .Arm }}{{ end }} +# # use zip for windows archives +# format_overrides: +# - goos: windows +# format: zip + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" diff --git a/server/.vscode/launch.json b/server/.vscode/launch.json new file mode 100644 index 0000000..0261c36 --- /dev/null +++ b/server/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "." + } + ] +} \ No newline at end of file diff --git a/server/.vscode/settings.json b/server/.vscode/settings.json new file mode 100644 index 0000000..4a9da6f --- /dev/null +++ b/server/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "cSpell.words": [ + "gocode", + "gonic", + "gorm", + "x_admin", + "mapstructure", + "rmvb" + ] +} \ No newline at end of file diff --git a/server/admin/article_collect/article_collect_ctl.go b/server/admin/article_collect/article_collect_ctl.go new file mode 100644 index 0000000..a511f7c --- /dev/null +++ b/server/admin/article_collect/article_collect_ctl.go @@ -0,0 +1,64 @@ +package article_collect + +import ( + "x_admin/core/request" + "x_admin/core/response" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +type ArticleCollectHandler struct { + Service IArticleCollectService +} + +// list article_collect列表 +func (hd ArticleCollectHandler) List(c *gin.Context) { + var page request.PageReq + var listReq ArticleCollectListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := hd.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail article_collect详情 +func (hd ArticleCollectHandler) Detail(c *gin.Context) { + var detailReq ArticleCollectDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := hd.Service.Detail(detailReq.Id) + response.CheckAndRespWithData(c, res, err) +} + +// add article_collect新增 +func (hd ArticleCollectHandler) Add(c *gin.Context) { + var addReq ArticleCollectAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) { + return + } + response.CheckAndResp(c, hd.Service.Add(addReq)) +} + +// edit article_collect编辑 +func (hd ArticleCollectHandler) Edit(c *gin.Context) { + var editReq ArticleCollectEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, hd.Service.Edit(editReq)) +} + +// del article_collect删除 +func (hd ArticleCollectHandler) Del(c *gin.Context) { + var delReq ArticleCollectDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) { + return + } + response.CheckAndResp(c, hd.Service.Del(delReq.Id)) +} diff --git a/server/admin/article_collect/article_collect_schema.go b/server/admin/article_collect/article_collect_schema.go new file mode 100644 index 0000000..707c40c --- /dev/null +++ b/server/admin/article_collect/article_collect_schema.go @@ -0,0 +1,41 @@ +package article_collect + +import "x_admin/core" + +//ArticleCollectListReq 文章收藏列表参数 +type ArticleCollectListReq struct { + UserId int `form:"userId"` // 用户ID + ArticleId int `form:"articleId"` // 文章ID +} + +//ArticleCollectDetailReq 文章收藏详情参数 +type ArticleCollectDetailReq struct { + Id int `form:"id"` // 主键 +} + +//ArticleCollectAddReq 文章收藏新增参数 +type ArticleCollectAddReq struct { + UserId int `form:"userId"` // 用户ID + ArticleId int `form:"articleId"` // 文章ID +} + +//ArticleCollectEditReq 文章收藏新增参数 +type ArticleCollectEditReq struct { + Id int `form:"id"` // 主键 + UserId int `form:"userId"` // 用户ID + ArticleId int `form:"articleId"` // 文章ID +} + +//ArticleCollectDelReq 文章收藏新增参数 +type ArticleCollectDelReq struct { + Id int `form:"id"` // 主键 +} + +//ArticleCollectResp 文章收藏返回信息 +type ArticleCollectResp struct { + Id int `json:"id" structs:"id"` // 主键 + UserId int `json:"userId" structs:"userId"` // 用户ID + ArticleId int `json:"articleId" structs:"articleId"` // 文章ID + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} diff --git a/server/admin/article_collect/article_collect_service.go b/server/admin/article_collect/article_collect_service.go new file mode 100644 index 0000000..8982db7 --- /dev/null +++ b/server/admin/article_collect/article_collect_service.go @@ -0,0 +1,122 @@ +package article_collect + +import ( + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model" + + "gorm.io/gorm" +) + +type IArticleCollectService interface { + List(page request.PageReq, listReq ArticleCollectListReq) (res response.PageResp, e error) + Detail(id int) (res ArticleCollectResp, e error) + Add(addReq ArticleCollectAddReq) (e error) + Edit(editReq ArticleCollectEditReq) (e error) + Del(id int) (e error) +} + +// NewArticleCollectService 初始化 +func NewArticleCollectService(db *gorm.DB) IArticleCollectService { + return &articleCollectService{db: db} +} + +// articleCollectService 文章收藏服务实现类 +type articleCollectService struct { + db *gorm.DB +} + +// List 文章收藏列表 +func (Service articleCollectService) List(page request.PageReq, listReq ArticleCollectListReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + dbModel := Service.db.Model(&model.ArticleCollect{}) + if listReq.UserId > 0 { + dbModel = dbModel.Where("user_id = ?", listReq.UserId) + } + if listReq.ArticleId > 0 { + dbModel = dbModel.Where("article_id = ?", listReq.ArticleId) + } + dbModel = dbModel.Where("is_delete = ?", 0) + // 总数 + var count int64 + err := dbModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + // 数据 + var objs []model.ArticleCollect + err = dbModel.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + resps := []ArticleCollectResp{} + response.Copy(&resps, objs) + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: resps, + }, nil +} + +// Detail 文章收藏详情 +func (Service articleCollectService) Detail(id int) (res ArticleCollectResp, e error) { + var obj model.ArticleCollect + err := Service.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&obj).Error + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, obj) + return +} + +// Add 文章收藏新增 +func (Service articleCollectService) Add(addReq ArticleCollectAddReq) (e error) { + var obj model.ArticleCollect + response.Copy(&obj, addReq) + err := Service.db.Create(&obj).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 文章收藏编辑 +func (Service articleCollectService) Edit(editReq ArticleCollectEditReq) (e error) { + var obj model.ArticleCollect + err := Service.db.Where("id = ? AND is_delete = ?", editReq.Id, 0).Limit(1).First(&obj).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + // 更新 + response.Copy(&obj, editReq) + err = Service.db.Model(&obj).Updates(obj).Error + e = response.CheckErr(err, "Edit Updates err") + return +} + +// Del 文章收藏删除 +func (Service articleCollectService) Del(id int) (e error) { + var obj model.ArticleCollect + err := Service.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&obj).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + // 删除 + obj.IsDelete = 1 + err = Service.db.Save(&obj).Error + e = response.CheckErr(err, "Del Save err") + return +} diff --git a/server/admin/article_collect_route.go b/server/admin/article_collect_route.go new file mode 100644 index 0000000..38e17bc --- /dev/null +++ b/server/admin/article_collect_route.go @@ -0,0 +1,26 @@ +package admin + +import ( + "x_admin/admin/article_collect" + "x_admin/core" + "x_admin/middleware" + + "github.com/gin-gonic/gin" +) + +// 请在 admin/entry.go 目录引入这个函数 +// ArticleCollectRoute(rg) +func ArticleCollectRoute(rg *gin.RouterGroup) { + db := core.GetDB() + + server := article_collect.NewArticleCollectService(db) + + handle := article_collect.ArticleCollectHandler{Service: server} + + rg = rg.Group("/", middleware.TokenAuth()) + rg.GET("/article_collect/list", handle.List) + rg.GET("/article_collect/detail", handle.Detail) + rg.POST("/article_collect/add", handle.Add) + rg.POST("/article_collect/edit", handle.Edit) + rg.POST("/article_collect/del", handle.Del) +} diff --git a/server/admin/common/album/route.go b/server/admin/common/album/route.go new file mode 100644 index 0000000..1bbef1b --- /dev/null +++ b/server/admin/common/album/route.go @@ -0,0 +1,116 @@ +package album + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func AlbumRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewAlbumService(db) + + handle := albumHandler{Service: server} + + rg = rg.Group("/common", middleware.TokenAuth()) + + rg.GET("/album/albumList", handle.albumList) + rg.POST("/album/albumRename", middleware.RecordLog("相册文件重命名"), handle.albumRename) + rg.POST("/album/albumMove", middleware.RecordLog("相册文件移动"), handle.albumMove) + rg.POST("/album/albumDel", middleware.RecordLog("相册文件删除"), handle.albumDel) + rg.GET("/album/cateList", handle.cateList) + rg.POST("/album/cateAdd", middleware.RecordLog("相册分类新增"), handle.cateAdd) + rg.POST("/album/cateRename", middleware.RecordLog("相册分类重命名"), handle.cateRename) + rg.POST("/album/cateDel", middleware.RecordLog("相册分类删除"), handle.cateDel) +} + +type albumHandler struct { + Service IAlbumService +} + +// albumList 相册文件列表 +func (ah albumHandler) albumList(c *gin.Context) { + var page request.PageReq + var listReq CommonAlbumListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := ah.Service.AlbumList(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// albumRename 相册文件重命名 +func (ah albumHandler) albumRename(c *gin.Context) { + var rnReq CommonAlbumRenameReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &rnReq)) { + return + } + response.CheckAndResp(c, ah.Service.AlbumRename(rnReq.ID, rnReq.Name)) +} + +// albumMove 相册文件移动 +func (ah albumHandler) albumMove(c *gin.Context) { + var mvReq CommonAlbumMoveReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &mvReq)) { + return + } + response.CheckAndResp(c, ah.Service.AlbumMove(mvReq.Ids, mvReq.Cid)) +} + +// albumDel 相册文件删除 +func (ah albumHandler) albumDel(c *gin.Context) { + var delReq CommonAlbumDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, ah.Service.AlbumDel(delReq.Ids)) +} + +// cateList 类目列表 +func (ah albumHandler) cateList(c *gin.Context) { + var listReq CommonCateListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := ah.Service.CateList(listReq) + response.CheckAndRespWithData(c, res, err) +} + +// cateAdd 类目新增 +func (ah albumHandler) cateAdd(c *gin.Context) { + var addReq CommonCateAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, ah.Service.CateAdd(addReq)) +} + +// cateRename 类目命名 +func (ah albumHandler) cateRename(c *gin.Context) { + var rnReq CommonCateRenameReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &rnReq)) { + return + } + response.CheckAndResp(c, ah.Service.CateRename(rnReq.ID, rnReq.Name)) +} + +// cateDel 类目删除 +func (ah albumHandler) cateDel(c *gin.Context) { + var delReq CommonCateDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, ah.Service.CateDel(delReq.ID)) +} diff --git a/server/admin/common/album/schema.go b/server/admin/common/album/schema.go new file mode 100644 index 0000000..f507f48 --- /dev/null +++ b/server/admin/common/album/schema.go @@ -0,0 +1,103 @@ +package album + +import "x_admin/core" + +type CommonUploadImageReq struct { + Cid uint `form:"cid" binding:"gte=0"` // 主键 +} + +//CommonAlbumListReq 相册文件列表参数 +type CommonAlbumListReq struct { + Cid int `form:"cid,default=-1"` // 类目ID + Type int `form:"type" binding:"omitempty,oneof=10 20"` // 文件类型: [10=图片, 20=视频] + Name string `form:"keyword"` // 文件名称 +} + +//CommonAlbumRenameReq 相册文件重命名参数 +type CommonAlbumRenameReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Name string `form:"keyword" binding:"required,min=1,max=30"` // 文件名称 +} + +//CommonAlbumMoveReq 相册文件移动参数 +type CommonAlbumMoveReq struct { + Ids []uint `form:"ids" binding:"required"` // 主键 + Cid int `form:"cid,default=-1"` // 类目ID +} + +//CommonAlbumAddReq 相册文件新增参数 +type CommonAlbumAddReq struct { + Cid uint `form:"cid" binding:"gte=0"` // 类目ID + Aid uint `form:"aid" binding:"gte=0"` // 管理ID + Uid uint `form:"uid" binding:"gte=0"` // 用户ID + Type int `form:"type" binding:"oneof=10 20"` // 文件类型: [10=图片, 20=视频] + Name string `form:"name"` // 文件名称 + Uri string `form:"uri"` // 文件路径 + Ext string `form:"ext"` // 文件扩展 + Size int64 `form:"size"` // 文件大小 +} + +//CommonAlbumDelReq 相册文件删除参数 +type CommonAlbumDelReq struct { + Ids []uint `form:"ids" binding:"required"` // 主键 +} + +//CommonCateListReq 相册分类列表参数 +type CommonCateListReq struct { + Type int `form:"type" binding:"omitempty,oneof=10 20 30"` // 分类类型: [10=图片,20=视频] + Name string `form:"keyword"` // 分类名称 +} + +//CommonCateAddReq 相册分类新增参数 +type CommonCateAddReq struct { + Pid uint `form:"pid" binding:"gte=0"` // 父级ID + Type int `form:"type" binding:"required,oneof=10 20 30"` // 分类类型: [10=图片,20=视频] + Name string `form:"name" binding:"required,min=1,max=30"` // 分类名称 +} + +//CommonCateRenameReq 相册分类重命名参数 +type CommonCateRenameReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Name string `form:"keyword" binding:"required,min=1,max=30"` // 分类名称 +} + +//CommonCateDelReq 相册分类删除参数 +type CommonCateDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//CommonUploadFileResp 上传图片返回信息 +type CommonUploadFileResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Cid uint `json:"cid" structs:"cid"` // 类目ID + Aid uint `json:"aid" structs:"aid"` // 管理ID + Uid uint `json:"uid" structs:"uid"` // 用户ID + Type int `json:"type" structs:"type"` // 文件类型: [10=图片, 20=视频] + Name string `json:"name" structs:"name"` // 文件名称 + Uri string `json:"url" structs:"url"` // 文件路径 + Path string `json:"path" structs:"path"` // 访问地址 + Ext string `json:"ext" structs:"ext"` // 文件扩展 + Size int64 `json:"size" structs:"size"` // 文件大小 +} + +//CommonAlbumListResp 相册文件列表返回信息 +type CommonAlbumListResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Cid uint `json:"cid" structs:"cid"` // 所属类目 + Name string `json:"name" structs:"name"` // 文件名称 + Path string `json:"path" structs:"path"` // 相对路径 + Uri string `json:"uri" structs:"uri"` // 文件路径 + Ext string `json:"ext" structs:"ext"` // 文件扩展 + Size string `json:"size" structs:"size"` // 文件大小 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +//CommonCateListResp 相册分类列表返回信息 +type CommonCateListResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Pid uint `json:"pid" structs:"pid"` // 父级ID + Name string `json:"name" structs:"name"` // 分类名称 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} diff --git a/server/admin/common/album/service.go b/server/admin/common/album/service.go new file mode 100644 index 0000000..1262400 --- /dev/null +++ b/server/admin/common/album/service.go @@ -0,0 +1,225 @@ +package album + +import ( + "path" + "time" + "x_admin/config" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/common" + "x_admin/util" + + "gorm.io/gorm" +) + +type IAlbumService interface { + AlbumList(page request.PageReq, listReq CommonAlbumListReq) (res response.PageResp, e error) + AlbumRename(id uint, name string) (e error) + AlbumMove(ids []uint, cid int) (e error) + AlbumAdd(addReq CommonAlbumAddReq) (res uint, e error) + AlbumDel(ids []uint) (e error) + CateList(listReq CommonCateListReq) (mapList []interface{}, e error) + CateAdd(addReq CommonCateAddReq) (e error) + CateRename(id uint, name string) (e error) + CateDel(id uint) (e error) +} + +// NewAlbumService 初始化 +func NewAlbumService(db *gorm.DB) IAlbumService { + return &albumService{db: db} +} + +// albumService 相册服务实现类 +type albumService struct { + db *gorm.DB +} + +// AlbumList 相册文件列表 +func (albSrv albumService) AlbumList(page request.PageReq, listReq CommonAlbumListReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + albumModel := albSrv.db.Model(&common.Album{}).Where("is_delete = ?", 0) + if listReq.Cid > 0 { + albumModel = albumModel.Where("cid = ?", listReq.Cid) + } + if listReq.Name != "" { + albumModel = albumModel.Where("name like ?", "%"+listReq.Name+"%") + } + if listReq.Type > 0 { + albumModel = albumModel.Where("type = ?", listReq.Type) + } + // 总数 + var count int64 + err := albumModel.Count(&count).Error + if e = response.CheckErr(err, "AlbumList Count err"); e != nil { + return + } + // 数据 + var albums []common.Album + err = albumModel.Limit(limit).Offset(offset).Order("id desc").Find(&albums).Error + if e = response.CheckErr(err, "AlbumList Find err"); e != nil { + return + } + albumResps := []CommonAlbumListResp{} + response.Copy(&albumResps, albums) + // TODO: engine默认local + engine := "local" + for i := 0; i < len(albumResps); i++ { + if engine == "local" { + albumResps[i].Path = path.Join(config.Config.PublicPrefix, albums[i].Uri) + } else { + // TODO: 其他engine + } + albumResps[i].Uri = util.UrlUtil.ToAbsoluteUrl(albums[i].Uri) + albumResps[i].Size = util.ServerUtil.GetFmtSize(uint64(albums[i].Size)) + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: albumResps, + }, nil +} + +// AlbumRename 相册文件重命名 +func (albSrv albumService) AlbumRename(id uint, name string) (e error) { + var album common.Album + err := albSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&album).Error + if e = response.CheckErrDBNotRecord(err, "文件丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "AlbumRename First err"); e != nil { + return + } + album.Name = name + err = albSrv.db.Save(&album).Error + e = response.CheckErr(err, "AlbumRename Save err") + return +} + +// AlbumMove 相册文件移动 +func (albSrv albumService) AlbumMove(ids []uint, cid int) (e error) { + var albums []common.Album + err := albSrv.db.Where("id in ? AND is_delete = ?", ids, 0).Find(&albums).Error + if e = response.CheckErr(err, "AlbumMove Find err"); e != nil { + return + } + if len(albums) == 0 { + return response.AssertArgumentError.Make("文件丢失!") + } + if cid > 0 { + err = albSrv.db.Where("id = ? AND is_delete = ?", cid, 0).Limit(1).First(&common.AlbumCate{}).Error + if e = response.CheckErrDBNotRecord(err, "类目已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "AlbumMove First err"); e != nil { + return + } + } + err = albSrv.db.Model(&common.Album{}).Where("id in ?", ids).UpdateColumn("cid", cid).Error + e = response.CheckErr(err, "AlbumMove UpdateColumn err") + return +} + +// AlbumAdd 相册文件新增 +func (albSrv albumService) AlbumAdd(addReq CommonAlbumAddReq) (res uint, e error) { + var alb common.Album + //var params map[string]interface{} + //if err := mapstructure.Decode(params, &alb); err != nil { + // core.Logger.Errorf("AlbumAdd Decode err: err=[%+v]", err) + // return response.SystemError + //} + response.Copy(&alb, addReq) + err := albSrv.db.Create(&alb).Error + if e = response.CheckErr(err, "AlbumAdd Create err"); e != nil { + return + } + return alb.ID, nil +} + +// AlbumDel 相册文件删除 +func (albSrv albumService) AlbumDel(ids []uint) (e error) { + var albums []common.Album + err := albSrv.db.Where("id in ? AND is_delete = ?", ids, 0).Find(&albums).Error + if e = response.CheckErr(err, "AlbumDel Find err"); e != nil { + return + } + if len(albums) == 0 { + return response.AssertArgumentError.Make("文件丢失!") + } + err = albSrv.db.Model(&common.Album{}).Where("id in ?", ids).Updates( + common.Album{IsDelete: 1, DeleteTime: time.Now().Unix()}).Error + e = response.CheckErr(err, "AlbumDel UpdateColumn err") + return +} + +// CateList 相册分类列表 +func (albSrv albumService) CateList(listReq CommonCateListReq) (mapList []interface{}, e error) { + var cates []common.AlbumCate + cateModel := albSrv.db.Where("is_delete = ?", 0).Order("id desc") + if listReq.Type > 0 { + cateModel = cateModel.Where("type = ?", listReq.Type) + } + if listReq.Name != "" { + cateModel = cateModel.Where("name like ?", "%"+listReq.Name+"%") + } + err := cateModel.Find(&cates).Error + if e = response.CheckErr(err, "CateList Find err"); e != nil { + return + } + cateResps := []CommonCateListResp{} + response.Copy(&cateResps, cates) + return util.ArrayUtil.ListToTree( + util.ConvertUtil.StructsToMaps(cateResps), "id", "pid", "children"), nil +} + +// CateAdd 分类新增 +func (albSrv albumService) CateAdd(addReq CommonCateAddReq) (e error) { + var cate common.AlbumCate + response.Copy(&cate, addReq) + err := albSrv.db.Create(&cate).Error + e = response.CheckErr(err, "CateAdd Create err") + return +} + +// CateRename 分类重命名 +func (albSrv albumService) CateRename(id uint, name string) (e error) { + var cate common.AlbumCate + err := albSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&cate).Error + if e = response.CheckErrDBNotRecord(err, "分类已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "CateRename First err"); e != nil { + return + } + cate.Name = name + err = albSrv.db.Save(&cate).Error + e = response.CheckErr(err, "CateRename Save err") + return +} + +// CateDel 分类删除 +func (albSrv albumService) CateDel(id uint) (e error) { + var cate common.AlbumCate + err := albSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&cate).Error + if e = response.CheckErrDBNotRecord(err, "分类已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "CateDel First err"); e != nil { + return + } + r := albSrv.db.Where("cid = ? AND is_delete = ?", id, 0).Limit(1).Find(&common.Album{}) + if e = response.CheckErr(r.Error, "CateDel Find err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("当前分类正被使用中,不能删除!") + } + cate.IsDelete = 1 + cate.DeleteTime = time.Now().Unix() + err = albSrv.db.Save(&cate).Error + e = response.CheckErr(err, "CateDel Save err") + return +} diff --git a/server/admin/common/index/index.go b/server/admin/common/index/index.go new file mode 100644 index 0000000..ede4d09 --- /dev/null +++ b/server/admin/common/index/index.go @@ -0,0 +1,41 @@ +package index + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + + "github.com/gin-gonic/gin" +) + +func IndexRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + // authSrv := system.NewSystemAuthMenuService(db, permSrv) + IndexService := NewIndexService(db) + handle := indexHandler{Service: IndexService} + + rg = rg.Group("/common", middleware.TokenAuth()) + rg.GET("/index/console", handle.console) + rg.GET("/index/config", handle.config) +} + +type indexHandler struct { + Service IIndexService +} + +// console 控制台 +func (ih indexHandler) console(c *gin.Context) { + res, err := ih.Service.Console() + response.CheckAndRespWithData(c, res, err) +} + +// config 公共配置 +func (ih indexHandler) config(c *gin.Context) { + res, err := ih.Service.Config() + response.CheckAndRespWithData(c, res, err) +} diff --git a/server/admin/common/index/service.go b/server/admin/common/index/service.go new file mode 100644 index 0000000..bf72b77 --- /dev/null +++ b/server/admin/common/index/service.go @@ -0,0 +1,101 @@ +package index + +import ( + "time" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/util" + + "gorm.io/gorm" +) + +type IIndexService interface { + Console() (res map[string]interface{}, e error) + Config() (res map[string]interface{}, e error) +} + +// NewIndexService 初始化 +func NewIndexService(db *gorm.DB) IIndexService { + return &indexService{db: db} +} + +// indexService 主页服务实现类 +type indexService struct { + db *gorm.DB +} + +// Console 控制台数据 +func (iSrv indexService) Console() (res map[string]interface{}, e error) { + // 版本信息 + name, err := util.ConfigUtil.GetVal(iSrv.db, "website", "name", "x_admin-Go") + if e = response.CheckErr(err, "Console Get err"); e != nil { + return + } + version := map[string]interface{}{ + "name": name, + "version": config.Config.Version, + "website": "www.x_admin.cn", + "based": "Vue3.x、ElementUI、MySQL", + "channel": map[string]string{ + "gitee": "https://gitee.com/x_admin/x_admin_python", + "website": "https://www.x_admin.cn", + }, + } + // 今日数据 + today := map[string]interface{}{ + "time": "2022-08-11 15:08:29", + "todayVisits": 10, // 访问量(人) + "totalVisits": 100, // 总访问量 + "todaySales": 30, // 销售额(元) + "totalSales": 65, // 总销售额 + "todayOrder": 12, // 订单量(笔) + "totalOrder": 255, // 总订单量 + "todayUsers": 120, // 新增用户 + "totalUsers": 360, // 总访用户 + } + // 访客图表 + now := time.Now() + var date []string + for i := 14; i >= 0; i-- { + date = append(date, now.AddDate(0, 0, -i).Format(core.DateFormat)) + } + visitor := map[string]interface{}{ + "date": date, + "list": []int{12, 13, 11, 5, 8, 22, 14, 9, 456, 62, 78, 12, 18, 22, 46}, + } + return map[string]interface{}{ + "version": version, + "today": today, + "visitor": visitor, + }, nil +} + +// Config 公共配置 +func (iSrv indexService) Config() (res map[string]interface{}, e error) { + website, err := util.ConfigUtil.Get(iSrv.db, "website") + if e = response.CheckErr(err, "Config Get err"); e != nil { + return + } + copyrightStr, err := util.ConfigUtil.GetVal(iSrv.db, "website", "copyright", "") + if e = response.CheckErr(err, "Config GetVal err"); e != nil { + return + } + var copyright []map[string]string + if copyrightStr != "" { + err = util.ToolsUtil.JsonToObj(copyrightStr, ©right) + if e = response.CheckErr(err, "Config JsonToObj err"); e != nil { + return + } + } else { + copyright = []map[string]string{} + } + return map[string]interface{}{ + "webName": website["name"], + "webLogo": util.UrlUtil.ToAbsoluteUrl(website["logo"]), + "webFavicon": util.UrlUtil.ToAbsoluteUrl(website["favicon"]), + "webBackdrop": util.UrlUtil.ToAbsoluteUrl(website["backdrop"]), + "ossDomain": config.Config.OssDomain, + "copyright": copyright, + }, nil +} diff --git a/server/admin/common/upload/service.go b/server/admin/common/upload/service.go new file mode 100644 index 0000000..73b0aeb --- /dev/null +++ b/server/admin/common/upload/service.go @@ -0,0 +1,53 @@ +package upload + +import ( + "mime/multipart" + "x_admin/admin/common/album" + "x_admin/core/response" + "x_admin/plugin" +) + +type IUploadService interface { + UploadImage(file *multipart.FileHeader, cid uint, aid uint) (res album.CommonUploadFileResp, e error) + UploadVideo(file *multipart.FileHeader, cid uint, aid uint) (res album.CommonUploadFileResp, e error) +} + +// NewUploadService 初始化 +func NewUploadService(albSrv album.IAlbumService) IUploadService { + return &uploadService{albSrv} +} + +// uploadService 上传服务实现类 +type uploadService struct { + albSrv album.IAlbumService +} + +// UploadImage 上传图片 +func (upSrv uploadService) UploadImage(file *multipart.FileHeader, cid uint, aid uint) (res album.CommonUploadFileResp, e error) { + return upSrv.uploadFile(file, "image", 10, cid, aid) +} + +// UploadVideo 上传视频 +func (upSrv uploadService) UploadVideo(file *multipart.FileHeader, cid uint, aid uint) (res album.CommonUploadFileResp, e error) { + return upSrv.uploadFile(file, "video", 20, cid, aid) +} + +// uploadFile 上传文件 +func (upSrv uploadService) uploadFile(file *multipart.FileHeader, folder string, fileType int, cid uint, aid uint) (res album.CommonUploadFileResp, e error) { + var upRes *plugin.UploadFile + if upRes, e = plugin.StorageDriver.Upload(file, folder, fileType); e != nil { + return + } + var addReq album.CommonAlbumAddReq + response.Copy(&addReq, upRes) + addReq.Aid = aid + addReq.Cid = cid + var albumId uint + if albumId, e = upSrv.albSrv.AlbumAdd(addReq); e != nil { + return + } + response.Copy(&res, addReq) + res.ID = albumId + res.Path = upRes.Path + return res, nil +} diff --git a/server/admin/common/upload/upload.go b/server/admin/common/upload/upload.go new file mode 100644 index 0000000..a0ccae8 --- /dev/null +++ b/server/admin/common/upload/upload.go @@ -0,0 +1,60 @@ +package upload + +import ( + "x_admin/admin/common/album" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func UploadRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + AlbumServer := album.NewAlbumService(db) + server := NewUploadService(AlbumServer) + + handle := uploadHandler{Service: server} + + rg = rg.Group("/common", middleware.TokenAuth()) + rg.POST("/upload/image", middleware.RecordLog("上传图片", middleware.RequestFile), handle.uploadImage) + rg.POST("/upload/video", middleware.RecordLog("上传视频", middleware.RequestFile), handle.uploadVideo) +} + +type uploadHandler struct { + Service IUploadService +} + +// uploadImage 上传图片 +func (uh uploadHandler) uploadImage(c *gin.Context) { + var uReq album.CommonUploadImageReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &uReq)) { + return + } + file, ve := util.VerifyUtil.VerifyFile(c, "file") + if response.IsFailWithResp(c, ve) { + return + } + res, err := uh.Service.UploadImage(file, uReq.Cid, config.AdminConfig.GetAdminId(c)) + response.CheckAndRespWithData(c, res, err) +} + +// uploadVideo 上传视频 +func (uh uploadHandler) uploadVideo(c *gin.Context) { + var uReq album.CommonUploadImageReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &uReq)) { + return + } + file, ve := util.VerifyUtil.VerifyFile(c, "file") + if response.IsFailWithResp(c, ve) { + return + } + res, err := uh.Service.UploadVideo(file, uReq.Cid, config.AdminConfig.GetAdminId(c)) + response.CheckAndRespWithData(c, res, err) +} diff --git a/server/admin/entry.go b/server/admin/entry.go new file mode 100644 index 0000000..a6688a5 --- /dev/null +++ b/server/admin/entry.go @@ -0,0 +1,47 @@ +package admin + +import ( + "x_admin/admin/common/album" + "x_admin/admin/common/index" + "x_admin/admin/common/upload" + "x_admin/admin/monitor" + "x_admin/admin/setting/copyright" + "x_admin/admin/setting/dict_data" + "x_admin/admin/setting/dict_type" + "x_admin/admin/setting/protocol" + "x_admin/admin/setting/storage" + "x_admin/admin/setting/website" + "x_admin/admin/system" + "x_admin/admin/system/dept" + "x_admin/admin/system/log" + "x_admin/admin/system/login" + "x_admin/admin/system/menu" + "x_admin/admin/system/post" + + "github.com/gin-gonic/gin" +) + +func RegisterGroup(rg *gin.RouterGroup) { + upload.UploadRoute(rg) + album.AlbumRoute(rg) + index.IndexRoute(rg) + + monitor.MonitorRoute(rg) + + copyright.CopyrightRoute(rg) + dict_data.DictDataRoute(rg) + dict_type.DictTypeRoute(rg) + protocol.ProtocolRoute(rg) + storage.StorageRoute(rg) + website.WebsiteRoute(rg) + + login.LoginRoute(rg) + system.AdminRoute(rg) + menu.MenuRoute(rg) + post.PostRoute(rg) + + dept.DeptRoute(rg) + system.RoleRoute(rg) + log.LogRoute(rg) + ArticleCollectRoute(rg) +} diff --git a/server/admin/monitor/monitor.go b/server/admin/monitor/monitor.go new file mode 100644 index 0000000..a0183eb --- /dev/null +++ b/server/admin/monitor/monitor.go @@ -0,0 +1,48 @@ +package monitor + +import ( + "strings" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func MonitorRoute(rg *gin.RouterGroup) { + handle := monitorHandler{} + + rg = rg.Group("/monitor", middleware.TokenAuth()) + rg.GET("/cache", middleware.RecordLog("缓存监控"), handle.cache) + rg.GET("/server", middleware.RecordLog("服务监控"), handle.server) +} + +type monitorHandler struct{} + +// cache 缓存监控 +func (mh monitorHandler) cache(c *gin.Context) { + cmdStatsMap := util.RedisUtil.Info("commandstats") + var stats []map[string]string + for k, v := range cmdStatsMap { + stats = append(stats, map[string]string{ + "name": strings.Split(k, "_")[1], + "value": v[strings.Index(v, "=")+1 : strings.Index(v, ",")], + }) + } + response.OkWithData(c, map[string]interface{}{ + "info": util.RedisUtil.Info(), + "commandStats": stats, + "dbSize": util.RedisUtil.DBSize(), + }) +} + +// server 服务监控 +func (mh monitorHandler) server(c *gin.Context) { + response.OkWithData(c, map[string]interface{}{ + "cpu": util.ServerUtil.GetCpuInfo(), + "mem": util.ServerUtil.GetMemInfo(), + "sys": util.ServerUtil.GetSysInfo(), + "disk": util.ServerUtil.GetDiskInfo(), + "go": util.ServerUtil.GetGoInfo(), + }) +} diff --git a/server/admin/setting/copyright/copyright.go b/server/admin/setting/copyright/copyright.go new file mode 100644 index 0000000..cf3255a --- /dev/null +++ b/server/admin/setting/copyright/copyright.go @@ -0,0 +1,38 @@ +package copyright + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func CopyrightRoute(rg *gin.RouterGroup) { + db := core.GetDB() + service := NewSettingCopyrightService(db) + handle := copyrightHandler{Service: service} + + rg = rg.Group("/setting") + rg.GET("/copyright/detail", handle.Detail) + rg.POST("/copyright/save", handle.save) +} + +type copyrightHandler struct { + Service ISettingCopyrightService +} + +// detail 获取备案信息 +func (ch copyrightHandler) Detail(c *gin.Context) { + res, err := ch.Service.Detail() + response.CheckAndRespWithData(c, res, err) +} + +// save 保存备案信息 +func (ch copyrightHandler) save(c *gin.Context) { + var cReqs []SettingCopyrightItemReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSONArray(c, &cReqs)) { + return + } + response.CheckAndResp(c, ch.Service.Save(cReqs)) +} diff --git a/server/admin/setting/copyright/schema.go b/server/admin/setting/copyright/schema.go new file mode 100644 index 0000000..e32eb43 --- /dev/null +++ b/server/admin/setting/copyright/schema.go @@ -0,0 +1,7 @@ +package copyright + +//SettingCopyrightItemReq 保存备案信息参数 +type SettingCopyrightItemReq struct { + Name string `form:"name" json:"name"` // 名称 + Link string `form:"link" json:"link"` // 链接 +} diff --git a/server/admin/setting/copyright/service.go b/server/admin/setting/copyright/service.go new file mode 100644 index 0000000..88a6332 --- /dev/null +++ b/server/admin/setting/copyright/service.go @@ -0,0 +1,44 @@ +package copyright + +import ( + "x_admin/core/response" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISettingCopyrightService interface { + Detail() (res []map[string]interface{}, e error) + Save(cReqs []SettingCopyrightItemReq) (e error) +} + +// NewSettingCopyrightService 初始化 +func NewSettingCopyrightService(db *gorm.DB) ISettingCopyrightService { + return &settingCopyrightService{db: db} +} + +// settingCopyrightService 网站备案服务实现类 +type settingCopyrightService struct { + db *gorm.DB +} + +// Detail 获取网站备案信息 +func (cSrv settingCopyrightService) Detail() (res []map[string]interface{}, e error) { + data, err := util.ConfigUtil.GetVal(cSrv.db, "website", "copyright", "[]") + if e = response.CheckErr(err, "Detail GetVal err"); e != nil { + return + } + e = response.CheckErr(util.ToolsUtil.JsonToObj(data, &res), "Detail JsonToObj err") + return +} + +// Save 保存网站备案信息 +func (cSrv settingCopyrightService) Save(cReqs []SettingCopyrightItemReq) (e error) { + json, err := util.ToolsUtil.ObjToJson(cReqs) + if e = response.CheckErr(err, "Save ObjToJson err"); e != nil { + return + } + err = util.ConfigUtil.Set(cSrv.db, "website", "copyright", json) + e = response.CheckErr(err, "Save Set err") + return +} diff --git a/server/admin/setting/dict_data/dict_data.go b/server/admin/setting/dict_data/dict_data.go new file mode 100644 index 0000000..02b25d0 --- /dev/null +++ b/server/admin/setting/dict_data/dict_data.go @@ -0,0 +1,96 @@ +package dict_data + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func DictDataRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + authSrv := NewSettingDictDataService(db) + + handle := dictDataHandler{Service: authSrv} + + rg = rg.Group("/setting", middleware.TokenAuth()) + rg.GET("/dict/data/all", handle.All) + rg.GET("/dict/data/list", handle.List) + rg.GET("/dict/data/detail", handle.Detail) + rg.POST("/dict/data/add", handle.Add) + rg.POST("/dict/data/edit", handle.Edit) + rg.POST("/dict/data/del", handle.Del) +} + +type dictDataHandler struct { + Service ISettingDictDataService +} + +// all 字典数据所有 +func (ddh dictDataHandler) All(c *gin.Context) { + var allReq SettingDictDataListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &allReq)) { + return + } + res, err := ddh.Service.All(allReq) + response.CheckAndRespWithData(c, res, err) +} + +// list 字典数据列表 +func (ddh dictDataHandler) List(c *gin.Context) { + var page request.PageReq + var listReq SettingDictDataListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := ddh.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 字典数据详情 +func (ddh dictDataHandler) Detail(c *gin.Context) { + var detailReq SettingDictDataDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := ddh.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// detail 字典数据新增 +func (ddh dictDataHandler) Add(c *gin.Context) { + var addReq SettingDictDataAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, ddh.Service.Add(addReq)) +} + +// edit 字典数据编辑 +func (ddh dictDataHandler) Edit(c *gin.Context) { + var editReq SettingDictDataEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + response.CheckAndResp(c, ddh.Service.Edit(editReq)) +} + +// del 字典数据删除 +func (ddh dictDataHandler) Del(c *gin.Context) { + var delReq SettingDictDataDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, ddh.Service.Del(delReq)) +} diff --git a/server/admin/setting/dict_data/schema.go b/server/admin/setting/dict_data/schema.go new file mode 100644 index 0000000..154000f --- /dev/null +++ b/server/admin/setting/dict_data/schema.go @@ -0,0 +1,55 @@ +package dict_data + +import "x_admin/core" + +//SettingDictDataResp 字典数据返回信息 +type SettingDictDataResp struct { + ID uint `json:"id" structs:"id"` // 主键 + TypeId uint `json:"typeId" structs:"typeId"` // 类型 + Name string `json:"name" structs:"name"` // 键 + Value string `json:"value" structs:"value"` // 值 + Remark string `json:"remark" structs:"remark"` // 备注 + Sort uint16 `json:"sort" structs:"sort"` // 排序 + Status uint8 `json:"status" structs:"status"` // 状态: [0=停用, 1=禁用] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +//SettingDictDataListReq 字典数据列表参数 +type SettingDictDataListReq struct { + DictType string `form:"dictType" binding:"max=200"` // 字典类型 + Name string `form:"name" binding:"max=100"` // 键 + Value string `form:"value" binding:"max=200"` // 值 + Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用 +} + +//SettingDictDataDetailReq 字典数据详情参数 +type SettingDictDataDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SettingDictDataAddReq 字典数据新增参数 +type SettingDictDataAddReq struct { + TypeId uint `form:"typeId" binding:"required,gt=0"` // 类型 + Name string `form:"name" binding:"required,max=100"` // 键 + Value string `form:"value" binding:"required,max=200"` // 值 + remark string `form:"remark" binding:"max=200"` // 备注 + Sort int `form:"sort" binding:"gte=0"` // 排序 + Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用 +} + +//SettingDictDataEditReq 字典数据编辑参数 +type SettingDictDataEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + TypeId uint `form:"typeId" binding:"required,gte=0"` // 类型 + Name string `form:"name" binding:"required,max=100"` // 键 + Value string `form:"value" binding:"required,max=200"` // 值 + remark string `form:"remark" binding:"max=200"` // 备注 + Sort int `form:"sort" binding:"gte=0"` // 排序 + Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用 +} + +//SettingDictDataDelReq 字典数据删除参数 +type SettingDictDataDelReq struct { + Ids []uint `form:"ids" binding:"required"` // 主键列表 +} diff --git a/server/admin/setting/dict_data/service.go b/server/admin/setting/dict_data/service.go new file mode 100644 index 0000000..0121cce --- /dev/null +++ b/server/admin/setting/dict_data/service.go @@ -0,0 +1,153 @@ +package dict_data + +import ( + "time" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/setting" + + "gorm.io/gorm" +) + +type ISettingDictDataService interface { + All(allReq SettingDictDataListReq) (res []SettingDictDataResp, e error) + List(page request.PageReq, listReq SettingDictDataListReq) (res response.PageResp, e error) + Detail(id uint) (res SettingDictDataResp, e error) + Add(addReq SettingDictDataAddReq) (e error) + Edit(editReq SettingDictDataEditReq) (e error) + Del(delReq SettingDictDataDelReq) (e error) +} + +// NewSettingDictDataService 初始化 +func NewSettingDictDataService(db *gorm.DB) ISettingDictDataService { + return &settingDictDataService{db: db} +} + +// settingDictDataService 字典数据服务实现类 +type settingDictDataService struct { + db *gorm.DB +} + +// All 字典数据所有 +func (ddSrv settingDictDataService) All(allReq SettingDictDataListReq) (res []SettingDictDataResp, e error) { + var dictType setting.DictType + err := ddSrv.db.Where("dict_type = ? AND is_delete = ?", allReq.DictType, 0).Limit(1).First(&dictType).Error + if e = response.CheckErrDBNotRecord(err, "该字典类型不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "All First err"); e != nil { + return + } + ddModel := ddSrv.db.Where("type_id = ? AND is_delete = ?", dictType.ID, 0) + if allReq.Name != "" { + ddModel = ddModel.Where("name like ?", "%"+allReq.Name+"%") + } + if allReq.Value != "" { + ddModel = ddModel.Where("value like ?", "%"+allReq.Value+"%") + } + if allReq.Status >= 0 { + ddModel = ddModel.Where("status = ?", allReq.Status) + } + var dictDatas []setting.DictData + err = ddModel.Order("id desc").Find(&dictDatas).Error + if e = response.CheckErr(err, "All Find err"); e != nil { + return + } + res = []SettingDictDataResp{} + response.Copy(&res, dictDatas) + return +} + +// List 字典数据列表 +func (ddSrv settingDictDataService) List(page request.PageReq, listReq SettingDictDataListReq) (res response.PageResp, e error) { + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + var dictType setting.DictType + err := ddSrv.db.Where("dict_type = ? AND is_delete = ?", listReq.DictType, 0).Limit(1).First(&dictType).Error + if e = response.CheckErrDBNotRecord(err, "该字典类型不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "List First err"); e != nil { + return + } + ddModel := ddSrv.db.Model(&setting.DictData{}).Where("type_id = ? AND is_delete = ?", dictType.ID, 0) + if listReq.Name != "" { + ddModel = ddModel.Where("name like ?", "%"+listReq.Name+"%") + } + if listReq.Value != "" { + ddModel = ddModel.Where("value like ?", "%"+listReq.Value+"%") + } + if listReq.Status >= 0 { + ddModel = ddModel.Where("status = ?", listReq.Status) + } + var count int64 + e = ddModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + var dds []setting.DictData + err = ddModel.Limit(limit).Offset(offset).Order("id desc").Find(&dds).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + dtResp := []SettingDictDataResp{} + response.Copy(&dtResp, dds) + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: dtResp, + }, nil +} + +// Detail 字典数据详情 +func (ddSrv settingDictDataService) Detail(id uint) (res SettingDictDataResp, e error) { + var dd setting.DictData + err := ddSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&dd).Error + if e = response.CheckErrDBNotRecord(err, "字典数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, dd) + return +} + +// Add 字典数据新增 +func (ddSrv settingDictDataService) Add(addReq SettingDictDataAddReq) (e error) { + if r := ddSrv.db.Where("name = ? AND is_delete = ?", addReq.Name, 0).Limit(1).First(&setting.DictData{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典数据已存在!") + } + var dd setting.DictData + response.Copy(&dd, addReq) + err := ddSrv.db.Create(&dd).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 字典数据编辑 +func (ddSrv settingDictDataService) Edit(editReq SettingDictDataEditReq) (e error) { + err := ddSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&setting.DictData{}).Error + if e = response.CheckErrDBNotRecord(err, "字典数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + if r := ddSrv.db.Where("id != ? AND name = ? AND is_delete = ?", editReq.ID, editReq.Name, 0).Limit(1).First(&setting.DictData{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典数据已存在!") + } + var dd setting.DictData + response.Copy(&dd, editReq) + err = ddSrv.db.Save(&dd).Error + e = response.CheckErr(err, "Edit Save err") + return +} + +// Del 字典数据删除 +func (ddSrv settingDictDataService) Del(delReq SettingDictDataDelReq) (e error) { + err := ddSrv.db.Model(&setting.DictData{}).Where("id IN ?", delReq.Ids).Updates( + setting.DictData{IsDelete: 1, DeleteTime: time.Now().Unix()}).Error + return response.CheckErr(err, "Del Update err") +} diff --git a/server/admin/setting/dict_type/dict_type.go b/server/admin/setting/dict_type/dict_type.go new file mode 100644 index 0000000..8a020d6 --- /dev/null +++ b/server/admin/setting/dict_type/dict_type.go @@ -0,0 +1,92 @@ +package dict_type + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func DictTypeRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewSettingDictTypeService(db) + + handle := dictTypeHandler{Service: server} + + rg = rg.Group("/setting", middleware.TokenAuth()) + rg.GET("/dict/type/all", handle.All) + rg.GET("/dict/type/list", handle.List) + rg.GET("/dict/type/detail", handle.Detail) + rg.POST("/dict/type/add", handle.Add) + rg.POST("/dict/type/edit", handle.Edit) + rg.POST("/dict/type/del", handle.Del) +} + +type dictTypeHandler struct { + Service ISettingDictTypeService +} + +// all 字典类型所有 +func (dth dictTypeHandler) All(c *gin.Context) { + res, err := dth.Service.All() + response.CheckAndRespWithData(c, res, err) +} + +// list 字典类型列表 +func (dth dictTypeHandler) List(c *gin.Context) { + var page request.PageReq + var listReq SettingDictTypeListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := dth.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 字典类型详情 +func (dth dictTypeHandler) Detail(c *gin.Context) { + var detailReq SettingDictTypeDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := dth.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// detail 字典类型新增 +func (dth dictTypeHandler) Add(c *gin.Context) { + var addReq SettingDictTypeAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, dth.Service.Add(addReq)) +} + +// edit 字典类型编辑 +func (dth dictTypeHandler) Edit(c *gin.Context) { + var editReq SettingDictTypeEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + response.CheckAndResp(c, dth.Service.Edit(editReq)) +} + +// del 字典类型删除 +func (dth dictTypeHandler) Del(c *gin.Context) { + var delReq SettingDictTypeDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, dth.Service.Del(delReq)) +} diff --git a/server/admin/setting/dict_type/schema.go b/server/admin/setting/dict_type/schema.go new file mode 100644 index 0000000..4080802 --- /dev/null +++ b/server/admin/setting/dict_type/schema.go @@ -0,0 +1,48 @@ +package dict_type + +import "x_admin/core" + +//SettingDictTypeListReq 字典类型新增参数 +type SettingDictTypeListReq struct { + DictName string `form:"dictName" binding:"max=200"` // 字典名称 + DictType string `form:"dictType" binding:"max=200"` // 字典类型 + DictStatus int8 `form:"dictStatus,default=-1" binding:"oneof=-1 0 1"` // 字典状态: 0/1 +} + +//SettingDictTypeDetailReq 字典类型详情参数 +type SettingDictTypeDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SettingDictTypeAddReq 字典类型新增参数 +type SettingDictTypeAddReq struct { + DictName string `form:"dictName" binding:"required,max=200"` // 字典名称 + DictType string `form:"dictType" binding:"required,max=200"` // 字典类型 + DictRemark string `form:"dictRemark" binding:"max=200"` // 字典备注 + DictStatus int8 `form:"dictStatus" binding:"required,oneof=0 1"` // 字典状态: 0/1 +} + +//SettingDictTypeEditReq 字典类型编辑参数 +type SettingDictTypeEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + DictName string `form:"dictName" binding:"required,max=200"` // 字典名称 + DictType string `form:"dictType" binding:"required,max=200"` // 字典类型 + DictRemark string `form:"dictRemark" binding:"max=200"` // 字典备注 + DictStatus int8 `form:"dictStatus" binding:"required,oneof=0 1"` // 字典状态: 0/1 +} + +//SettingDictTypeDelReq 字典类型删除参数 +type SettingDictTypeDelReq struct { + Ids []uint `form:"ids" binding:"required"` // 主键列表 +} + +//SettingDictTypeResp 字典类型返回信息 +type SettingDictTypeResp struct { + ID uint `json:"id" structs:"id"` // 主键 + DictName string `json:"dictName" structs:"dictName"` // 字典名称 + DictType string `json:"dictType" structs:"dictType"` // 字典类型 + DictRemark string `json:"dictRemark" structs:"dictRemark"` // 字典备注 + DictStatus uint8 `json:"dictStatus" structs:"dictStatus"` // 字典状态 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} diff --git a/server/admin/setting/dict_type/service.go b/server/admin/setting/dict_type/service.go new file mode 100644 index 0000000..05b3b18 --- /dev/null +++ b/server/admin/setting/dict_type/service.go @@ -0,0 +1,133 @@ +package dict_type + +import ( + "time" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/setting" + + "gorm.io/gorm" +) + +type ISettingDictTypeService interface { + All() (res []SettingDictTypeResp, e error) + List(page request.PageReq, listReq SettingDictTypeListReq) (res response.PageResp, e error) + Detail(id uint) (res SettingDictTypeResp, e error) + Add(addReq SettingDictTypeAddReq) (e error) + Edit(editReq SettingDictTypeEditReq) (e error) + Del(delReq SettingDictTypeDelReq) (e error) +} + +// NewSettingDictTypeService 初始化 +func NewSettingDictTypeService(db *gorm.DB) ISettingDictTypeService { + return &settingDictTypeService{db: db} +} + +// settingDictTypeService 字典类型服务实现类 +type settingDictTypeService struct { + db *gorm.DB +} + +// All 字典类型所有 +func (dtSrv settingDictTypeService) All() (res []SettingDictTypeResp, e error) { + var dictTypes []setting.DictType + err := dtSrv.db.Where("is_delete = ?", 0).Order("id desc").Find(&dictTypes).Error + if e = response.CheckErr(err, "All Find err"); e != nil { + return + } + res = []SettingDictTypeResp{} + response.Copy(&res, dictTypes) + return +} + +// List 字典类型列表 +func (dtSrv settingDictTypeService) List(page request.PageReq, listReq SettingDictTypeListReq) (res response.PageResp, e error) { + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + dtModel := dtSrv.db.Model(&setting.DictType{}).Where("is_delete = ?", 0) + if listReq.DictName != "" { + dtModel = dtModel.Where("dict_name like ?", "%"+listReq.DictName+"%") + } + if listReq.DictType != "" { + dtModel = dtModel.Where("dict_type like ?", "%"+listReq.DictType+"%") + } + if listReq.DictStatus >= 0 { + dtModel = dtModel.Where("dict_status = ?", listReq.DictStatus) + } + var count int64 + err := dtModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + var dts []setting.DictType + err = dtModel.Limit(limit).Offset(offset).Order("id desc").Find(&dts).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + dtResp := []SettingDictTypeResp{} + response.Copy(&dtResp, dts) + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: dtResp, + }, nil +} + +// Detail 字典类型详情 +func (dtSrv settingDictTypeService) Detail(id uint) (res SettingDictTypeResp, e error) { + var dt setting.DictType + err := dtSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&dt).Error + if e = response.CheckErrDBNotRecord(err, "字典类型不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, dt) + return +} + +// Add 字典类型新增 +func (dtSrv settingDictTypeService) Add(addReq SettingDictTypeAddReq) (e error) { + if r := dtSrv.db.Where("dict_name = ? AND is_delete = ?", addReq.DictName, 0).Limit(1).First(&setting.DictType{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典名称已存在!") + } + if r := dtSrv.db.Where("dict_type = ? AND is_delete = ?", addReq.DictType, 0).Limit(1).First(&setting.DictType{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典类型已存在!") + } + var dt setting.DictType + response.Copy(&dt, addReq) + err := dtSrv.db.Create(&dt).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 字典类型编辑 +func (dtSrv settingDictTypeService) Edit(editReq SettingDictTypeEditReq) (e error) { + err := dtSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&setting.DictType{}).Error + if e = response.CheckErrDBNotRecord(err, "字典类型不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + if r := dtSrv.db.Where("id != ? AND dict_name = ? AND is_delete = ?", editReq.ID, editReq.DictName, 0).Limit(1).First(&setting.DictType{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典名称已存在!") + } + if r := dtSrv.db.Where("id != ? AND dict_type = ? AND is_delete = ?", editReq.ID, editReq.DictType, 0).Limit(1).First(&setting.DictType{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("字典类型已存在!") + } + var dt setting.DictType + response.Copy(&dt, editReq) + err = dtSrv.db.Save(&dt).Error + e = response.CheckErr(err, "Edit Save err") + return +} + +// Del 字典类型删除 +func (dtSrv settingDictTypeService) Del(delReq SettingDictTypeDelReq) (e error) { + err := dtSrv.db.Model(&setting.DictType{}).Where("id IN ?", delReq.Ids).Updates( + setting.DictType{IsDelete: 1, DeleteTime: time.Now().Unix()}).Error + return response.CheckErr(err, "Del Update err") +} diff --git a/server/admin/setting/protocol/protocol.go b/server/admin/setting/protocol/protocol.go new file mode 100644 index 0000000..95bc8d7 --- /dev/null +++ b/server/admin/setting/protocol/protocol.go @@ -0,0 +1,45 @@ +package protocol + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func ProtocolRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewSettingProtocolService(db) + + handle := protocolHandler{Service: server} + + rg = rg.Group("/setting", middleware.TokenAuth()) + rg.GET("/protocol/detail", handle.Detail) + rg.POST("/protocol/save", handle.save) +} + +type protocolHandler struct { + Service ISettingProtocolService +} + +// detail 获取政策信息 +func (ph protocolHandler) Detail(c *gin.Context) { + res, err := ph.Service.Detail() + response.CheckAndRespWithData(c, res, err) +} + +// save 保存政策信息 +func (ph protocolHandler) save(c *gin.Context) { + var pReq SettingProtocolReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &pReq)) { + return + } + response.CheckAndResp(c, ph.Service.Save(pReq)) +} diff --git a/server/admin/setting/protocol/schema.go b/server/admin/setting/protocol/schema.go new file mode 100644 index 0000000..7692166 --- /dev/null +++ b/server/admin/setting/protocol/schema.go @@ -0,0 +1,13 @@ +package protocol + +//SettingProtocolItem 政策通用参数 +type SettingProtocolItem struct { + Name string `form:"name" json:"name"` // 名称 + Content string `form:"content" json:"content"` // 内容 +} + +//SettingProtocolReq 保存政策信息参数 +type SettingProtocolReq struct { + Service SettingProtocolItem `form:"service" json:"service"` // 服务协议 + Privacy SettingProtocolItem `form:"privacy" json:"privacy"` // 隐私协议 +} diff --git a/server/admin/setting/protocol/service.go b/server/admin/setting/protocol/service.go new file mode 100644 index 0000000..08eca2b --- /dev/null +++ b/server/admin/setting/protocol/service.go @@ -0,0 +1,67 @@ +package protocol + +import ( + "x_admin/core/response" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISettingProtocolService interface { + Detail() (res map[string]interface{}, e error) + Save(pReq SettingProtocolReq) (e error) +} + +// NewSettingProtocolService 初始化 +func NewSettingProtocolService(db *gorm.DB) ISettingProtocolService { + return &settingProtocolService{db: db} +} + +// settingProtocolService 政策协议服务实现类 +type settingProtocolService struct { + db *gorm.DB +} + +// Detail 获取政策协议信息 +func (cSrv settingProtocolService) Detail() (res map[string]interface{}, e error) { + defaultVal := `{"name":"","content":""}` + json, err := util.ConfigUtil.GetVal(cSrv.db, "protocol", "service", defaultVal) + if e = response.CheckErr(err, "Detail GetVal service err"); e != nil { + return + } + var service map[string]interface{} + if e = response.CheckErr(util.ToolsUtil.JsonToObj(json, &service), "Detail JsonToObj service err"); e != nil { + return + } + json, err = util.ConfigUtil.GetVal(cSrv.db, "protocol", "privacy", defaultVal) + if e = response.CheckErr(err, "Detail GetVal privacy err"); e != nil { + return + } + var privacy map[string]interface{} + if e = response.CheckErr(util.ToolsUtil.JsonToObj(json, &privacy), "Detail JsonToObj privacy err"); e != nil { + return + } + return map[string]interface{}{ + "service": service, + "privacy": privacy, + }, nil +} + +// Save 保存政策协议信息 +func (cSrv settingProtocolService) Save(pReq SettingProtocolReq) (e error) { + serviceJson, err := util.ToolsUtil.ObjToJson(pReq.Service) + if e = response.CheckErr(err, "Save ObjToJson service err"); e != nil { + return + } + privacyJson, err := util.ToolsUtil.ObjToJson(pReq.Privacy) + if e = response.CheckErr(err, "Save ObjToJson privacy err"); e != nil { + return + } + err = util.ConfigUtil.Set(cSrv.db, "protocol", "service", serviceJson) + if e = response.CheckErr(err, "Save Set service err"); e != nil { + return + } + err = util.ConfigUtil.Set(cSrv.db, "protocol", "privacy", privacyJson) + e = response.CheckErr(err, "Save Set privacy err") + return +} diff --git a/server/admin/setting/storage/schema.go b/server/admin/setting/storage/schema.go new file mode 100644 index 0000000..6dbfac4 --- /dev/null +++ b/server/admin/setting/storage/schema.go @@ -0,0 +1,23 @@ +package storage + +//SettingStorageDetailReq 存储详情参数 +type SettingStorageDetailReq struct { + Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun] +} + +//SettingStorageEditReq 存储编辑参数 +type SettingStorageEditReq struct { + Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun] + Status int `form:"status" binding:"oneof=0 1"` // 状态: 0/1 + Bucket string `form:"bucket"` // 存储空间名 + SecretKey string `form:"secretKey"` // SK + AccessKey string `form:"accessKey"` // AK + Domain string `form:"domain"` // 访问域名 + Region string `form:"region"` // 地区,腾讯存储特有 +} + +//SettingStorageChangeReq 存储切换参数 +type SettingStorageChangeReq struct { + Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun] + Status int `form:"status" binding:"oneof=0 1"` // 状态: 0/1 +} diff --git a/server/admin/setting/storage/service.go b/server/admin/setting/storage/service.go new file mode 100644 index 0000000..cb2cebe --- /dev/null +++ b/server/admin/setting/storage/service.go @@ -0,0 +1,103 @@ +package storage + +import ( + "fmt" + "x_admin/core/response" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISettingStorageService interface { + List() ([]map[string]interface{}, error) + Detail(alias string) (res map[string]interface{}, e error) + Edit(editReq SettingStorageEditReq) (e error) + Change(alias string, status int) (e error) +} + +// NewSettingStorageService 初始化 +func NewSettingStorageService(db *gorm.DB) ISettingStorageService { + return &settingStorageService{db: db} +} + +// settingStorageService 存储配置服务实现类 +type settingStorageService struct { + db *gorm.DB +} + +var storageList = []map[string]interface{}{ + {"name": "本地存储", "alias": "local", "describe": "存储在本地服务器", "status": 0}, +} + +// List 存储列表 +func (sSrv settingStorageService) List() ([]map[string]interface{}, error) { + // TODO: engine默认local + engine := "local" + mapList := storageList + for i := 0; i < len(mapList); i++ { + if engine == mapList[i]["alias"] { + mapList[i]["status"] = 1 + } + } + return mapList, nil +} + +// Detail 存储详情 +func (sSrv settingStorageService) Detail(alias string) (res map[string]interface{}, e error) { + // TODO: engine默认local + engine := "local" + cnf, err := util.ConfigUtil.GetMap(sSrv.db, "storage", alias) + if e = response.CheckErr(err, "Detail GetMap err"); e != nil { + return + } + status := 0 + if engine == alias { + status = 1 + } + return map[string]interface{}{ + "name": cnf["name"], + "alias": alias, + "status": status, + }, nil +} + +// Edit 存储编辑 +func (sSrv settingStorageService) Edit(editReq SettingStorageEditReq) (e error) { + // TODO: engine默认local + engine := "local" + if engine != editReq.Alias { + return response.Failed.Make(fmt.Sprintf("engine:%s 暂时不支持", editReq.Alias)) + } + json, err := util.ToolsUtil.ObjToJson(map[string]interface{}{"name": "本地存储"}) + if e = response.CheckErr(err, "Edit ObjToJson err"); e != nil { + return + } + err = util.ConfigUtil.Set(sSrv.db, "storage", editReq.Alias, json) + if e = response.CheckErr(err, "Edit Set alias err"); e != nil { + return + } + if editReq.Status == 1 { + err = util.ConfigUtil.Set(sSrv.db, "storage", "default", editReq.Alias) + } else { + util.ConfigUtil.Set(sSrv.db, "storage", "default", "") + } + e = response.CheckErr(err, "Edit Set default err") + return +} + +// Change 存储切换 +func (sSrv settingStorageService) Change(alias string, status int) (e error) { + // TODO: engine默认local + engine := "local" + if engine != alias { + return response.Failed.Make(fmt.Sprintf("engine:%s 暂时不支持", alias)) + } + var err error + if engine == alias && status == 0 { + err = util.ConfigUtil.Set(sSrv.db, "storage", "default", "") + } else { + err = util.ConfigUtil.Set(sSrv.db, "storage", "default", alias) + } + e = response.CheckErr(err, "Change Set err") + return +} diff --git a/server/admin/setting/storage/storage.go b/server/admin/setting/storage/storage.go new file mode 100644 index 0000000..66d2741 --- /dev/null +++ b/server/admin/setting/storage/storage.go @@ -0,0 +1,66 @@ +package storage + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func StorageRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewSettingStorageService(db) + + handle := storageHandler{Service: server} + + rg = rg.Group("/setting", middleware.TokenAuth()) + rg.GET("/storage/list", handle.List) + rg.GET("/storage/detail", handle.Detail) + rg.POST("/storage/edit", handle.Edit) + rg.POST("/storage/change", handle.change) +} + +type storageHandler struct { + Service ISettingStorageService +} + +// list 存储列表 +func (sh storageHandler) List(c *gin.Context) { + res, err := sh.Service.List() + response.CheckAndRespWithData(c, res, err) +} + +// detail 存储详情 +func (sh storageHandler) Detail(c *gin.Context) { + var detailReq SettingStorageDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := sh.Service.Detail(detailReq.Alias) + response.CheckAndRespWithData(c, res, err) +} + +// edit 存储编辑 +func (sh storageHandler) Edit(c *gin.Context) { + var editReq SettingStorageEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, sh.Service.Edit(editReq)) +} + +// change 存储切换 +func (sh storageHandler) change(c *gin.Context) { + var changeReq SettingStorageChangeReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &changeReq)) { + return + } + response.CheckAndResp(c, sh.Service.Change(changeReq.Alias, changeReq.Status)) +} diff --git a/server/admin/setting/website/schema.go b/server/admin/setting/website/schema.go new file mode 100644 index 0000000..2ef8842 --- /dev/null +++ b/server/admin/setting/website/schema.go @@ -0,0 +1,11 @@ +package website + +//SettingWebsiteReq 保存网站信息参数 +type SettingWebsiteReq struct { + Name string `form:"name"` // 网站名称 + Logo string `form:"logo"` // 网站图标 + Favicon string `form:"favicon"` // 网站LOGO + Backdrop string `form:"backdrop"` // 登录页广告图 + ShopName string `form:"shopName"` // 商城名称 + ShopLogo string `form:"shopLogo"` // 商城Logo +} diff --git a/server/admin/setting/website/service.go b/server/admin/setting/website/service.go new file mode 100644 index 0000000..a78bff6 --- /dev/null +++ b/server/admin/setting/website/service.go @@ -0,0 +1,66 @@ +package website + +import ( + "x_admin/core/response" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISettingWebsiteService interface { + Detail() (res map[string]string, e error) + Save(wsReq SettingWebsiteReq) (e error) +} + +// NewSettingWebsiteService 初始化 +func NewSettingWebsiteService(db *gorm.DB) ISettingWebsiteService { + return &settingWebsiteService{db: db} +} + +// settingWebsiteService 网站信息配置服务实现类 +type settingWebsiteService struct { + db *gorm.DB +} + +// Detail 获取网站信息 +func (wSrv settingWebsiteService) Detail() (res map[string]string, e error) { + data, err := util.ConfigUtil.Get(wSrv.db, "website") + if e = response.CheckErr(err, "Detail Get err"); e != nil { + return + } + return map[string]string{ + "name": data["name"], + "logo": util.UrlUtil.ToAbsoluteUrl(data["logo"]), + "favicon": util.UrlUtil.ToAbsoluteUrl(data["favicon"]), + "backdrop": util.UrlUtil.ToAbsoluteUrl(data["backdrop"]), + "shopName": data["shopName"], + "shopLogo": util.UrlUtil.ToAbsoluteUrl(data["shopLogo"]), + }, nil +} + +// Save 保存网站信息 +func (wSrv settingWebsiteService) Save(wsReq SettingWebsiteReq) (e error) { + err := util.ConfigUtil.Set(wSrv.db, "website", "name", wsReq.Name) + if e = response.CheckErr(err, "Save Set name err"); e != nil { + return + } + err = util.ConfigUtil.Set(wSrv.db, "website", "logo", util.UrlUtil.ToRelativeUrl(wsReq.Logo)) + if e = response.CheckErr(err, "Save Set logo err"); e != nil { + return + } + err = util.ConfigUtil.Set(wSrv.db, "website", "favicon", util.UrlUtil.ToRelativeUrl(wsReq.Favicon)) + if e = response.CheckErr(err, "Save Set favicon err"); e != nil { + return + } + err = util.ConfigUtil.Set(wSrv.db, "website", "backdrop", util.UrlUtil.ToRelativeUrl(wsReq.Backdrop)) + if e = response.CheckErr(err, "Save Set backdrop err"); e != nil { + return + } + err = util.ConfigUtil.Set(wSrv.db, "website", "shopName", wsReq.ShopName) + if e = response.CheckErr(err, "Save Set shopName err"); e != nil { + return + } + err = util.ConfigUtil.Set(wSrv.db, "website", "shopLogo", util.UrlUtil.ToRelativeUrl(wsReq.ShopLogo)) + e = response.CheckErr(err, "Save Set shopLogo err") + return +} diff --git a/server/admin/setting/website/website.go b/server/admin/setting/website/website.go new file mode 100644 index 0000000..14806e0 --- /dev/null +++ b/server/admin/setting/website/website.go @@ -0,0 +1,45 @@ +package website + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func WebsiteRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewSettingWebsiteService(db) + + handle := websiteHandler{Service: server} + + rg = rg.Group("/setting", middleware.TokenAuth()) + rg.GET("/website/detail", handle.Detail) + rg.POST("/website/save", handle.save) +} + +type websiteHandler struct { + Service ISettingWebsiteService +} + +// detail 获取网站信息 +func (wh websiteHandler) Detail(c *gin.Context) { + res, err := wh.Service.Detail() + response.CheckAndRespWithData(c, res, err) +} + +// save 保存网站信息 +func (wh websiteHandler) save(c *gin.Context) { + var wsReq SettingWebsiteReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &wsReq)) { + return + } + response.CheckAndResp(c, wh.Service.Save(wsReq)) +} diff --git a/server/admin/system/admin/admin.go b/server/admin/system/admin/admin.go new file mode 100644 index 0000000..347a336 --- /dev/null +++ b/server/admin/system/admin/admin.go @@ -0,0 +1,114 @@ +package admin + +import ( + "x_admin/config" + "x_admin/core/request" + "x_admin/core/response" + + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +// func AdminRoute(rg *gin.RouterGroup) { +// db := core.GetDB() + +// permSrv := role.NewSystemAuthPermService(db) +// roleSrv := role.NewSystemAuthRoleService(db, permSrv) +// adminSrv := NewSystemAuthAdminService(db, permSrv, roleSrv) +// // service := NewSystemLoginService(db, adminSrv) + +// handle := AdminHandler{Service: adminSrv} + +// rg = rg.Group("/system", middleware.TokenAuth()) + +// rg.GET("/admin/self", handle.self) +// rg.GET("/admin/list", handle.List) +// rg.GET("/admin/detail", handle.Detail) +// rg.POST("/admin/add", middleware.RecordLog("管理员新增"), handle.Add) +// rg.POST("/admin/edit", middleware.RecordLog("管理员编辑"), handle.Edit) +// rg.POST("/admin/upInfo", middleware.RecordLog("管理员更新"), handle.upInfo) +// rg.POST("/admin/del", middleware.RecordLog("管理员删除"), handle.Del) +// rg.POST("/admin/disable", middleware.RecordLog("管理员状态切换"), handle.disable) +// } + +type AdminHandler struct { + Service ISystemAuthAdminService +} + +// self 管理员信息 +func (ah AdminHandler) Self(c *gin.Context) { + adminId := config.AdminConfig.GetAdminId(c) + res, err := ah.Service.Self(adminId) + response.CheckAndRespWithData(c, res, err) +} + +// list 管理员列表 +func (ah AdminHandler) List(c *gin.Context) { + var page request.PageReq + var listReq SystemAuthAdminListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := ah.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 管理员详细 +func (ah AdminHandler) Detail(c *gin.Context) { + var detailReq SystemAuthAdminDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := ah.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// add 管理员新增 +func (ah AdminHandler) Add(c *gin.Context) { + var addReq SystemAuthAdminAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, ah.Service.Add(addReq)) +} + +// edit 管理员编辑 +func (ah AdminHandler) Edit(c *gin.Context) { + var editReq SystemAuthAdminEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + response.CheckAndResp(c, ah.Service.Edit(c, editReq)) +} + +// upInfo 管理员更新 +func (ah AdminHandler) UpInfo(c *gin.Context) { + var updateReq SystemAuthAdminUpdateReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &updateReq)) { + return + } + response.CheckAndResp(c, ah.Service.Update( + c, updateReq, config.AdminConfig.GetAdminId(c))) +} + +// del 管理员删除 +func (ah AdminHandler) Del(c *gin.Context) { + var delReq SystemAuthAdminDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, ah.Service.Del(c, delReq.ID)) +} + +// disable 管理员状态切换 +func (ah AdminHandler) Disable(c *gin.Context) { + var disableReq SystemAuthAdminDisableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &disableReq)) { + return + } + response.CheckAndResp(c, ah.Service.Disable(c, disableReq.ID)) +} diff --git a/server/admin/system/admin/schema.go b/server/admin/system/admin/schema.go new file mode 100644 index 0000000..54f905a --- /dev/null +++ b/server/admin/system/admin/schema.go @@ -0,0 +1,102 @@ +package admin + +import "x_admin/core" + +//SystemAuthAdminListReq 管理员列表参数 +type SystemAuthAdminListReq struct { + Username string `form:"username"` // 账号 + Nickname string `form:"nickname"` // 昵称 + Role int `form:"role,default=-1"` // 角色ID +} + +//SystemAuthAdminDetailReq 管理员详情参数 +type SystemAuthAdminDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthAdminAddReq 管理员新增参数 +type SystemAuthAdminAddReq struct { + DeptId uint `form:"deptId" binding:"required,gt=0"` // 部门ID + PostId uint `form:"postId" binding:"required,gt=0"` // 岗位ID + Username string `form:"username" binding:"required,min=2,max=20"` // 账号 + Nickname string `form:"nickname" binding:"required,min=2,max=30"` // 昵称 + Password string `form:"password" binding:"required"` // 密码 + Avatar string `form:"avatar" binding:"required"` // 头像 + Role uint `form:"role" binding:"gte=0"` // 角色 + Sort int `form:"sort" binding:"gte=0"` // 排序 + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] + IsMultipoint uint8 `form:"isMultipoint" binding:"oneof=0 1"` // 多端登录: [0=否, 1=是] +} + +//SystemAuthAdminEditReq 管理员编辑参数 +type SystemAuthAdminEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + DeptId uint `form:"deptId" binding:"required,gt=0"` // 部门ID + PostId uint `form:"postId" binding:"required,gt=0"` // 岗位ID + Username string `form:"username" binding:"required,min=2,max=20"` // 账号 + Nickname string `form:"nickname" binding:"required,min=2,max=30"` // 昵称 + Password string `form:"password"` // 密码 + Avatar string `form:"avatar"` // 头像 + Role uint `form:"role" binding:"gte=0"` // 角色 + Sort int `form:"sort" binding:"gte=0"` // 排序 + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] + IsMultipoint uint8 `form:"isMultipoint" binding:"oneof=0 1"` // 多端登录: [0=否, 1=是] +} + +//SystemAuthAdminUpdateReq 管理员更新参数 +type SystemAuthAdminUpdateReq struct { + Nickname string `form:"nickname" binding:"required,min=2,max=30"` // 昵称 + Avatar string `form:"avatar"` // 头像 + Password string `form:"password" binding:"required"` // 密码 + CurrPassword string `form:"currPassword" binding:"required,min=6,max=32"` // 密码 +} + +//SystemAuthAdminDelReq 管理员删除参数 +type SystemAuthAdminDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthAdminDisableReq 管理员状态切换参数 +type SystemAuthAdminDisableReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthAdminResp 管理员返回信息 +type SystemAuthAdminResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Username string `json:"username" structs:"username"` // 账号 + Nickname string `json:"nickname" structs:"nickname"` // 昵称 + Avatar string `json:"avatar" structs:"avatar"` // 头像 + Role string `json:"role" structs:"role"` // 角色 + DeptId uint `json:"deptId" structs:"deptId"` // 部门ID + PostId uint `json:"postId" structs:"postId"` // 岗位ID + Dept string `json:"dept" structs:"dept"` // 部门 + IsMultipoint uint8 `json:"isMultipoint" structs:"isMultipoint"` // 多端登录: [0=否, 1=是] + IsDisable uint8 `json:"isDisable" structs:"isDisable"` // 是否禁用: [0=否, 1=是] + LastLoginIp string `json:"lastLoginIp" structs:"lastLoginIp"` // 最后登录IP + LastLoginTime core.TsTime `json:"lastLoginTime" structs:"lastLoginTime"` // 最后登录时间 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +//SystemAuthAdminSelfOneResp 当前管理员返回部分信息 +type SystemAuthAdminSelfOneResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Username string `json:"username" structs:"username"` // 账号 + Nickname string `json:"nickname" structs:"nickname"` // 昵称 + Avatar string `json:"avatar" structs:"avatar"` // 头像 + Role string `json:"role" structs:"role"` // 角色 + Dept string `json:"dept" structs:"dept"` // 部门 + IsMultipoint uint8 `json:"isMultipoint" structs:"isMultipoint"` // 多端登录: [0=否, 1=是] + IsDisable uint8 `json:"isDisable" structs:"isDisable"` // 是否禁用: [0=否, 1=是] + LastLoginIp string `json:"lastLoginIp" structs:"lastLoginIp"` // 最后登录IP + LastLoginTime core.TsTime `json:"lastLoginTime" structs:"lastLoginTime"` // 最后登录时间 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +//SystemAuthAdminSelfResp 当前系统管理员返回信息 +type SystemAuthAdminSelfResp struct { + User SystemAuthAdminSelfOneResp `json:"user" structs:"user"` // 用户信息 + Permissions []string `json:"permissions" structs:"permissions"` // 权限集合: [[*]=>所有权限, ['article:add']=>部分权限] +} diff --git a/server/admin/system/admin/service.go b/server/admin/system/admin/service.go new file mode 100644 index 0000000..87c1f68 --- /dev/null +++ b/server/admin/system/admin/service.go @@ -0,0 +1,407 @@ +package admin + +import ( + "fmt" + + "strconv" + "strings" + "time" + "x_admin/admin/system/role" + "x_admin/config" + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "github.com/fatih/structs" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type ISystemAuthAdminService interface { + FindByUsername(username string) (admin system.SystemAuthAdmin, err error) + Self(adminId uint) (res SystemAuthAdminSelfResp, e error) + List(page request.PageReq, listReq SystemAuthAdminListReq) (res response.PageResp, e error) + Detail(id uint) (res SystemAuthAdminResp, e error) + Add(addReq SystemAuthAdminAddReq) (e error) + Edit(c *gin.Context, editReq SystemAuthAdminEditReq) (e error) + Update(c *gin.Context, updateReq SystemAuthAdminUpdateReq, adminId uint) (e error) + Del(c *gin.Context, id uint) (e error) + Disable(c *gin.Context, id uint) (e error) + CacheAdminUserByUid(id uint) (err error) +} + +// NewSystemAuthAdminService 初始化 +func NewSystemAuthAdminService(db *gorm.DB, permSrv role.ISystemAuthPermService, roleSrv role.ISystemAuthRoleService) ISystemAuthAdminService { + return &systemAuthAdminService{db: db, permSrv: permSrv, roleSrv: roleSrv} +} + +// systemAuthAdminService 系统管理员服务实现类 +type systemAuthAdminService struct { + db *gorm.DB + permSrv role.ISystemAuthPermService + roleSrv role.ISystemAuthRoleService +} + +// FindByUsername 根据账号查找管理员 +func (adminSrv systemAuthAdminService) FindByUsername(username string) (admin system.SystemAuthAdmin, err error) { + err = adminSrv.db.Where("username = ?", username).Limit(1).First(&admin).Error + return +} + +// Self 当前管理员 +func (adminSrv systemAuthAdminService) Self(adminId uint) (res SystemAuthAdminSelfResp, e error) { + // 管理员信息 + var sysAdmin system.SystemAuthAdmin + err := adminSrv.db.Where("id = ? AND is_delete = ?", adminId, 0).Limit(1).First(&sysAdmin).Error + if e = response.CheckErr(err, "Self First err"); e != nil { + return + } + // 角色权限 + var auths []string + if adminId > 1 { + roleId, _ := strconv.ParseUint(sysAdmin.Role, 10, 32) + var menuIds []uint + if menuIds, e = adminSrv.permSrv.SelectMenuIdsByRoleId(uint(roleId)); e != nil { + return + } + if len(menuIds) > 0 { + var menus []system.SystemAuthMenu + err := adminSrv.db.Where( + "id in ? AND is_disable = ? AND menu_type in ?", menuIds, 0, []string{"C", "A"}).Order( + "menu_sort, id").Find(&menus).Error + if e = response.CheckErr(err, "Self SystemAuthMenu Find err"); e != nil { + return + } + if len(menus) > 0 { + for _, v := range menus { + auths = append(auths, strings.Trim(v.Perms, " ")) + } + } + } + if len(auths) > 0 { + auths = append(auths, "") + } + } else { + auths = append(auths, "*") + } + var admin SystemAuthAdminSelfOneResp + response.Copy(&admin, sysAdmin) + admin.Dept = strconv.FormatUint(uint64(sysAdmin.DeptId), 10) + admin.Avatar = util.UrlUtil.ToAbsoluteUrl(sysAdmin.Avatar) + return SystemAuthAdminSelfResp{User: admin, Permissions: auths}, nil +} + +// List 管理员列表 +func (adminSrv systemAuthAdminService) List(page request.PageReq, listReq SystemAuthAdminListReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + adminTbName := core.DBTableName(&system.SystemAuthAdmin{}) + roleTbName := core.DBTableName(&system.SystemAuthRole{}) + deptTbName := core.DBTableName(&system.SystemAuthDept{}) + adminModel := adminSrv.db.Table(adminTbName+" AS admin").Where("admin.is_delete = ?", 0).Joins( + fmt.Sprintf("LEFT JOIN %s ON admin.role = %s.id", roleTbName, roleTbName)).Joins( + fmt.Sprintf("LEFT JOIN %s ON admin.dept_id = %s.id", deptTbName, deptTbName)).Select( + fmt.Sprintf("admin.*, %s.name as dept, %s.name as role", deptTbName, roleTbName)) + // 条件 + if listReq.Username != "" { + adminModel = adminModel.Where("username like ?", "%"+listReq.Username+"%") + } + if listReq.Nickname != "" { + adminModel = adminModel.Where("nickname like ?", "%"+listReq.Nickname+"%") + } + if listReq.Role >= 0 { + adminModel = adminModel.Where("role = ?", listReq.Role) + } + // 总数 + var count int64 + err := adminModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + // 数据 + var adminResp []SystemAuthAdminResp + err = adminModel.Limit(limit).Offset(offset).Order("id desc, sort desc").Find(&adminResp).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + for i := 0; i < len(adminResp); i++ { + adminResp[i].Avatar = util.UrlUtil.ToAbsoluteUrl(adminResp[i].Avatar) + if adminResp[i].ID == 1 { + adminResp[i].Role = "系统管理员" + } + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: adminResp, + }, nil +} + +// Detail 管理员详细 +func (adminSrv systemAuthAdminService) Detail(id uint) (res SystemAuthAdminResp, e error) { + var sysAdmin system.SystemAuthAdmin + err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&sysAdmin).Error + if e = response.CheckErrDBNotRecord(err, "账号已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, sysAdmin) + res.Avatar = util.UrlUtil.ToAbsoluteUrl(res.Avatar) + if res.Dept == "" { + res.Dept = strconv.FormatUint(uint64(res.DeptId), 10) + } + return +} + +// Add 管理员新增 +func (adminSrv systemAuthAdminService) Add(addReq SystemAuthAdminAddReq) (e error) { + var sysAdmin system.SystemAuthAdmin + // 检查username + r := adminSrv.db.Where("username = ? AND is_delete = ?", addReq.Username, 0).Limit(1).Find(&sysAdmin) + err := r.Error + if e = response.CheckErr(err, "Add Find by username err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("账号已存在换一个吧!") + } + // 检查nickname + r = adminSrv.db.Where("nickname = ? AND is_delete = ?", addReq.Nickname, 0).Limit(1).Find(&sysAdmin) + err = r.Error + if e = response.CheckErr(err, "Add Find by nickname err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("昵称已存在换一个吧!") + } + var roleResp role.SystemAuthRoleResp + if roleResp, e = adminSrv.roleSrv.Detail(addReq.Role); e != nil { + return + } + if roleResp.IsDisable > 0 { + return response.AssertArgumentError.Make("当前角色已被禁用!") + } + passwdLen := len(addReq.Password) + if !(passwdLen >= 6 && passwdLen <= 20) { + return response.Failed.Make("密码必须在6~20位") + } + salt := util.ToolsUtil.RandomString(5) + response.Copy(&sysAdmin, addReq) + sysAdmin.Role = strconv.FormatUint(uint64(addReq.Role), 10) + sysAdmin.Salt = salt + sysAdmin.Password = util.ToolsUtil.MakeMd5(strings.Trim(addReq.Password, " ") + salt) + if addReq.Avatar == "" { + addReq.Avatar = "/api/static/backend_avatar.png" + } + sysAdmin.Avatar = util.UrlUtil.ToRelativeUrl(addReq.Avatar) + err = adminSrv.db.Create(&sysAdmin).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 管理员编辑 +func (adminSrv systemAuthAdminService) Edit(c *gin.Context, editReq SystemAuthAdminEditReq) (e error) { + // 检查id + err := adminSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&system.SystemAuthAdmin{}).Error + if e = response.CheckErrDBNotRecord(err, "账号不存在了!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + // 检查username + var admin system.SystemAuthAdmin + r := adminSrv.db.Where("username = ? AND is_delete = ? AND id != ?", editReq.Username, 0, editReq.ID).Find(&admin) + err = r.Error + if e = response.CheckErr(err, "Edit Find by username err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("账号已存在换一个吧!") + } + // 检查nickname + r = adminSrv.db.Where("nickname = ? AND is_delete = ? AND id != ?", editReq.Nickname, 0, editReq.ID).Find(&admin) + err = r.Error + if e = response.CheckErr(err, "Edit Find by nickname err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("昵称已存在换一个吧!") + } + // 检查role + if editReq.Role > 0 && editReq.ID != 1 { + if _, e = adminSrv.roleSrv.Detail(editReq.Role); e != nil { + return + } + } + // 更新管理员信息 + adminMap := structs.Map(editReq) + delete(adminMap, "ID") + adminMap["Avatar"] = util.UrlUtil.ToRelativeUrl(editReq.Avatar) + role := editReq.Role + if editReq.ID == 1 { + role = 0 + } + adminMap["Role"] = strconv.FormatUint(uint64(role), 10) + if editReq.ID == 1 { + delete(adminMap, "Username") + } + if editReq.Password != "" { + passwdLen := len(editReq.Password) + if !(passwdLen >= 6 && passwdLen <= 20) { + return response.Failed.Make("密码必须在6~20位") + } + salt := util.ToolsUtil.RandomString(5) + adminMap["Salt"] = salt + adminMap["Password"] = util.ToolsUtil.MakeMd5(strings.Trim(editReq.Password, "") + salt) + } else { + delete(adminMap, "Password") + } + err = adminSrv.db.Model(&admin).Where("id = ?", editReq.ID).Updates(adminMap).Error + if e = response.CheckErr(err, "Edit Updates err"); e != nil { + return + } + adminSrv.CacheAdminUserByUid(editReq.ID) + // 如果更改自己的密码,则删除旧缓存 + adminId := config.AdminConfig.GetAdminId(c) + if editReq.Password != "" && editReq.ID == adminId { + token := c.Request.Header.Get("token") + util.RedisUtil.Del(config.AdminConfig.BackstageTokenKey + token) + adminSetKey := config.AdminConfig.BackstageTokenSet + strconv.FormatUint(uint64(adminId), 10) + ts := util.RedisUtil.SGet(adminSetKey) + if len(ts) > 0 { + var tokenKeys []string + for _, t := range ts { + tokenKeys = append(tokenKeys, config.AdminConfig.BackstageTokenKey+t) + } + util.RedisUtil.Del(tokenKeys...) + } + util.RedisUtil.Del(adminSetKey) + util.RedisUtil.SSet(adminSetKey, token) + } + return +} + +// Update 管理员更新 +func (adminSrv systemAuthAdminService) Update(c *gin.Context, updateReq SystemAuthAdminUpdateReq, adminId uint) (e error) { + // 检查id + var admin system.SystemAuthAdmin + err := adminSrv.db.Where("id = ? AND is_delete = ?", adminId, 0).Limit(1).First(&admin).Error + if e = response.CheckErrDBNotRecord(err, "账号不存在了!"); e != nil { + return + } + if e = response.CheckErr(err, "Update First err"); e != nil { + return + } + // 更新管理员信息 + adminMap := structs.Map(updateReq) + delete(adminMap, "CurrPassword") + avatar := "/api/static/backend_avatar.png" + if updateReq.Avatar != "" { + avatar = updateReq.Avatar + } + adminMap["Avatar"] = util.UrlUtil.ToRelativeUrl(avatar) + delete(adminMap, "aaa") + if updateReq.Password != "" { + currPass := util.ToolsUtil.MakeMd5(updateReq.CurrPassword + admin.Salt) + if currPass != admin.Password { + return response.Failed.Make("当前密码不正确!") + } + passwdLen := len(updateReq.Password) + if !(passwdLen >= 6 && passwdLen <= 20) { + return response.Failed.Make("密码必须在6~20位") + } + salt := util.ToolsUtil.RandomString(5) + adminMap["Salt"] = salt + adminMap["Password"] = util.ToolsUtil.MakeMd5(strings.Trim(updateReq.Password, " ") + salt) + } else { + delete(adminMap, "Password") + } + err = adminSrv.db.Model(&admin).Updates(adminMap).Error + if e = response.CheckErr(err, "Update Updates err"); e != nil { + return + } + adminSrv.CacheAdminUserByUid(adminId) + // 如果更改自己的密码,则删除旧缓存 + if updateReq.Password != "" { + token := c.Request.Header.Get("token") + util.RedisUtil.Del(config.AdminConfig.BackstageTokenKey + token) + adminSetKey := config.AdminConfig.BackstageTokenSet + strconv.FormatUint(uint64(adminId), 10) + ts := util.RedisUtil.SGet(adminSetKey) + if len(ts) > 0 { + var tokenKeys []string + for _, t := range ts { + tokenKeys = append(tokenKeys, config.AdminConfig.BackstageTokenKey+t) + } + util.RedisUtil.Del(tokenKeys...) + } + util.RedisUtil.Del(adminSetKey) + util.RedisUtil.SSet(adminSetKey, token) + } + return +} + +// Del 管理员删除 +func (adminSrv systemAuthAdminService) Del(c *gin.Context, id uint) (e error) { + var admin system.SystemAuthAdmin + err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&admin).Error + if e = response.CheckErrDBNotRecord(err, "账号已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + if id == 1 { + return response.AssertArgumentError.Make("系统管理员不允许删除!") + } + if id == config.AdminConfig.GetAdminId(c) { + return response.AssertArgumentError.Make("不能删除自己!") + } + err = adminSrv.db.Model(&admin).Updates(system.SystemAuthAdmin{IsDelete: 1, DeleteTime: time.Now().Unix()}).Error + e = response.CheckErr(err, "Del Updates err") + return +} + +// Disable 管理员状态切换 +func (adminSrv systemAuthAdminService) Disable(c *gin.Context, id uint) (e error) { + var admin system.SystemAuthAdmin + err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).Find(&admin).Error + if e = response.CheckErr(err, "Disable Find err"); e != nil { + return + } + if admin.ID == 0 { + return response.AssertArgumentError.Make("账号已不存在!") + } + if id == config.AdminConfig.GetAdminId(c) { + return response.AssertArgumentError.Make("不能禁用自己!") + } + var isDisable uint8 + if admin.IsDisable == 0 { + isDisable = 1 + } + err = adminSrv.db.Model(&admin).Updates(system.SystemAuthAdmin{IsDisable: isDisable, UpdateTime: time.Now().Unix()}).Error + e = response.CheckErr(err, "Disable Updates err") + return +} + +// CacheAdminUserByUid 缓存管理员 +func (adminSrv systemAuthAdminService) CacheAdminUserByUid(id uint) (err error) { + var admin system.SystemAuthAdmin + err = adminSrv.db.Where("id = ?", id).Limit(1).First(&admin).Error + if err != nil { + return + } + str, err := util.ToolsUtil.ObjToJson(&admin) + if err != nil { + return + } + util.RedisUtil.HSet(config.AdminConfig.BackstageManageKey, strconv.FormatUint(uint64(admin.ID), 10), str, 0) + return nil +} diff --git a/server/admin/system/dept/dept.go b/server/admin/system/dept/dept.go new file mode 100644 index 0000000..79411a6 --- /dev/null +++ b/server/admin/system/dept/dept.go @@ -0,0 +1,86 @@ +package dept + +import ( + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func DeptRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + // authSrv := system.NewSystemAuthMenuService(db, permSrv) + Dept := NewSystemAuthDeptService(db) + handle := deptHandler{Service: Dept} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.GET("/dept/all", handle.All) + rg.GET("/dept/list", handle.List) + rg.GET("/dept/detail", handle.Detail) + rg.POST("/dept/add", handle.Add) + rg.POST("/dept/edit", handle.Edit) + rg.POST("/dept/del", handle.Del) +} + +type deptHandler struct { + Service ISystemAuthDeptService +} + +// all 部门所有 +func (dh deptHandler) All(c *gin.Context) { + res, err := dh.Service.All() + response.CheckAndRespWithData(c, res, err) +} + +// list 部门列表 +func (dh deptHandler) List(c *gin.Context) { + var listReq SystemAuthDeptListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := dh.Service.List(listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 部门详情 +func (dh deptHandler) Detail(c *gin.Context) { + var detailReq SystemAuthDeptDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := dh.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// add 部门新增 +func (dh deptHandler) Add(c *gin.Context) { + var addReq SystemAuthDeptAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) { + return + } + response.CheckAndResp(c, dh.Service.Add(addReq)) +} + +// edit 部门编辑 +func (dh deptHandler) Edit(c *gin.Context) { + var editReq SystemAuthDeptEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, dh.Service.Edit(editReq)) +} + +// del 部门删除 +func (dh deptHandler) Del(c *gin.Context) { + var delReq SystemAuthDeptDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) { + return + } + response.CheckAndResp(c, dh.Service.Del(delReq.ID)) +} diff --git a/server/admin/system/dept/schema.go b/server/admin/system/dept/schema.go new file mode 100644 index 0000000..f312a8d --- /dev/null +++ b/server/admin/system/dept/schema.go @@ -0,0 +1,53 @@ +package dept + +import "x_admin/core" + +//SystemAuthDeptListReq 部门列表参数 +type SystemAuthDeptListReq struct { + Name string `form:"name"` // 部门名称 + IsStop int8 `form:"isStop,default=-1" binding:"oneof=-1 0 1"` // 是否停用: [0=否, 1=是] +} + +//SystemAuthDeptDetailReq 部门详情参数 +type SystemAuthDeptDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthDeptAddReq 部门新增参数 +type SystemAuthDeptAddReq struct { + Pid uint `form:"pid" binding:"gte=0"` // 部门父级 + Name string `form:"name" binding:"required,min=1,max=100"` // 部门名称 + Duty string `form:"duty" binding:"omitempty,min=1,max=30"` // 负责人 + Mobile string `form:"mobile" binding:"omitempty,len=11"` // 联系电话 + IsStop uint8 `form:"isStop" binding:"oneof=0 1"` // 是否停用: [0=否, 1=是] + Sort int `form:"sort" binding:"gte=0,lte=9999"` // 排序编号 +} + +//SystemAuthDeptEditReq 部门编辑参数 +type SystemAuthDeptEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Pid uint `form:"pid" binding:"gte=0"` // 部门父级 + Name string `form:"name" binding:"required,min=1,max=100"` // 部门名称 + Duty string `form:"duty" binding:"omitempty,min=1,max=30"` // 负责人 + Mobile string `form:"mobile" binding:"omitempty,len=11"` // 联系电话 + IsStop uint8 `form:"isStop" binding:"oneof=0 1"` // 是否停用: [0=否, 1=是] + Sort int `form:"sort" binding:"gte=0,lte=9999"` // 排序编号 +} + +//SystemAuthDeptDelReq 部门删除参数 +type SystemAuthDeptDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthDeptResp 系统部门返回信息 +type SystemAuthDeptResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Pid uint `json:"pid" structs:"pid"` // 部门父级 + Name string `json:"name" structs:"name"` // 部门名称 + Duty string `json:"duty" structs:"duty"` // 负责人 + Mobile string `json:"mobile" structs:"mobile"` // 联系电话 + Sort uint16 `json:"sort" structs:"sort"` // 排序编号 + IsStop uint8 `json:"isStop" structs:"isStop"` // 是否停用: [0=否, 1=是] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} diff --git a/server/admin/system/dept/service.go b/server/admin/system/dept/service.go new file mode 100644 index 0000000..8cbccf8 --- /dev/null +++ b/server/admin/system/dept/service.go @@ -0,0 +1,151 @@ +package dept + +import ( + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISystemAuthDeptService interface { + All() (res []SystemAuthDeptResp, e error) + List(listReq SystemAuthDeptListReq) (mapList []interface{}, e error) + Detail(id uint) (res SystemAuthDeptResp, e error) + Add(addReq SystemAuthDeptAddReq) (e error) + Edit(editReq SystemAuthDeptEditReq) (e error) + Del(id uint) (e error) +} + +// NewSystemAuthDeptService 初始化 +func NewSystemAuthDeptService(db *gorm.DB) ISystemAuthDeptService { + return &systemAuthDeptService{db: db} +} + +// systemAuthDeptService 系统部门服务实现类 +type systemAuthDeptService struct { + db *gorm.DB +} + +// All 部门所有 +func (deptSrv systemAuthDeptService) All() (res []SystemAuthDeptResp, e error) { + var depts []system.SystemAuthDept + err := deptSrv.db.Where("pid > ? AND is_delete = ?", 0, 0).Order("sort desc, id desc").Find(&depts).Error + if e = response.CheckErr(err, "All Find err"); e != nil { + return + } + res = []SystemAuthDeptResp{} + response.Copy(&res, depts) + return +} + +// List 部门列表 +func (deptSrv systemAuthDeptService) List(listReq SystemAuthDeptListReq) (mapList []interface{}, e error) { + deptModel := deptSrv.db.Where("is_delete = ?", 0) + if listReq.Name != "" { + deptModel = deptModel.Where("name like ?", "%"+listReq.Name+"%") + } + if listReq.IsStop >= 0 { + deptModel = deptModel.Where("is_stop = ?", listReq.IsStop) + } + var depts []system.SystemAuthDept + err := deptModel.Order("sort desc, id desc").Find(&depts).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + deptResps := []SystemAuthDeptResp{} + response.Copy(&deptResps, depts) + mapList = util.ArrayUtil.ListToTree( + util.ConvertUtil.StructsToMaps(deptResps), "id", "pid", "children") + return +} + +// Detail 部门详情 +func (deptSrv systemAuthDeptService) Detail(id uint) (res SystemAuthDeptResp, e error) { + var dept system.SystemAuthDept + err := deptSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&dept).Error + if e = response.CheckErrDBNotRecord(err, "部门已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, dept) + return +} + +// Add 部门新增 +func (deptSrv systemAuthDeptService) Add(addReq SystemAuthDeptAddReq) (e error) { + if addReq.Pid == 0 { + r := deptSrv.db.Where("pid = ? AND is_delete = ?", 0, 0).Limit(1).Find(&system.SystemAuthDept{}) + if e = response.CheckErr(r.Error, "Add Find err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("顶级部门只允许有一个!") + } + } + var dept system.SystemAuthDept + response.Copy(&dept, addReq) + err := deptSrv.db.Create(&dept).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 部门编辑 +func (deptSrv systemAuthDeptService) Edit(editReq SystemAuthDeptEditReq) (e error) { + var dept system.SystemAuthDept + err := deptSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&dept).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "部门不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + if dept.Pid == 0 && editReq.Pid > 0 { + return response.AssertArgumentError.Make("顶级部门不能修改上级!") + } + if editReq.ID == editReq.Pid { + return response.AssertArgumentError.Make("上级部门不能是自己!") + } + // 更新 + response.Copy(&dept, editReq) + err = deptSrv.db.Model(&dept).Updates(dept).Error + e = response.CheckErr(err, "Edit Updates err") + return +} + +// Del 部门删除 +func (deptSrv systemAuthDeptService) Del(id uint) (e error) { + var dept system.SystemAuthDept + err := deptSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&dept).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "部门不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + if dept.Pid == 0 { + return response.AssertArgumentError.Make("顶级部门不能删除!") + } + r := deptSrv.db.Where("pid = ? AND is_delete = ?", id, 0).Limit(1).Find(&system.SystemAuthDept{}) + if e = response.CheckErr(r.Error, "Del Find dept err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("请先删除子级部门!") + } + r = deptSrv.db.Where("dept_id = ? AND is_delete = ?", id, 0).Limit(1).Find(&system.SystemAuthAdmin{}) + if e = response.CheckErr(r.Error, "Del Find admin err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("该部门已被管理员使用,请先移除!") + } + dept.IsDelete = 1 + err = deptSrv.db.Save(&dept).Error + e = response.CheckErr(err, "Del Save err") + return +} diff --git a/server/admin/system/enter.go b/server/admin/system/enter.go new file mode 100644 index 0000000..ae7ef21 --- /dev/null +++ b/server/admin/system/enter.go @@ -0,0 +1,51 @@ +package system + +import ( + "x_admin/admin/system/admin" + "x_admin/admin/system/role" + "x_admin/core" + "x_admin/middleware" + + "github.com/gin-gonic/gin" +) + +func AdminRoute(rg *gin.RouterGroup) { + db := core.GetDB() + + permSrv := role.NewSystemAuthPermService(db) + roleSrv := role.NewSystemAuthRoleService(db, permSrv) + adminSrv := admin.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := NewSystemLoginService(db, adminSrv) + + handle := admin.AdminHandler{Service: adminSrv} + + rg = rg.Group("/system", middleware.TokenAuth()) + + rg.GET("/admin/self", handle.Self) + rg.GET("/admin/list", handle.List) + rg.GET("/admin/detail", handle.Detail) + rg.POST("/admin/add", middleware.RecordLog("管理员新增"), handle.Add) + rg.POST("/admin/edit", middleware.RecordLog("管理员编辑"), handle.Edit) + rg.POST("/admin/upInfo", middleware.RecordLog("管理员更新"), handle.UpInfo) + rg.POST("/admin/del", middleware.RecordLog("管理员删除"), handle.Del) + rg.POST("/admin/disable", middleware.RecordLog("管理员状态切换"), handle.Disable) +} +func RoleRoute(rg *gin.RouterGroup) { + db := core.GetDB() + permSrv := role.NewSystemAuthPermService(db) + // roleSrv := NewSystemAuthRoleService(db, permSrv) + // adminSrv := NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := NewSystemLoginService(db, adminSrv) + + server := role.NewSystemAuthRoleService(db, permSrv) + + handle := role.RoleHandler{Service: server} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.GET("/role/all", handle.All) + rg.GET("/role/list", middleware.RecordLog("角色列表"), handle.List) + rg.GET("/role/detail", middleware.RecordLog("角色详情"), handle.Detail) + rg.POST("/role/add", middleware.RecordLog("角色新增"), handle.Add) + rg.POST("/role/edit", middleware.RecordLog("角色编辑"), handle.Edit) + rg.POST("/role/del", middleware.RecordLog("角色删除"), handle.Del) +} diff --git a/server/admin/system/log/log.go b/server/admin/system/log/log.go new file mode 100644 index 0000000..9fca752 --- /dev/null +++ b/server/admin/system/log/log.go @@ -0,0 +1,59 @@ +package log + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func LogRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := NewSystemAuthPermService(db) + // roleSrv := NewSystemAuthRoleService(db, permSrv) + // adminSrv := NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := NewSystemLoginService(db, adminSrv) + + authSrv := NewSystemLogsServer(db) + + handle := logHandler{Service: authSrv} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.GET("/log/operate", handle.operate) + rg.GET("/log/login", handle.login) +} + +type logHandler struct { + Service ISystemLogsServer +} + +// operate 操作日志 +func (lh logHandler) operate(c *gin.Context) { + var page request.PageReq + var logReq SystemLogOperateReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &logReq)) { + return + } + res, err := lh.Service.Operate(page, logReq) + response.CheckAndRespWithData(c, res, err) +} + +// login 登录日志 +func (lh logHandler) login(c *gin.Context) { + var page request.PageReq + var logReq SystemLogLoginReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &logReq)) { + return + } + res, err := lh.Service.Login(page, logReq) + response.CheckAndRespWithData(c, res, err) +} diff --git a/server/admin/system/log/schema.go b/server/admin/system/log/schema.go new file mode 100644 index 0000000..9efe996 --- /dev/null +++ b/server/admin/system/log/schema.go @@ -0,0 +1,54 @@ +package log + +import ( + "time" + "x_admin/core" +) + +// //SystemLogOperateReq 操作日志列表参数 +type SystemLogOperateReq struct { + Title string `form:"title"` // 操作标题 + Username string `form:"username"` // 用户账号 + Ip string `form:"ip"` // 请求IP + Type string `form:"type" binding:"omitempty,oneof=GET POST PUT"` // 请求类型: GET/POST/PUT + Status int `form:"status" binding:"omitempty,oneof=1 2"` // 执行状态: [1=成功, 2=失败] + Url string `form:"url"` // 请求地址 + StartTime time.Time `form:"startTime" time_format:"2006-01-02"` // 开始时间 + EndTime time.Time `form:"endTime" time_format:"2006-01-02"` // 结束时间 +} +type SystemLogLoginReq struct { + Username string `form:"username"` // 登录账号 + Status int `form:"status" binding:"omitempty,oneof=1 2"` // 执行状态: [1=成功, 2=失败] + StartTime time.Time `form:"startTime" time_format:"2006-01-02"` // 开始时间 + EndTime time.Time `form:"endTime" time_format:"2006-01-02"` // 结束时间 +} + +// SystemLogOperateResp 操作日志返回信息 +type SystemLogOperateResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Username string `json:"username" structs:"username"` // 用户账号 + Nickname string `json:"nickname" structs:"nickname"` // 用户昵称 + Type string `json:"type" structs:"type"` // 请求类型: GET/POST/PUT + Title string `json:"title" structs:"title"` // 操作标题 + Method string `json:"method" structs:"method"` // 请求方式 + Ip string `json:"ip" structs:"ip"` // 请求IP + Url string `json:"url" structs:"url"` // 请求地址 + Args string `json:"args" structs:"args"` // 请求参数 + Error string `json:"error" structs:"error"` // 错误信息 + Status int `json:"status" structs:"status"` // 执行状态: [1=成功, 2=失败] + TaskTime string `json:"taskTime" structs:"taskTime"` // 执行耗时 + StartTime core.TsTime `json:"startTime" structs:"startTime"` // 开始时间 + EndTime core.TsTime `json:"endTime" structs:"endTime"` // 结束时间 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 +} + +// SystemLogLoginResp 登录日志返回信息 +type SystemLogLoginResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Username string `json:"username" structs:"username"` // 登录账号 + Ip string `json:"ip" structs:"ip"` // 来源IP + Os string `json:"os" structs:"os"` // 操作系统 + Browser string `json:"browser" structs:"browser"` // 浏览器 + Status int `json:"status" structs:"status"` // 操作状态: [1=成功, 2=失败] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 +} diff --git a/server/admin/system/log/service.go b/server/admin/system/log/service.go new file mode 100644 index 0000000..9d39624 --- /dev/null +++ b/server/admin/system/log/service.go @@ -0,0 +1,122 @@ +package log + +import ( + "fmt" + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/system" + + "gorm.io/gorm" +) + +type ISystemLogsServer interface { + Operate(page request.PageReq, logReq SystemLogOperateReq) (res response.PageResp, e error) + Login(page request.PageReq, logReq SystemLogLoginReq) (res response.PageResp, e error) +} + +// NewSystemLogsServer 初始化 +func NewSystemLogsServer(db *gorm.DB) ISystemLogsServer { + return &systemLogsServer{db: db} +} + +// systemLogsServer 系统日志服务实现类 +type systemLogsServer struct { + db *gorm.DB +} + +// Operate 系统操作日志 +func (logSrv systemLogsServer) Operate(page request.PageReq, logReq SystemLogOperateReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + logTbName := core.DBTableName(&system.SystemLogOperate{}) + adminTbName := core.DBTableName(&system.SystemAuthAdmin{}) + logModel := logSrv.db.Table(logTbName + " AS log").Joins( + fmt.Sprintf("LEFT JOIN %s AS admin ON log.admin_id = admin.id", adminTbName)).Select( + "log.*, admin.username, admin.nickname") + // 条件 + if logReq.Title != "" { + logModel = logModel.Where("title like ?", "%"+logReq.Title+"%") + } + if logReq.Username != "" { + logModel = logModel.Where("username like ?", "%"+logReq.Username+"%") + } + if logReq.Ip != "" { + logModel = logModel.Where("ip like ?", "%"+logReq.Ip+"%") + } + if logReq.Type != "" { + logModel = logModel.Where("type = ?", logReq.Type) + } + if logReq.Status > 0 { + logModel = logModel.Where("status = ?", logReq.Status) + } + if logReq.Url != "" { + logModel = logModel.Where("url = ?", logReq.Url) + } + if !logReq.StartTime.IsZero() { + logModel = logModel.Where("log.create_time >= ?", logReq.StartTime.Unix()) + } + if !logReq.EndTime.IsZero() { + logModel = logModel.Where("log.create_time <= ?", logReq.EndTime.Unix()) + } + // 总数 + var count int64 + err := logModel.Count(&count).Error + if e = response.CheckErr(err, "Operate Count err"); e != nil { + return + } + // 数据 + var logResp []SystemLogOperateResp + err = logModel.Limit(limit).Offset(offset).Order("id desc").Find(&logResp).Error + if e = response.CheckErr(err, "Operate Find err"); e != nil { + return + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: logResp, + }, nil +} + +// Login 系统登录日志 +func (logSrv systemLogsServer) Login(page request.PageReq, logReq SystemLogLoginReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + logModel := logSrv.db.Model(&system.SystemLogLogin{}) + // 条件 + if logReq.Username != "" { + logModel = logModel.Where("username like ?", "%"+logReq.Username+"%") + } + if logReq.Status > 0 { + logModel = logModel.Where("status = ?", logReq.Status) + } + if !logReq.StartTime.IsZero() { + logModel = logModel.Where("create_time >= ?", logReq.StartTime.Unix()) + } + if !logReq.EndTime.IsZero() { + logModel = logModel.Where("create_time <= ?", logReq.EndTime.Unix()) + } + // 总数 + var count int64 + err := logModel.Count(&count).Error + if e = response.CheckErr(err, "Login Count err"); e != nil { + return + } + // 数据 + var logResp []SystemLogLoginResp + err = logModel.Limit(limit).Offset(offset).Order("id desc").Find(&logResp).Error + if e = response.CheckErr(err, "Login Find err"); e != nil { + return + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: logResp, + }, nil +} diff --git a/server/admin/system/login/login.go b/server/admin/system/login/login.go new file mode 100644 index 0000000..c71eb77 --- /dev/null +++ b/server/admin/system/login/login.go @@ -0,0 +1,49 @@ +package login + +import ( + "x_admin/admin/system/admin" + "x_admin/admin/system/role" + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func LoginRoute(rg *gin.RouterGroup) { + db := core.GetDB() + permSrv := role.NewSystemAuthPermService(db) + roleSrv := role.NewSystemAuthRoleService(db, permSrv) + adminSrv := admin.NewSystemAuthAdminService(db, permSrv, roleSrv) + service := NewSystemLoginService(db, adminSrv) + + handle := loginHandler{Service: service} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.POST("/login", handle.login) + rg.POST("/logout", handle.logout) +} + +type loginHandler struct { + Service ISystemLoginService +} + +// login 登录系统 +func (lh loginHandler) login(c *gin.Context) { + var loginReq SystemLoginReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &loginReq)) { + return + } + res, err := lh.Service.Login(c, &loginReq) + response.CheckAndRespWithData(c, res, err) +} + +// logout 登录退出 +func (lh loginHandler) logout(c *gin.Context) { + var logoutReq SystemLogoutReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyHeader(c, &logoutReq)) { + return + } + response.CheckAndResp(c, lh.Service.Logout(&logoutReq)) +} diff --git a/server/admin/system/login/schema.go b/server/admin/system/login/schema.go new file mode 100644 index 0000000..9982eee --- /dev/null +++ b/server/admin/system/login/schema.go @@ -0,0 +1,39 @@ +package login + +import ( + "time" + "x_admin/core" +) + +type SystemLogLoginReq struct { + Username string `form:"username"` // 登录账号 + Status int `form:"status" binding:"omitempty,oneof=1 2"` // 执行状态: [1=成功, 2=失败] + StartTime time.Time `form:"startTime" time_format:"2006-01-02"` // 开始时间 + EndTime time.Time `form:"endTime" time_format:"2006-01-02"` // 结束时间 +} + +type SystemLoginResp struct { + Token string `json:"token"` +} + +// SystemLoginReq 系统登录参数 +type SystemLoginReq struct { + Username string `json:"username" binding:"required,min=2,max=20"` // 账号 + Password string `json:"password" binding:"required,min=6,max=32"` // 密码 +} + +// SystemLogoutReq 登录退出参数 +type SystemLogoutReq struct { + Token string `header:"token" binding:"required"` // 令牌 +} + +// SystemLogLoginResp 登录日志返回信息 +type SystemLogLoginResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Username string `json:"username" structs:"username"` // 登录账号 + Ip string `json:"ip" structs:"ip"` // 来源IP + Os string `json:"os" structs:"os"` // 操作系统 + Browser string `json:"browser" structs:"browser"` // 浏览器 + Status int `json:"status" structs:"status"` // 操作状态: [1=成功, 2=失败] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 +} diff --git a/server/admin/system/login/service.go b/server/admin/system/login/service.go new file mode 100644 index 0000000..1d9a6dd --- /dev/null +++ b/server/admin/system/login/service.go @@ -0,0 +1,148 @@ +package login + +import ( + "errors" + "runtime/debug" + "strconv" + "time" + "x_admin/admin/system/admin" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type ISystemLoginService interface { + Login(c *gin.Context, req *SystemLoginReq) (res SystemLoginResp, e error) + Logout(req *SystemLogoutReq) (e error) + RecordLoginLog(c *gin.Context, adminId uint, username string, errStr string) (e error) +} + +// NewSystemLoginService 初始化 +func NewSystemLoginService(db *gorm.DB, adminSrv admin.ISystemAuthAdminService) ISystemLoginService { + return &systemLoginService{db: db, adminSrv: adminSrv} +} + +// systemLoginService 系统登录服务实现类 +type systemLoginService struct { + db *gorm.DB + adminSrv admin.ISystemAuthAdminService +} + +// Login 登录 +func (loginSrv systemLoginService) Login(c *gin.Context, req *SystemLoginReq) (res SystemLoginResp, e error) { + sysAdmin, err := loginSrv.adminSrv.FindByUsername(req.Username) + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + if e = loginSrv.RecordLoginLog(c, 0, req.Username, response.LoginAccountError.Msg()); e != nil { + return + } + e = response.LoginAccountError + return + } else if err != nil { + core.Logger.Errorf("Login FindByUsername err: err=[%+v]", err) + if e = loginSrv.RecordLoginLog(c, 0, req.Username, response.Failed.Msg()); e != nil { + return + } + e = response.Failed + return + } + if sysAdmin.IsDelete == 1 { + if e = loginSrv.RecordLoginLog(c, 0, req.Username, response.LoginAccountError.Msg()); e != nil { + return + } + e = response.LoginAccountError + return + } + if sysAdmin.IsDisable == 1 { + if e = loginSrv.RecordLoginLog(c, sysAdmin.ID, req.Username, response.LoginDisableError.Msg()); e != nil { + return + } + e = response.LoginDisableError + return + } + md5Pwd := util.ToolsUtil.MakeMd5(req.Password + sysAdmin.Salt) + if sysAdmin.Password != md5Pwd { + if e = loginSrv.RecordLoginLog(c, sysAdmin.ID, req.Username, response.LoginAccountError.Msg()); e != nil { + return + } + e = response.LoginAccountError + return + } + defer func() { + if r := recover(); r != nil { + switch r.(type) { + // 自定义类型 + case response.RespType: + panic(r) + // 其他类型 + default: + core.Logger.Errorf("stacktrace from panic: %+v\n%s", r, string(debug.Stack())) + loginSrv.RecordLoginLog(c, sysAdmin.ID, req.Username, response.Failed.Msg()) + panic(response.Failed) + } + } + }() + token := util.ToolsUtil.MakeToken() + adminIdStr := strconv.FormatUint(uint64(sysAdmin.ID), 10) + + //非多处登录 + if sysAdmin.IsMultipoint == 0 { + sysAdminSetKey := config.AdminConfig.BackstageTokenSet + adminIdStr + ts := util.RedisUtil.SGet(sysAdminSetKey) + if len(ts) > 0 { + var keys []string + for _, t := range ts { + keys = append(keys, t) + } + util.RedisUtil.Del(keys...) + } + util.RedisUtil.Del(sysAdminSetKey) + util.RedisUtil.SSet(sysAdminSetKey, token) + } + + // 缓存登录信息 + util.RedisUtil.Set(config.AdminConfig.BackstageTokenKey+token, adminIdStr, 7200) + loginSrv.adminSrv.CacheAdminUserByUid(sysAdmin.ID) + + // 更新登录信息 + err = loginSrv.db.Model(&sysAdmin).Updates( + system.SystemAuthAdmin{LastLoginIp: c.ClientIP(), LastLoginTime: time.Now().Unix()}).Error + if err != nil { + if e = loginSrv.RecordLoginLog(c, sysAdmin.ID, req.Username, response.SystemError.Msg()); e != nil { + return + } + if e = response.CheckErr(err, "Login Updates err"); e != nil { + return + } + } + // 记录登录日志 + if e = loginSrv.RecordLoginLog(c, sysAdmin.ID, req.Username, ""); e != nil { + return + } + // 返回登录信息 + return SystemLoginResp{Token: token}, nil +} + +// Logout 退出 +func (loginSrv systemLoginService) Logout(req *SystemLogoutReq) (e error) { + util.RedisUtil.Del(config.AdminConfig.BackstageTokenKey + req.Token) + return +} + +// RecordLoginLog 记录登录日志 +func (loginSrv systemLoginService) RecordLoginLog(c *gin.Context, adminId uint, username string, errStr string) (e error) { + ua := core.UAParser.Parse(c.GetHeader("user-agent")) + var status uint8 + if errStr == "" { + status = 1 + } + err := loginSrv.db.Create(&system.SystemLogLogin{ + AdminId: adminId, Username: username, Ip: c.ClientIP(), Os: ua.Os.Family, + Browser: ua.UserAgent.Family, Status: status}).Error + e = response.CheckErr(err, "RecordLoginLog Create err") + return +} diff --git a/server/admin/system/menu/menu.go b/server/admin/system/menu/menu.go new file mode 100644 index 0000000..eddbd0e --- /dev/null +++ b/server/admin/system/menu/menu.go @@ -0,0 +1,88 @@ +package menu + +import ( + "strconv" + "x_admin/admin/system/role" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func MenuRoute(rg *gin.RouterGroup) { + db := core.GetDB() + permSrv := role.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + authSrv := NewSystemAuthMenuService(db, permSrv) + + handle := menuHandler{Service: authSrv} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.GET("/menu/route", handle.route) + rg.GET("/menu/list", handle.List) + rg.GET("/menu/detail", handle.Detail) + rg.POST("/menu/add", handle.Add) + rg.POST("/menu/edit", handle.Edit) + rg.POST("/menu/del", handle.Del) +} + +type menuHandler struct { + Service ISystemAuthMenuService +} + +// route 菜单路由 +func (mh menuHandler) route(c *gin.Context) { + roleId := config.AdminConfig.GetRoleId(c) + id, _ := strconv.ParseUint(roleId, 10, 64) + res, err := mh.Service.SelectMenuByRoleId(c, uint(id)) + response.CheckAndRespWithData(c, res, err) +} + +// list 菜单列表 +func (mh menuHandler) List(c *gin.Context) { + res, err := mh.Service.List() + response.CheckAndRespWithData(c, res, err) +} + +// detail 菜单详情 +func (mh menuHandler) Detail(c *gin.Context) { + var detailReq SystemAuthMenuDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := mh.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// add 新增菜单 +func (mh menuHandler) Add(c *gin.Context) { + var addReq SystemAuthMenuAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, mh.Service.Add(addReq)) +} + +// edit 编辑菜单 +func (mh menuHandler) Edit(c *gin.Context) { + var editReq SystemAuthMenuEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + response.CheckAndResp(c, mh.Service.Edit(editReq)) +} + +// del 删除菜单 +func (mh menuHandler) Del(c *gin.Context) { + var delReq SystemAuthMenuDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, mh.Service.Del(delReq.ID)) +} diff --git a/server/admin/system/menu/schema.go b/server/admin/system/menu/schema.go new file mode 100644 index 0000000..bfc3786 --- /dev/null +++ b/server/admin/system/menu/schema.go @@ -0,0 +1,69 @@ +package menu + +import "x_admin/core" + +//SystemAuthMenuDetailReq 菜单详情参数 +type SystemAuthMenuDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthMenuAddReq 新增菜单参数 +type SystemAuthMenuAddReq struct { + Pid uint `form:"pid" binding:"gte=0"` // 上级菜单 + MenuType string `form:"menuType" binding:"oneof=M C A"` // 权限类型: [M=目录, C=菜单, A=按钮] + MenuName string `form:"menuName" binding:"required,min=1,max=30"` // 菜单名称 + MenuIcon string `form:"menuIcon" binding:"max=100"` // 菜单图标 + MenuSort int `form:"menuSort" binding:"gte=0"` // 菜单排序 + Perms string `form:"perms" binding:"max=100"` // 权限标识 + Paths string `form:"paths" binding:"max=200"` // 路由地址 + Component string `form:"component" binding:"max=200"` // 前端组件 + Selected string `form:"selected" binding:"max=200"` // 选中路径 + Params string `form:"params" binding:"max=200"` // 路由参数 + IsCache uint8 `form:"isCache" binding:"oneof=0 1"` // 是否缓存: [0=否, 1=是] + IsShow uint8 `form:"isShow" binding:"oneof=0 1"` // 是否显示: [0=否, 1=是] + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] +} + +//SystemAuthMenuEditReq 编辑菜单参数 +type SystemAuthMenuEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Pid uint `form:"pid" binding:"gte=0"` // 上级菜单 + MenuType string `form:"menuType" binding:"oneof=M C A"` // 权限类型: [M=目录, C=菜单, A=按钮] + MenuName string `form:"menuName" binding:"required,min=1,max=30"` // 菜单名称 + MenuIcon string `form:"menuIcon" binding:"max=100"` // 菜单图标 + MenuSort int `form:"menuSort" binding:"gte=0"` // 菜单排序 + Perms string `form:"perms" binding:"max=100"` // 权限标识 + Paths string `form:"paths" binding:"max=200"` // 路由地址 + Component string `form:"component" binding:"max=200"` // 前端组件 + Selected string `form:"selected" binding:"max=200"` // 选中路径 + Params string `form:"params" binding:"max=200"` // 路由参数 + IsCache uint8 `form:"isCache" binding:"oneof=0 1"` // 是否缓存: [0=否, 1=是] + IsShow uint8 `form:"isShow" binding:"oneof=0 1"` // 是否显示: [0=否, 1=是] + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] +} + +//SystemAuthMenuDelReq 删除菜单参数 +type SystemAuthMenuDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthMenuResp 系统菜单返回信息 +type SystemAuthMenuResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Pid uint `json:"pid" structs:"pid"` // 上级菜单 + MenuType string `json:"menuType" structs:"menuType"` // 权限类型: [M=目录, C=菜单, A=按钮] + MenuName string `json:"menuName" structs:"menuName"` // 菜单名称 + MenuIcon string `json:"menuIcon" structs:"menuIcon"` // 菜单图标 + MenuSort uint16 `json:"menuSort" structs:"menuSort"` // 菜单排序 + Perms string `json:"perms" structs:"perms"` // 权限标识 + Paths string `json:"paths" structs:"paths"` // 路由地址 + Component string `json:"component" structs:"component"` // 前端组件 + Selected string `json:"selected" structs:"selected"` // 选中路径 + Params string `json:"params" structs:"params"` // 路由参数 + IsCache uint8 `json:"isCache" structs:"isCache"` // 是否缓存: [0=否, 1=是] + IsShow uint8 `json:"isShow" structs:"isShow"` // 是否显示: [0=否, 1=是] + IsDisable uint8 `json:"isDisable" structs:"isDisable"` // 是否禁用: [0=否, 1=是] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 + Children []SystemAuthMenuResp `json:"children,omitempty" structs:"children"` // 子集 +} diff --git a/server/admin/system/menu/service.go b/server/admin/system/menu/service.go new file mode 100644 index 0000000..11dd1e2 --- /dev/null +++ b/server/admin/system/menu/service.go @@ -0,0 +1,141 @@ +package menu + +import ( + "x_admin/admin/system/role" + "x_admin/config" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "github.com/fatih/structs" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type ISystemAuthMenuService interface { + SelectMenuByRoleId(c *gin.Context, roleId uint) (mapList []interface{}, e error) + List() (res []interface{}, e error) + Detail(id uint) (res SystemAuthMenuResp, e error) + Add(addReq SystemAuthMenuAddReq) (e error) + Edit(editReq SystemAuthMenuEditReq) (e error) + Del(id uint) (e error) +} + +// NewSystemAuthMenuService 初始化 +func NewSystemAuthMenuService(db *gorm.DB, permSrv role.ISystemAuthPermService) ISystemAuthMenuService { + return &systemAuthMenuService{db: db, permSrv: permSrv} +} + +// systemAuthMenuService 系统菜单服务实现类 +type systemAuthMenuService struct { + db *gorm.DB + permSrv role.ISystemAuthPermService +} + +// SelectMenuByRoleId 根据角色ID获取菜单 +func (menuSrv systemAuthMenuService) SelectMenuByRoleId(c *gin.Context, roleId uint) (mapList []interface{}, e error) { + adminId := config.AdminConfig.GetAdminId(c) + var menuIds []uint + // 超管 + if adminId == config.AdminConfig.SuperAdminId { + menuIds = []uint{0} + } else if menuIds, e = menuSrv.permSrv.SelectMenuIdsByRoleId(roleId); e != nil { + return + } + if len(menuIds) == 0 { + menuIds = []uint{0} + } + chain := menuSrv.db.Where("menu_type in ? AND is_disable = ?", []string{"M", "C"}, 0) + if adminId != config.AdminConfig.SuperAdminId { + chain = chain.Where("id in ?", menuIds) + } + var menus []system.SystemAuthMenu + err := chain.Order("menu_sort desc, id").Find(&menus).Error + if e = response.CheckErr(err, "SelectMenuByRoleId Find err"); e != nil { + return + } + var menuResps []SystemAuthMenuResp + response.Copy(&menuResps, menus) + mapList = util.ArrayUtil.ListToTree( + util.ConvertUtil.StructsToMaps(menuResps), "id", "pid", "children") + return +} + +// List 菜单列表 +func (menuSrv systemAuthMenuService) List() (res []interface{}, e error) { + var menus []system.SystemAuthMenu + err := menuSrv.db.Order("menu_sort desc, id").Find(&menus).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + var menuResps []SystemAuthMenuResp + response.Copy(&menuResps, menus) + return util.ArrayUtil.ListToTree( + util.ConvertUtil.StructsToMaps(menuResps), "id", "pid", "children"), nil +} + +// Detail 菜单详情 +func (menuSrv systemAuthMenuService) Detail(id uint) (res SystemAuthMenuResp, e error) { + var menu system.SystemAuthMenu + err := menuSrv.db.Where("id = ?", id).Limit(1).First(&menu).Error + if e = response.CheckErrDBNotRecord(err, "菜单已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, menu) + return +} + +func (menuSrv systemAuthMenuService) Add(addReq SystemAuthMenuAddReq) (e error) { + var menu system.SystemAuthMenu + response.Copy(&menu, addReq) + err := menuSrv.db.Create(&menu).Error + if e = response.CheckErr(err, "Add Create err"); e != nil { + return + } + util.RedisUtil.Del(config.AdminConfig.BackstageRolesKey) + return +} + +func (menuSrv systemAuthMenuService) Edit(editReq SystemAuthMenuEditReq) (e error) { + var menu system.SystemAuthMenu + err := menuSrv.db.Where("id = ?", editReq.ID).Limit(1).Find(&menu).Error + if e = response.CheckErrDBNotRecord(err, "菜单已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit Find err"); e != nil { + return + } + response.Copy(&menu, editReq) + err = menuSrv.db.Model(&menu).Updates(structs.Map(menu)).Error + if e = response.CheckErr(err, "Edit Updates err"); e != nil { + return + } + util.RedisUtil.Del(config.AdminConfig.BackstageRolesKey) + return +} + +// Del 删除菜单 +func (menuSrv systemAuthMenuService) Del(id uint) (e error) { + var menu system.SystemAuthMenu + err := menuSrv.db.Where("id = ?", id).Limit(1).First(&menu).Error + if e = response.CheckErrDBNotRecord(err, "菜单已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Delete First err"); e != nil { + return + } + r := menuSrv.db.Where("pid = ?", id).Limit(1).Find(&system.SystemAuthMenu{}) + err = r.Error + if e = response.CheckErr(err, "Delete Find by pid err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("请先删除子菜单再操作!") + } + err = menuSrv.db.Delete(&menu).Error + e = response.CheckErr(err, "Delete Delete err") + return +} diff --git a/server/admin/system/post/post.go b/server/admin/system/post/post.go new file mode 100644 index 0000000..da27ea4 --- /dev/null +++ b/server/admin/system/post/post.go @@ -0,0 +1,92 @@ +package post + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func PostRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewSystemAuthPostService(db) + + handle := postHandler{Service: server} + + rg = rg.Group("/system", middleware.TokenAuth()) + rg.GET("/post/all", handle.All) + rg.GET("/post/list", handle.List) + rg.GET("/post/detail", handle.Detail) + rg.POST("/post/add", handle.Add) + rg.POST("/post/edit", handle.Edit) + rg.POST("/post/del", handle.Del) +} + +type postHandler struct { + Service ISystemAuthPostService +} + +// all 岗位所有 +func (ph postHandler) All(c *gin.Context) { + res, err := ph.Service.All() + response.CheckAndRespWithData(c, res, err) +} + +// list 岗位列表 +func (ph postHandler) List(c *gin.Context) { + var page request.PageReq + var listReq SystemAuthPostListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := ph.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 岗位详情 +func (ph postHandler) Detail(c *gin.Context) { + var detailReq SystemAuthPostDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := ph.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// add 岗位新增 +func (ph postHandler) Add(c *gin.Context) { + var addReq SystemAuthPostAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) { + return + } + response.CheckAndResp(c, ph.Service.Add(addReq)) +} + +// edit 岗位编辑 +func (ph postHandler) Edit(c *gin.Context) { + var editReq SystemAuthPostEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, ph.Service.Edit(editReq)) +} + +// del 岗位删除 +func (ph postHandler) Del(c *gin.Context) { + var delReq SystemAuthPostDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) { + return + } + response.CheckAndResp(c, ph.Service.Del(delReq.ID)) +} diff --git a/server/admin/system/post/schema.go b/server/admin/system/post/schema.go new file mode 100644 index 0000000..5892a6e --- /dev/null +++ b/server/admin/system/post/schema.go @@ -0,0 +1,51 @@ +package post + +import "x_admin/core" + +//SystemAuthPostListReq 岗位列表参数 +type SystemAuthPostListReq struct { + Code string `form:"code"` // 岗位编码 + Name string `form:"name"` // 岗位名称 + IsStop int8 `form:"isStop,default=-1" binding:"oneof=-1 0 1"` // 是否停用: [0=否, 1=是] +} + +//SystemAuthPostDetailReq 岗位详情参数 +type SystemAuthPostDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthPostAddReq 岗位新增参数 +type SystemAuthPostAddReq struct { + Code string `form:"code" binding:"omitempty,min=1,max=30"` // 岗位编码 + Name string `form:"name" binding:"required,min=1,max=30"` // 岗位名称 + Remarks string `form:"remarks" binding:"max=250"` // 岗位备注 + IsStop uint8 `form:"isStop" binding:"oneof=0 1"` // 是否停用: [0=否, 1=是] + Sort int `form:"sort" binding:"gte=0"` // 排序编号 +} + +//SystemAuthPostEditReq 岗位编辑参数 +type SystemAuthPostEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Code string `form:"code" binding:"omitempty,min=1,max=30"` // 岗位编码 + Name string `form:"name" binding:"required,min=1,max=30"` // 岗位名称 + Remarks string `form:"remarks" binding:"max=250"` // 岗位备注 + IsStop uint8 `form:"isStop" binding:"oneof=0 1"` // 是否停用: [0=否, 1=是] + Sort int `form:"sort" binding:"gte=0"` // 排序编号 +} + +//SystemAuthPostDelReq 岗位删除参数 +type SystemAuthPostDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthPostResp 系统岗位返回信息 +type SystemAuthPostResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Code string `json:"code" structs:"code"` // 岗位编号 + Name string `json:"name" structs:"name"` // 岗位名称 + Remarks string `json:"remarks" structs:"remarks"` // 岗位备注 + Sort uint16 `json:"sort" structs:"sort"` // 岗位排序 + IsStop uint8 `json:"isStop" structs:"isStop"` // 是否停用: [0=否, 1=是] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} diff --git a/server/admin/system/post/service.go b/server/admin/system/post/service.go new file mode 100644 index 0000000..79d9a85 --- /dev/null +++ b/server/admin/system/post/service.go @@ -0,0 +1,157 @@ +package post + +import ( + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/system" + + "gorm.io/gorm" +) + +type ISystemAuthPostService interface { + All() (res []SystemAuthPostResp, e error) + List(page request.PageReq, listReq SystemAuthPostListReq) (res response.PageResp, e error) + Detail(id uint) (res SystemAuthPostResp, e error) + Add(addReq SystemAuthPostAddReq) (e error) + Edit(editReq SystemAuthPostEditReq) (e error) + Del(id uint) (e error) +} + +// NewSystemAuthPostService 初始化 +func NewSystemAuthPostService(db *gorm.DB) ISystemAuthPostService { + return &systemAuthPostService{db: db} +} + +// systemAuthPostService 系统岗位服务实现类 +type systemAuthPostService struct { + db *gorm.DB +} + +// All 岗位所有 +func (postSrv systemAuthPostService) All() (res []SystemAuthPostResp, e error) { + var posts []system.SystemAuthPost + err := postSrv.db.Where("is_delete = ?", 0).Order("sort desc, id desc").Find(&posts).Error + if e = response.CheckErr(err, "All Find err"); e != nil { + return + } + res = []SystemAuthPostResp{} + response.Copy(&res, posts) + return +} + +// List 岗位列表 +func (postSrv systemAuthPostService) List(page request.PageReq, listReq SystemAuthPostListReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + postModel := postSrv.db.Model(&system.SystemAuthPost{}).Where("is_delete = ?", 0) + if listReq.Code != "" { + postModel = postModel.Where("code like ?", "%"+listReq.Code+"%") + } + if listReq.Name != "" { + postModel = postModel.Where("name like ?", "%"+listReq.Name+"%") + } + if listReq.IsStop >= 0 { + postModel = postModel.Where("is_stop = ?", listReq.IsStop) + } + // 总数 + var count int64 + err := postModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + // 数据 + var posts []system.SystemAuthPost + err = postModel.Limit(limit).Offset(offset).Order("id desc").Find(&posts).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + postResps := []SystemAuthPostResp{} + response.Copy(&postResps, posts) + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: postResps, + }, nil +} + +// Detail 部门详情 +func (postSrv systemAuthPostService) Detail(id uint) (res SystemAuthPostResp, e error) { + var post system.SystemAuthPost + err := postSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&post).Error + if e = response.CheckErrDBNotRecord(err, "岗位不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, post) + return +} + +// Add 部门新增 +func (postSrv systemAuthPostService) Add(addReq SystemAuthPostAddReq) (e error) { + r := postSrv.db.Where("(code = ? OR name = ?) AND is_delete = ?", addReq.Code, addReq.Name, 0).Limit(1).Find(&system.SystemAuthPost{}) + if e = response.CheckErr(r.Error, "Add Find err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("该岗位已存在!") + } + var post system.SystemAuthPost + response.Copy(&post, addReq) + err := postSrv.db.Create(&post).Error + e = response.CheckErr(err, "Add Create err") + return +} + +// Edit 部门编辑 +func (postSrv systemAuthPostService) Edit(editReq SystemAuthPostEditReq) (e error) { + var post system.SystemAuthPost + err := postSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&post).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "部门不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + r := postSrv.db.Where("(code = ? OR name = ?) AND id != ? AND is_delete = ?", editReq.Code, editReq.Name, editReq.ID, 0).Limit(1).Find(&system.SystemAuthPost{}) + if e = response.CheckErr(r.Error, "Add Find err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("该岗位已存在!") + } + // 更新 + response.Copy(&post, editReq) + err = postSrv.db.Model(&post).Updates(post).Error + e = response.CheckErr(err, "Edit Updates err") + return +} + +// Del 部门删除 +func (postSrv systemAuthPostService) Del(id uint) (e error) { + var post system.SystemAuthPost + err := postSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&post).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "部门不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + r := postSrv.db.Where("post_id = ? AND is_delete = ?", id, 0).Limit(1).Find(&system.SystemAuthAdmin{}) + if e = response.CheckErr(r.Error, "Del Find err"); e != nil { + return + } + if r.RowsAffected > 0 { + return response.AssertArgumentError.Make("该岗位已被管理员使用,请先移除!") + } + post.IsDelete = 1 + err = postSrv.db.Save(&post).Error + e = response.CheckErr(err, "Del Save err") + return +} diff --git a/server/admin/system/role/authPermService.go b/server/admin/system/role/authPermService.go new file mode 100644 index 0000000..fa9cf3f --- /dev/null +++ b/server/admin/system/role/authPermService.go @@ -0,0 +1,116 @@ +package role + +import ( + "strconv" + "strings" + "x_admin/config" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "gorm.io/gorm" +) + +type ISystemAuthPermService interface { + SelectMenuIdsByRoleId(roleId uint) (menuIds []uint, e error) + CacheRoleMenusByRoleId(roleId uint) (e error) + BatchSaveByMenuIds(roleId uint, menuIds string, db *gorm.DB) (e error) + BatchDeleteByRoleId(roleId uint, db *gorm.DB) (e error) + BatchDeleteByMenuId(menuId uint) (e error) +} + +// NewSystemAuthPermService 初始化 +func NewSystemAuthPermService(db *gorm.DB) ISystemAuthPermService { + return &systemAuthPermService{db: db} +} + +// systemAuthPermService 系统权限服务实现类 +type systemAuthPermService struct { + db *gorm.DB +} + +// SelectMenuIdsByRoleId 根据角色ID获取菜单ID +func (permSrv systemAuthPermService) SelectMenuIdsByRoleId(roleId uint) (menuIds []uint, e error) { + var role system.SystemAuthRole + err := permSrv.db.Where("id = ? AND is_disable = ?", roleId, 0).Limit(1).First(&role).Error + if e = response.CheckErr(err, "SelectMenuIdsByRoleId First err"); e != nil { + return []uint{}, e + } + var perms []system.SystemAuthPerm + err = permSrv.db.Where("role_id = ?", role.ID).Find(&perms).Error + if e = response.CheckErr(err, "SelectMenuIdsByRoleId Find err"); e != nil { + return []uint{}, e + } + for _, perm := range perms { + menuIds = append(menuIds, perm.MenuId) + } + return +} + +// CacheRoleMenusByRoleId 缓存角色菜单 +func (permSrv systemAuthPermService) CacheRoleMenusByRoleId(roleId uint) (e error) { + var perms []system.SystemAuthPerm + err := permSrv.db.Where("role_id = ?", roleId).Find(&perms).Error + if e = response.CheckErr(err, "CacheRoleMenusByRoleId Find perms err"); e != nil { + return + } + var menuIds []uint + for _, perm := range perms { + menuIds = append(menuIds, perm.MenuId) + } + var menus []system.SystemAuthMenu + err = permSrv.db.Where( + "is_disable = ? and id in ? and menu_type in ?", 0, menuIds, []string{"C", "A"}).Order( + "menu_sort, id").Find(&menus).Error + if e = response.CheckErr(err, "CacheRoleMenusByRoleId Find menus err"); e != nil { + return + } + var menuArray []string + for _, menu := range menus { + if menu.Perms != "" { + menuArray = append(menuArray, strings.Trim(menu.Perms, "")) + } + } + util.RedisUtil.HSet(config.AdminConfig.BackstageRolesKey, strconv.FormatUint(uint64(roleId), 10), strings.Join(menuArray, ","), 0) + return +} + +// BatchSaveByMenuIds 批量写入角色菜单 +func (permSrv systemAuthPermService) BatchSaveByMenuIds(roleId uint, menuIds string, db *gorm.DB) (e error) { + if menuIds == "" { + return + } + if db == nil { + db = permSrv.db + } + err := db.Transaction(func(tx *gorm.DB) error { + var perms []system.SystemAuthPerm + for _, menuIdStr := range strings.Split(menuIds, ",") { + menuId, _ := strconv.ParseUint(menuIdStr, 10, 32) + perms = append(perms, system.SystemAuthPerm{ID: util.ToolsUtil.MakeUuid(), RoleId: roleId, MenuId: uint(menuId)}) + } + txErr := tx.Create(&perms).Error + var te error + te = response.CheckErr(txErr, "BatchSaveByMenuIds Create in tx err") + return te + }) + e = response.CheckErr(err, "BatchSaveByMenuIds Transaction err") + return +} + +// BatchDeleteByRoleId 批量删除角色菜单(根据角色ID) +func (permSrv systemAuthPermService) BatchDeleteByRoleId(roleId uint, db *gorm.DB) (e error) { + if db == nil { + db = permSrv.db + } + err := db.Delete(&system.SystemAuthPerm{}, "role_id = ?", roleId).Error + e = response.CheckErr(err, "BatchDeleteByRoleId Delete err") + return +} + +// BatchDeleteByMenuId 批量删除角色菜单(根据菜单ID) +func (permSrv systemAuthPermService) BatchDeleteByMenuId(menuId uint) (e error) { + err := permSrv.db.Delete(&system.SystemAuthPerm{}, "menu_id = ?", menuId).Error + e = response.CheckErr(err, "BatchDeleteByMenuId Delete err") + return +} diff --git a/server/admin/system/role/role.go b/server/admin/system/role/role.go new file mode 100644 index 0000000..e224436 --- /dev/null +++ b/server/admin/system/role/role.go @@ -0,0 +1,86 @@ +package role + +import ( + "x_admin/core/request" + "x_admin/core/response" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +// func RoleRoute(rg *gin.RouterGroup) { +// db := core.GetDB() +// permSrv := NewSystemAuthPermService(db) +// // roleSrv := NewSystemAuthRoleService(db, permSrv) +// // adminSrv := NewSystemAuthAdminService(db, permSrv, roleSrv) +// // service := NewSystemLoginService(db, adminSrv) + +// server := NewSystemAuthRoleService(db, permSrv) + +// handle := RoleHandler{Service: server} + +// rg = rg.Group("/system", middleware.TokenAuth()) +// rg.GET("/role/all", handle.All) +// rg.GET("/role/list", middleware.RecordLog("角色列表"), handle.List) +// rg.GET("/role/detail", middleware.RecordLog("角色详情"), handle.Detail) +// rg.POST("/role/add", middleware.RecordLog("角色新增"), handle.Add) +// rg.POST("/role/edit", middleware.RecordLog("角色编辑"), handle.Edit) +// rg.POST("/role/del", middleware.RecordLog("角色删除"), handle.Del) +// } + +type RoleHandler struct { + Service ISystemAuthRoleService +} + +// all 角色所有 +func (rh RoleHandler) All(c *gin.Context) { + res, err := rh.Service.All() + response.CheckAndRespWithData(c, res, err) +} + +// list 角色列表 +func (rh RoleHandler) List(c *gin.Context) { + var page request.PageReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + res, err := rh.Service.List(page) + response.CheckAndRespWithData(c, res, err) +} + +// detail 角色详情 +func (rh RoleHandler) Detail(c *gin.Context) { + var detailReq SystemAuthRoleDetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := rh.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// add 新增角色 +func (rh RoleHandler) Add(c *gin.Context) { + var addReq SystemAuthRoleAddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &addReq)) { + return + } + response.CheckAndResp(c, rh.Service.Add(addReq)) +} + +// edit 编辑角色 +func (rh RoleHandler) Edit(c *gin.Context) { + var editReq SystemAuthRoleEditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + response.CheckAndResp(c, rh.Service.Edit(editReq)) +} + +// del 删除角色 +func (rh RoleHandler) Del(c *gin.Context) { + var delReq SystemAuthRoleDelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + response.CheckAndResp(c, rh.Service.Del(delReq.ID)) +} diff --git a/server/admin/system/role/schema.go b/server/admin/system/role/schema.go new file mode 100644 index 0000000..89f70ce --- /dev/null +++ b/server/admin/system/role/schema.go @@ -0,0 +1,55 @@ +package role + +import "x_admin/core" + +//SystemAuthRoleSimpleResp 系统角色返回简单信息 +type SystemAuthRoleSimpleResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Name string `json:"name" structs:"name"` // 角色名称 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +//SystemAuthRoleResp 系统角色返回信息 +type SystemAuthRoleResp struct { + ID uint `json:"id" structs:"id"` // 主键 + Name string `json:"name" structs:"name"` // 角色名称 + Remark string `json:"remark" structs:"remark"` // 角色备注 + Menus []uint `json:"menus" structs:"menus"` // 关联菜单 + Member int64 `json:"member" structs:"member"` // 成员数量 + Sort uint16 `json:"sort" structs:"sort"` // 角色排序 + IsDisable uint8 `json:"isDisable" structs:"isDisable"` // 是否禁用: [0=否, 1=是] + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +// + +//SystemAuthRoleDetailReq 角色详情参数 +type SystemAuthRoleDetailReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +//SystemAuthRoleAddReq 新增角色参数 +type SystemAuthRoleAddReq struct { + Name string `form:"name" binding:"required,min=1,max=30"` // 角色名称 + Sort int `form:"sort" binding:"gte=0"` // 角色排序 + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] + Remark string `form:"remark" binding:"max=200"` // 角色备注 + MenuIds string `form:"menuIds"` // 关联菜单 +} + +//SystemAuthRoleEditReq 编辑角色参数 +type SystemAuthRoleEditReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + Name string `form:"name" binding:"required,min=1,max=30"` // 角色名称 + Sort int `form:"sort" binding:"gte=0"` // 角色排序 + IsDisable uint8 `form:"isDisable" binding:"oneof=0 1"` // 是否禁用: [0=否, 1=是] + Remark string `form:"remark" binding:"max=200"` // 角色备注 + MenuIds string `form:"menuIds"` // 关联菜单 +} + +//SystemAuthRoleDelReq 删除角色参数 +type SystemAuthRoleDelReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} diff --git a/server/admin/system/role/service.go b/server/admin/system/role/service.go new file mode 100644 index 0000000..b8af967 --- /dev/null +++ b/server/admin/system/role/service.go @@ -0,0 +1,186 @@ +package role + +import ( + "strconv" + "strings" + "x_admin/config" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "github.com/fatih/structs" + "gorm.io/gorm" +) + +type ISystemAuthRoleService interface { + All() (res []SystemAuthRoleSimpleResp, e error) + List(page request.PageReq) (res response.PageResp, e error) + Detail(id uint) (res SystemAuthRoleResp, e error) + Add(addReq SystemAuthRoleAddReq) (e error) + Edit(editReq SystemAuthRoleEditReq) (e error) + Del(id uint) (e error) +} + +// NewSystemAuthRoleService 初始化 +func NewSystemAuthRoleService(db *gorm.DB, permSrv ISystemAuthPermService) ISystemAuthRoleService { + return &systemAuthRoleService{db: db, permSrv: permSrv} +} + +// systemAuthRoleService 系统角色服务实现类 +type systemAuthRoleService struct { + db *gorm.DB + permSrv ISystemAuthPermService +} + +// All 角色所有 +func (roleSrv systemAuthRoleService) All() (res []SystemAuthRoleSimpleResp, e error) { + var roles []system.SystemAuthRole + err := roleSrv.db.Order("sort desc, id desc").Find(&roles).Error + if e = response.CheckErr(err, "All Find err"); e != nil { + return + } + response.Copy(&res, roles) + return +} + +// List 根据角色ID获取菜单ID +func (roleSrv systemAuthRoleService) List(page request.PageReq) (res response.PageResp, e error) { + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + roleModel := roleSrv.db.Model(&system.SystemAuthRole{}) + var count int64 + err := roleModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + var roles []system.SystemAuthRole + err = roleModel.Limit(limit).Offset(offset).Order("sort desc, id desc").Find(&roles).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + var roleResp []SystemAuthRoleResp + response.Copy(&roleResp, roles) + for i := 0; i < len(roleResp); i++ { + roleResp[i].Menus = []uint{} + roleResp[i].Member = roleSrv.getMemberCnt(roleResp[i].ID) + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: roleResp, + }, nil +} + +// Detail 角色详情 +func (roleSrv systemAuthRoleService) Detail(id uint) (res SystemAuthRoleResp, e error) { + var role system.SystemAuthRole + err := roleSrv.db.Where("id = ?", id).Limit(1).First(&role).Error + if e = response.CheckErrDBNotRecord(err, "角色已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, role) + res.Member = roleSrv.getMemberCnt(role.ID) + res.Menus, e = roleSrv.permSrv.SelectMenuIdsByRoleId(role.ID) + return +} + +// getMemberCnt 根据角色ID获取成员数量 +func (roleSrv systemAuthRoleService) getMemberCnt(roleId uint) (count int64) { + roleSrv.db.Model(&system.SystemAuthAdmin{}).Where( + "role = ? AND is_delete = ?", roleId, 0).Count(&count) + return +} + +// Add 新增角色 +func (roleSrv systemAuthRoleService) Add(addReq SystemAuthRoleAddReq) (e error) { + var role system.SystemAuthRole + if r := roleSrv.db.Where("name = ?", strings.Trim(addReq.Name, " ")).Limit(1).First(&role); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("角色名称已存在!") + } + response.Copy(&role, addReq) + role.Name = strings.Trim(addReq.Name, " ") + // 事务 + err := roleSrv.db.Transaction(func(tx *gorm.DB) error { + txErr := tx.Create(&role).Error + var te error + if te = response.CheckErr(txErr, "Add Create in tx err"); te != nil { + return te + } + te = roleSrv.permSrv.BatchSaveByMenuIds(role.ID, addReq.MenuIds, tx) + return te + }) + e = response.CheckErr(err, "Add Transaction err") + return +} + +// Edit 编辑角色 +func (roleSrv systemAuthRoleService) Edit(editReq SystemAuthRoleEditReq) (e error) { + err := roleSrv.db.Where("id = ?", editReq.ID).Limit(1).First(&system.SystemAuthRole{}).Error + if e = response.CheckErrDBNotRecord(err, "角色已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + var role system.SystemAuthRole + if r := roleSrv.db.Where("id != ? AND name = ?", editReq.ID, strings.Trim(editReq.Name, " ")).Limit(1).First(&role); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("角色名称已存在!") + } + role.ID = editReq.ID + roleMap := structs.Map(editReq) + delete(roleMap, "ID") + delete(roleMap, "MenuIds") + roleMap["Name"] = strings.Trim(editReq.Name, " ") + // 事务 + err = roleSrv.db.Transaction(func(tx *gorm.DB) error { + txErr := tx.Model(&role).Updates(roleMap).Error + var te error + if te = response.CheckErr(txErr, "Edit Updates in tx err"); te != nil { + return te + } + if te = roleSrv.permSrv.BatchDeleteByRoleId(editReq.ID, tx); te != nil { + return te + } + if te = roleSrv.permSrv.BatchSaveByMenuIds(editReq.ID, editReq.MenuIds, tx); te != nil { + return te + } + te = roleSrv.permSrv.CacheRoleMenusByRoleId(editReq.ID) + return te + }) + e = response.CheckErr(err, "Edit Transaction err") + return +} + +// Del 删除角色 +func (roleSrv systemAuthRoleService) Del(id uint) (e error) { + err := roleSrv.db.Where("id = ?", id).Limit(1).First(&system.SystemAuthRole{}).Error + if e = response.CheckErrDBNotRecord(err, "角色已不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + if r := roleSrv.db.Where("role = ? AND is_delete = ?", id, 0).Limit(1).Find(&system.SystemAuthAdmin{}); r.RowsAffected > 0 { + return response.AssertArgumentError.Make("角色已被管理员使用,请先移除!") + } + // 事务 + err = roleSrv.db.Transaction(func(tx *gorm.DB) error { + txErr := tx.Delete(&system.SystemAuthRole{}, "id = ?", id).Error + var te error + if te = response.CheckErr(txErr, "Del Delete in tx err"); te != nil { + return te + } + if te = roleSrv.permSrv.BatchDeleteByRoleId(id, tx); te != nil { + return te + } + util.RedisUtil.HDel(config.AdminConfig.BackstageRolesKey, strconv.FormatUint(uint64(id), 10)) + return nil + }) + e = response.CheckErr(err, "Del Transaction err") + return +} diff --git a/server/config/admin.go b/server/config/admin.go new file mode 100644 index 0000000..0b83c15 --- /dev/null +++ b/server/config/admin.go @@ -0,0 +1,96 @@ +package config + +import "github.com/gin-gonic/gin" + +//AdminConfig 后台公共配置 +var AdminConfig = adminConfig{ + // 管理缓存键 + BackstageManageKey: "backstage:manage", + // 角色缓存键 + BackstageRolesKey: "backstage:roles", + // 令牌缓存键 + BackstageTokenKey: "backstage:token:", + // 令牌的集合 + BackstageTokenSet: "backstage:token:set:", + + // 免登录验证 + NotLoginUri: []string{ + "system:login", // 登录接口 + "common:index:config", // 配置接口 + }, + + // 免权限验证 + NotAuthUri: []string{ + "system:logout", // 退出登录 + "system:menu:menus", // 系统菜单 + "system:menu:route", // 菜单路由 + "system:admin:upInfo", // 管理员更新 + "system:admin:self", // 管理员信息 + "system:role:all", // 所有角色 + "system:post:all", // 所有岗位 + "system:dept:list", // 所有部门 + "setting:dict:type:all", // 所有字典类型 + "setting:dict:data:all", // 所有字典数据 + "article:cate:all", // 所有文章分类 + }, + + // 演示模式白名单 + ShowWhitelistUri: []string{ + "system:login", // 登录接口 + "system:logout", // 退出登录 + }, + + // 管理员账号id + SuperAdminId: 1, + ReqAdminIdKey: "admin_id", + ReqRoleIdKey: "role", + ReqUsernameKey: "username", + ReqNicknameKey: "nickname", +} + +type adminConfig struct { + BackstageManageKey string + BackstageRolesKey string + BackstageTokenKey string + BackstageTokenSet string + NotLoginUri []string + NotAuthUri []string + ShowWhitelistUri []string + SuperAdminId uint + ReqAdminIdKey string + ReqRoleIdKey string + ReqUsernameKey string + ReqNicknameKey string +} + +func (cnf adminConfig) GetAdminId(c *gin.Context) uint { + adminId, ok := c.Get(cnf.ReqAdminIdKey) + if !ok { + return 0 + } + return adminId.(uint) +} + +func (cnf adminConfig) GetRoleId(c *gin.Context) string { + roleId, ok := c.Get(cnf.ReqRoleIdKey) + if !ok { + return "" + } + return roleId.(string) +} + +func (cnf adminConfig) GetUsername(c *gin.Context) string { + username, ok := c.Get(cnf.ReqUsernameKey) + if !ok { + return "" + } + return username.(string) +} + +func (cnf adminConfig) GetNickname(c *gin.Context) string { + nickname, ok := c.Get(cnf.ReqNicknameKey) + if !ok { + return "" + } + return nickname.(string) +} diff --git a/server/config/config.go b/server/config/config.go new file mode 100644 index 0000000..fe99b6b --- /dev/null +++ b/server/config/config.go @@ -0,0 +1,122 @@ +package config + +import ( + "flag" + "fmt" + "log" + "os" + + "github.com/spf13/viper" +) + +var Config = loadConfig(".") + +// envConfig 环境配置 +type envConfig struct { + RootPath string // 项目根目录 + GinMode string `mapstructure:"GIN_MODE"` // gin运行模式 + PublicUrl string `mapstructure:"PUBLIC_URL"` // 对外发布的Url + OssDomain string `mapstructure:"OSS_DOMAIN"` // OSS域名 + ServerPort int `mapstructure:"SERVER_PORT"` // 服务运行端口 + DisallowModify bool `mapstructure:"DISALLOW_MODIFY"` // 禁止修改操作 (演示功能,限制POST请求) + PublicPrefix string // 资源访问前缀 + UploadDirectory string `mapstructure:"UPLOAD_DIRECTORY"` // 上传文件路径 + RedisUrl string `mapstructure:"REDIS_URL"` // Redis源配置 + RedisPoolSize int // Redis连接池大小 + DatabaseUrl string `mapstructure:"DATABASE_URL"` // 数据源配置 + DbTablePrefix string // Mysql表前缀 + DbDefaultStringSize uint // 数据库string类型字段的默认长度 + DbMaxIdleConns int // 数据库空闲连接池最大值 + DbMaxOpenConns int // 数据库连接池最大值 + DbConnMaxLifetimeSeconds int16 // 连接可复用的最大时间(秒:默认28800秒),请根据这个sql查处的时间设置: show variables like 'wait_timeout' + Version string // 版本 + Secret string // 系统加密字符 + StaticPath string // 静态资源URL路径 + StaticDirectory string // 静态资源本地路径 + RedisPrefix string // Redis键前缀 + UploadImageSize int64 // 上传图片限制 + UploadVideoSize int64 // 上传视频限制 + UploadImageExt []string // 上传图片扩展 + UploadVideoExt []string // 上传视频扩展 +} + +// loadConfig 加载配置 +func loadConfig(envPath string) envConfig { + var cfgPath string + flag.StringVar(&cfgPath, "c", "", "config file envPath.") + flag.Parse() + if cfgPath == "" { + viper.AddConfigPath(envPath) + viper.SetConfigFile(".env") + } else { + viper.SetConfigFile(cfgPath) + } + viper.AutomaticEnv() + // var rootPath string + // if _, filename, _, ok := runtime.Caller(0); ok { + // rootPath = path.Dir(path.Dir(filename)) + // } + rootPath, err := os.Getwd() + if err != nil { + log.Fatal(err) + } + fmt.Println("rootPath:", rootPath) + config := envConfig{ + RootPath: rootPath, + GinMode: "debug", + // 服务运行端口 + ServerPort: 8000, + + OssDomain: "", + + // 禁止修改操作 (演示功能,限制POST请求) + DisallowModify: false, + // 资源访问前缀 + PublicPrefix: "/api/uploads", + // 上传文件路径 + UploadDirectory: "/tmp/uploads/x_admin-go/", + // Redis源配置 + RedisUrl: "redis://localhost:6379", + RedisPoolSize: 100, + // 数据源配置 + DatabaseUrl: "x_admin:x_admin@tcp(localhost:3306)/x_admin?charset=utf8mb4&parseTime=True&loc=Local", + DbTablePrefix: "x_", + DbDefaultStringSize: 256, + DbMaxIdleConns: 10, + DbMaxOpenConns: 100, + // 连接可复用的最大时间(秒:默认28800秒) + DbConnMaxLifetimeSeconds: 28800, + // 全局配置 + // 版本 + Version: "v1.1.0", + // 系统加密字符 + Secret: "UVTIyzCy", + // 静态资源URL路径 + StaticPath: "/api/static", + // 静态资源本地路径 + StaticDirectory: "static", + // Redis键前缀 + RedisPrefix: "Like:", + // 上传图片限制 + UploadImageSize: 1024 * 1024 * 10, + // 上传视频限制 + UploadVideoSize: 1024 * 1024 * 30, + // 上传图片扩展 + UploadImageExt: []string{"png", "jpg", "jpeg", "gif", "ico", "bmp"}, + // 上传视频扩展 + UploadVideoExt: []string{"mp4", "mp3", "avi", "flv", "rmvb", "mov"}, + } + err = viper.ReadInConfig() + if err != nil { + log.Fatal("loadConfig ReadInConfig err:", err) + } + err = viper.Unmarshal(&config) + if err != nil { + log.Fatal("loadConfig Unmarshal err:", err) + } + // PublicUrl未设置设置默认值 + // if config.PublicUrl == "" { + // // config.PublicUrl = "http://127.0.0.1:" + strconv.Itoa(config.ServerPort) + // } + return config +} diff --git a/server/config/gen.go b/server/config/gen.go new file mode 100644 index 0000000..a414316 --- /dev/null +++ b/server/config/gen.go @@ -0,0 +1,17 @@ +package config + +//GenConfig 代码生成器公共配置 +var GenConfig = genConfig{ + // 基础包名 + PackageName: "gencode", + // 是否去除表前缀 + IsRemoveTablePrefix: true, + // 生成代码根路径 + GenRootPath: "/tmp/target", +} + +type genConfig struct { + PackageName string + IsRemoveTablePrefix bool + GenRootPath string +} diff --git a/server/core/db.go b/server/core/db.go new file mode 100644 index 0000000..9dfa6f1 --- /dev/null +++ b/server/core/db.go @@ -0,0 +1,76 @@ +package core + +import ( + "log" + "os" + "time" + "x_admin/config" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "gorm.io/gorm/schema" +) + +var db = initMysql() + +func GetDB() *gorm.DB { + return db +} + +// initMysql 初始化mysql会话 +func initMysql() *gorm.DB { + // 日志配置 + slowThreshold := time.Second + ignoreRecordNotFoundError := true + logLevel := logger.Warn + if config.Config.GinMode == "debug" { + logLevel = logger.Info + slowThreshold = 200 * time.Millisecond + ignoreRecordNotFoundError = false + } + logger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注) + logger.Config{ + SlowThreshold: slowThreshold, // 慢 SQL 阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: ignoreRecordNotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: true, // 彩色打印 + }, + ) + // 初始化会话 + db, err := gorm.Open(mysql.New(mysql.Config{ + DSN: config.Config.DatabaseUrl, // DSN data source name + DefaultStringSize: config.Config.DbDefaultStringSize, // string 类型字段的默认长度 + SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置 + }), &gorm.Config{ + SkipDefaultTransaction: true, // 禁用默认事务 + NamingStrategy: schema.NamingStrategy{ + TablePrefix: config.Config.DbTablePrefix, // 表名前缀 + SingularTable: true, // 使用单一表名, eg. `User` => `user` + }, + DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束 + Logger: logger, // 自定义Logger + }) + if err != nil { + log.Fatal("initMysql gorm.Open err:", err) + } + db.InstanceSet("gorm:table_options", "ENGINE=InnoDB") + sqlDB, err := db.DB() + if err != nil { + log.Fatal("initMysql db.DB err:", err) + } + // 数据库空闲连接池最大值 + sqlDB.SetMaxIdleConns(config.Config.DbMaxIdleConns) + // 数据库连接池最大值 + sqlDB.SetMaxOpenConns(config.Config.DbMaxOpenConns) + // 连接可复用的最大时间 + sqlDB.SetConnMaxLifetime(time.Duration(config.Config.DbConnMaxLifetimeSeconds) * time.Second) + return db +} + +func DBTableName(model interface{}) string { + stmt := &gorm.Statement{DB: db} + stmt.Parse(model) + return stmt.Schema.Table +} diff --git a/server/core/logger.go b/server/core/logger.go new file mode 100644 index 0000000..863c9e3 --- /dev/null +++ b/server/core/logger.go @@ -0,0 +1,21 @@ +package core + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "os" +) + +var Logger = initLogger() + +//initLogger 初始化zap日志 +func initLogger() *zap.SugaredLogger { + zap.NewDevelopmentConfig() + cfg := zap.NewProductionEncoderConfig() + cfg.EncodeTime = zapcore.ISO8601TimeEncoder + cfg.EncodeLevel = zapcore.CapitalLevelEncoder + cfg.FunctionKey = "F" + core := zapcore.NewCore(zapcore.NewConsoleEncoder(cfg), zapcore.AddSync(os.Stderr), zapcore.InfoLevel) + logger := zap.New(core, zap.AddCaller()) + return logger.Sugar() +} diff --git a/server/core/redis.go b/server/core/redis.go new file mode 100644 index 0000000..8beae23 --- /dev/null +++ b/server/core/redis.go @@ -0,0 +1,29 @@ +package core + +import ( + "context" + "log" + "time" + "x_admin/config" + + "github.com/go-redis/redis/v9" +) + +var Redis = initRedis() + +// initRedis 初始化redis客户端 +func initRedis() *redis.Client { + opt, err := redis.ParseURL(config.Config.RedisUrl) + if err != nil { + log.Fatal("initRedis redis.ParseURL err: ", err) + } + opt.PoolSize = config.Config.RedisPoolSize + client := redis.NewClient(opt) + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + _, err = client.Ping(ctx).Result() + if err != nil { + log.Fatal("initRedis client.Ping err: ", err) + } + return client +} diff --git a/server/core/request/common.go b/server/core/request/common.go new file mode 100644 index 0000000..4091005 --- /dev/null +++ b/server/core/request/common.go @@ -0,0 +1,7 @@ +package request + +//PageReq 分页请求参数 +type PageReq struct { + PageNo int `form:"pageNo,default=1" validate:"omitempty,gte=1"` // 页码 + PageSize int `form:"pageSize,default=20" validate:"omitempty,gt=0,lte=60"` // 每页大小 +} diff --git a/server/core/response/common.go b/server/core/response/common.go new file mode 100644 index 0000000..5c963cb --- /dev/null +++ b/server/core/response/common.go @@ -0,0 +1,9 @@ +package response + +//PageResp 分页返回值 +type PageResp struct { + Count int64 `json:"count"` // 总数 + PageNo int `json:"pageNo"` // 页No + PageSize int `json:"pageSize"` // 每页Size + Lists interface{} `json:"lists"` // 数据 +} diff --git a/server/core/response/error.go b/server/core/response/error.go new file mode 100644 index 0000000..739e319 --- /dev/null +++ b/server/core/response/error.go @@ -0,0 +1,15 @@ +package response + +import ( + "github.com/gin-gonic/gin" +) + +//NoRoute 无路由的响应 +func NoRoute(c *gin.Context) { + Fail(c, Request404Error) +} + +//NoMethod 无方法的响应 +func NoMethod(c *gin.Context) { + Fail(c, Request405Error) +} diff --git a/server/core/response/response.go b/server/core/response/response.go new file mode 100644 index 0000000..5911382 --- /dev/null +++ b/server/core/response/response.go @@ -0,0 +1,208 @@ +package response + +import ( + "errors" + "net/http" + "strconv" + "x_admin/core" + + "github.com/gin-gonic/gin" + "github.com/jinzhu/copier" + "go.uber.org/zap" + "gorm.io/gorm" +) + +// RespType 响应类型 +type RespType struct { + code int + msg string + data interface{} +} + +// Response 响应格式结构 +type Response struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +var ( + Success = RespType{code: 200, msg: "成功"} + Failed = RespType{code: 300, msg: "失败"} + + ParamsValidError = RespType{code: 310, msg: "参数校验错误"} + ParamsTypeError = RespType{code: 311, msg: "参数类型错误"} + RequestMethodError = RespType{code: 312, msg: "请求方法错误"} + AssertArgumentError = RespType{code: 313, msg: "断言参数错误"} + + LoginAccountError = RespType{code: 330, msg: "登录账号或密码错误"} + LoginDisableError = RespType{code: 331, msg: "登录账号已被禁用了"} + TokenEmpty = RespType{code: 332, msg: "token参数为空"} + TokenInvalid = RespType{code: 333, msg: "token参数无效"} + + NoPermission = RespType{code: 403, msg: "无相关权限"} + Request404Error = RespType{code: 404, msg: "请求接口不存在"} + Request405Error = RespType{code: 405, msg: "请求方法不允许"} + + SystemError = RespType{code: 500, msg: "系统错误"} +) + +// Error 实现error方法 +func (rt RespType) Error() string { + return strconv.Itoa(rt.code) + ":" + rt.msg +} + +// Make 以响应类型生成信息 +func (rt RespType) Make(msg string) RespType { + rt.msg = msg + return rt +} + +// MakeData 以响应类型生成数据 +func (rt RespType) MakeData(data interface{}) RespType { + rt.data = data + return rt +} + +// Code 获取code +func (rt RespType) Code() int { + return rt.code +} + +// Msg 获取msg +func (rt RespType) Msg() string { + return rt.msg +} + +// Data 获取data +func (rt RespType) Data() interface{} { + return rt.data +} + +// Result 统一响应 +func Result(c *gin.Context, resp RespType, data interface{}) { + if data == nil { + data = resp.data + } + if resp != Success { + c.Error(resp) + } + c.JSON(http.StatusOK, Response{ + Code: resp.code, + Msg: resp.msg, + Data: data, + }) +} + +// Copy 拷贝结构体 +func Copy(toValue interface{}, fromValue interface{}) interface{} { + if err := copier.Copy(toValue, fromValue); err != nil { + core.Logger.Errorf("Copy err: err=[%+v]", err) + panic(SystemError) + } + return toValue +} + +// Ok 正常响应 +func Ok(c *gin.Context) { + Result(c, Success, []string{}) +} + +// OkWithMsg 正常响应附带msg +func OkWithMsg(c *gin.Context, msg string) { + resp := Success + resp.msg = msg + Result(c, resp, []string{}) +} + +// OkWithData 正常响应附带data +func OkWithData(c *gin.Context, data interface{}) { + Result(c, Success, data) +} + +// respLogger 打印日志 +func respLogger(resp RespType, template string, args ...interface{}) { + loggerFunc := core.Logger.WithOptions(zap.AddCallerSkip(2)).Warnf + if resp.code >= 500 { + loggerFunc = core.Logger.WithOptions(zap.AddCallerSkip(1)).Errorf + } + loggerFunc(template, args...) +} + +// Fail 错误响应 +func Fail(c *gin.Context, resp RespType) { + respLogger(resp, "Request Fail: url=[%s], resp=[%+v]", c.Request.URL.Path, resp) + Result(c, resp, []string{}) +} + +// FailWithMsg 错误响应附带msg +func FailWithMsg(c *gin.Context, resp RespType, msg string) { + resp.msg = msg + respLogger(resp, "Request FailWithMsg: url=[%s], resp=[%+v]", c.Request.URL.Path, resp) + Result(c, resp, []string{}) +} + +// FailWithData 错误响应附带data +func FailWithData(c *gin.Context, resp RespType, data interface{}) { + respLogger(resp, "Request FailWithData: url=[%s], resp=[%+v], data=[%+v]", c.Request.URL.Path, resp, data) + Result(c, resp, data) +} + +// IsFailWithResp 判断是否出现错误,并追加错误返回信息 +func IsFailWithResp(c *gin.Context, err error) bool { + if err == nil { + return false + } + switch v := err.(type) { + // 自定义类型 + case RespType: + data := v.Data() + if data == nil { + data = []string{} + } + FailWithData(c, v, data) + // 其他类型 + default: + Fail(c, SystemError) + } + return true +} + +// CheckAndResp 判断是否出现错误,并返回对应响应 +func CheckAndResp(c *gin.Context, err error) { + if IsFailWithResp(c, err) { + return + } + Ok(c) +} + +// CheckAndRespWithData 判断是否出现错误,并返回对应响应(带data数据) +func CheckAndRespWithData(c *gin.Context, data interface{}, err error) { + if IsFailWithResp(c, err) { + return + } + OkWithData(c, data) +} + +// CheckErr 校验未知错误并抛出 +func CheckErr(err error, template string, args ...interface{}) (e error) { + prefix := ": " + if len(args) > 0 { + prefix = " ," + } + args = append(args, err) + if err != nil { + core.Logger.WithOptions(zap.AddCallerSkip(1)).Errorf(template+prefix+"err=[%+v]", args...) + return SystemError + } + return +} + +// CheckErrDBNotRecord 校验数据库记录不存在的错误 +func CheckErrDBNotRecord(err error, msg string) (e error) { + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + core.Logger.WithOptions(zap.AddCallerSkip(1)).Infof("CheckErrDBNotRecord err: err=[%+v]", err) + return AssertArgumentError.Make(msg) + } + return +} diff --git a/server/core/time.go b/server/core/time.go new file mode 100644 index 0000000..2f3af8d --- /dev/null +++ b/server/core/time.go @@ -0,0 +1,53 @@ +package core + +import ( + "encoding/json" + "time" +) + +const DateFormat = "2006-01-02" +const TimeFormat = "2006-01-02 15:04:05" + +//TsTime 自定义时间格式 +type TsTime int64 +type OnlyRespTsTime time.Time + +////TsDate 自定义日期格式 +//type TsDate int64 +// +//func (tsd *TsDate) UnmarshalJSON(bs []byte) error { +// var date string +// err := json.Unmarshal(bs, &date) +// if err != nil { +// return err +// } +// tt, _ := time.ParseInLocation(DateFormat, date, time.Local) +// *tsd = TsDate(tt.Unix()) +// return nil +//} +// +//func (tsd TsDate) MarshalJSON() ([]byte, error) { +// tt := time.Unix(int64(tsd), 0).Format(DateFormat) +// return json.Marshal(tt) +//} + +func (tst *TsTime) UnmarshalJSON(bs []byte) error { + var date string + err := json.Unmarshal(bs, &date) + if err != nil { + return err + } + tt, _ := time.ParseInLocation(TimeFormat, date, time.Local) + *tst = TsTime(tt.Unix()) + return nil +} + +func (tst TsTime) MarshalJSON() ([]byte, error) { + tt := time.Unix(int64(tst), 0).Format(TimeFormat) + return json.Marshal(tt) +} + +func (otst OnlyRespTsTime) MarshalJSON() ([]byte, error) { + tt := time.Time(otst).Format(TimeFormat) + return json.Marshal(tt) +} diff --git a/server/core/uaparser.go b/server/core/uaparser.go new file mode 100644 index 0000000..e80e5de --- /dev/null +++ b/server/core/uaparser.go @@ -0,0 +1,5 @@ +package core + +import "github.com/ua-parser/uap-go/uaparser" + +var UAParser = uaparser.NewFromSaved() diff --git a/server/generator/enter.go b/server/generator/enter.go new file mode 100644 index 0000000..f3cbd2f --- /dev/null +++ b/server/generator/enter.go @@ -0,0 +1,11 @@ +package generator + +import ( + "x_admin/generator/gen" + + "github.com/gin-gonic/gin" +) + +func RegisterGroup(rg *gin.RouterGroup) { + gen.GenRoute(rg) +} diff --git a/server/generator/gen/gen.go b/server/generator/gen/gen.go new file mode 100644 index 0000000..67a0d2a --- /dev/null +++ b/server/generator/gen/gen.go @@ -0,0 +1,161 @@ +package gen + +import ( + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + + "net/http" + "strings" + "x_admin/middleware" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +func GenRoute(rg *gin.RouterGroup) { + db := core.GetDB() + // permSrv := system.NewSystemAuthPermService(db) + // roleSrv := system.NewSystemAuthRoleService(db, permSrv) + // adminSrv := system.NewSystemAuthAdminService(db, permSrv, roleSrv) + // service := system.NewSystemLoginService(db, adminSrv) + + server := NewGenerateService(db) + + handle := genHandler{Service: server} + + rg = rg.Group("/gen", middleware.TokenAuth()) + rg.GET("/db", handle.dbTables) + rg.GET("/list", handle.List) + rg.GET("/detail", handle.Detail) + rg.POST("/importTable", handle.importTable) + rg.POST("/syncTable", handle.syncTable) + rg.POST("/editTable", handle.editTable) + rg.POST("/delTable", handle.delTable) + rg.GET("/previewCode", handle.previewCode) + rg.GET("/genCode", handle.genCode) + rg.GET("/downloadCode", handle.downloadCode) +} + +type genHandler struct { + Service IGenerateService +} + +// dbTables 数据表列表 +func (gh genHandler) dbTables(c *gin.Context) { + var page request.PageReq + var tbReq DbTablesReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &tbReq)) { + return + } + res, err := gh.Service.DbTables(page, tbReq) + response.CheckAndRespWithData(c, res, err) +} + +// list 生成列表 +func (gh genHandler) List(c *gin.Context) { + var page request.PageReq + var listReq ListTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := gh.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +// detail 生成详情 +func (gh genHandler) Detail(c *gin.Context) { + var detailReq DetailTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := gh.Service.Detail(detailReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// importTable 导入表结构 +func (gh genHandler) importTable(c *gin.Context) { + var importReq ImportTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &importReq)) { + return + } + err := gh.Service.ImportTable(strings.Split(importReq.Tables, ",")) + response.CheckAndResp(c, err) +} + +// syncTable 同步表结构 +func (gh genHandler) syncTable(c *gin.Context) { + var syncReq SyncTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &syncReq)) { + return + } + err := gh.Service.SyncTable(syncReq.ID) + response.CheckAndResp(c, err) +} + +// editTable 编辑表结构 +func (gh genHandler) editTable(c *gin.Context) { + var editReq EditTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) { + return + } + err := gh.Service.EditTable(editReq) + response.CheckAndResp(c, err) +} + +// delTable 删除表结构 +func (gh genHandler) delTable(c *gin.Context) { + var delReq DelTableReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &delReq)) { + return + } + err := gh.Service.DelTable(delReq.Ids) + response.CheckAndResp(c, err) +} + +// previewCode 预览代码 +func (gh genHandler) previewCode(c *gin.Context) { + var previewReq PreviewCodeReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &previewReq)) { + return + } + res, err := gh.Service.PreviewCode(previewReq.ID) + response.CheckAndRespWithData(c, res, err) +} + +// genCode 生成代码 +func (gh genHandler) genCode(c *gin.Context) { + var genReq GenCodeReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &genReq)) { + return + } + for _, table := range strings.Split(genReq.Tables, ",") { + err := gh.Service.GenCode(table) + if response.IsFailWithResp(c, err) { + return + } + } + response.Ok(c) +} + +// downloadCode 下载代码 +func (gh genHandler) downloadCode(c *gin.Context) { + var downloadReq DownloadReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &downloadReq)) { + return + } + zipBytes, err := gh.Service.DownloadCode(strings.Split(downloadReq.Tables, ",")) + if response.IsFailWithResp(c, err) { + return + } + contentType := "application/zip" + c.Header("Content-Type", contentType) + c.Header("Content-Disposition", "attachment; filename=gen-"+downloadReq.Tables+".zip") + c.Data(http.StatusOK, contentType, zipBytes) +} diff --git a/server/generator/gen/schema.go b/server/generator/gen/schema.go new file mode 100644 index 0000000..91f4d5c --- /dev/null +++ b/server/generator/gen/schema.go @@ -0,0 +1,179 @@ +package gen + +import ( + "time" + "x_admin/core" +) + +// DbTablesReq 库表列表参数 +type DbTablesReq struct { + TableName string `form:"tableName"` // 表名称 + TableComment string `form:"tableComment"` // 表描述 +} + +// ListTableReq 生成列表参数 +type ListTableReq struct { + TableName string `form:"tableName"` // 表名称 + TableComment string `form:"tableComment"` // 表描述 + StartTime time.Time `form:"startTime" time_format:"2006-01-02"` // 开始时间 + EndTime time.Time `form:"endTime" time_format:"2006-01-02"` // 结束时间 +} + +// DetailTableReq 生成详情参数 +type DetailTableReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +// ImportTableReq 导入表结构参数 +type ImportTableReq struct { + Tables string `form:"tables" binding:"required"` // 导入的表, 用","分隔 +} + +// SyncTableReq 同步表结构参数 +type SyncTableReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +// EditColumn 表编辑列 +type EditColumn struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + TableID uint `form:"tableId" binding:"required,gt=0"` // 表ID + + ColumnName string `form:"columnName" binding:"required,max=200"` // 列名称 + ColumnLength uint `form:"columnLength" binding:"required,max=5"` // 列长度 + ColumnType string `form:"columnType" binding:"required,max=100"` // 列类型 + + GoField string `form:"goField" binding:"required,max=100"` // 字段 + GoType string `form:"goType" binding:"required,max=100"` // 字段类型 + + ColumnComment string `form:"columnComment" binding:"required,max=200"` // 列描述 + + IsPk uint8 `form:"isPk" binding:"oneof=0 1"` // 是否主键: [0=否, 1=是] + IsIncrement uint8 `form:"isIncrement" binding:"oneof=0 1"` // 是否自增: [0=否, 1=是] + IsRequired uint8 `form:"isStop" binding:"oneof=0 1"` // 是否必填: [0=否, 1=是] + IsInsert uint8 `form:"isInsert" binding:"oneof=0 1"` // 是否新增字段: [0=否, 1=是] + IsEdit uint8 `form:"isEdit" binding:"oneof=0 1"` // 是否编辑字段: [0=否, 1=是] + IsList uint8 `form:"isList" binding:"oneof=0 1"` // 是否列表字段: [0=否, 1=是] + IsQuery uint8 `form:"isQuery" binding:"oneof=0 1"` // 是否查询字段: [0=否, 1=是] + QueryType string `form:"queryType" binding:"required,max=30"` // 查询方式 + HtmlType string `form:"htmlType" binding:"required,max=30"` // 表单类型 + DictType string `form:"dictType" binding:"required,max=200"` // 字典类型 +} + +// EditTableReq 编辑表结构参数 +type EditTableReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 + TableName string `form:"tableName" binding:"required,min=1,max=200"` // 表名称 + EntityName string `form:"entityName" binding:"required,min=1,max=200"` // 实体名称 + TableComment string `form:"tableComment" binding:"required,min=1,max=200"` // 表描述 + AuthorName string `form:"authorName" binding:"max=100"` // 作者名称 + Remarks string `form:"remarks" binding:"max=60"` // 备注信息 + GenTpl string `form:"genTpl" binding:"oneof=crud tree"` // 生成模板方式: [crud=单表, tree=树表] + ModuleName string `form:"moduleName" binding:"required,min=1,max=60"` // 生成模块名 + FunctionName string `form:"functionName" binding:"required,min=1,max=60"` // 生成功能名 + GenType int `form:"genType" binding:"oneof=0 1"` // 生成代码方式: [0=zip压缩包, 1=自定义路径] + GenPath string `form:"genPath,default=/" binding:"required,max=60"` // 生成路径 + TreePrimary string `form:"treePrimary"` // 树表主键 + TreeParent string `form:"treeParent"` // 树表父键 + TreeName string `form:"treeName"` // 树表名称 + SubTableName string `form:"subTableName"` // 子表名称 + SubTableFk string `form:"subTableFk"` // 子表外键 + Columns []EditColumn `form:"columns" binding:"required"` // 字段列表 +} + +// DelTableReq 删除表结构参数 +type DelTableReq struct { + Ids []uint `form:"ids" binding:"required"` // 主键 +} + +// PreviewCodeReq 预览代码参数 +type PreviewCodeReq struct { + ID uint `form:"id" binding:"required,gt=0"` // 主键 +} + +// GenCodeReq 生成代码参数 +type GenCodeReq struct { + Tables string `form:"tables" binding:"required"` // 生成的表, 用","分隔 +} + +// DownloadReq 下载代码参数 +type DownloadReq struct { + Tables string `form:"tables" binding:"required"` // 下载的表, 用","分隔 +} + +// DbTableResp 数据表返回信息 +type DbTableResp struct { + TableName string `json:"tableName" structs:"tableName"` // 表的名称 + TableComment string `json:"tableComment" structs:"tableComment"` // 表的描述 + CreateTime core.OnlyRespTsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.OnlyRespTsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +// GenTableResp 生成表返回信息 +type GenTableResp struct { + ID uint `json:"id" structs:"id"` // 主键 + GenType int `json:"genType" structs:"genType"` // 生成类型 + TableName string `json:"tableName" structs:"tableName"` // 表名称 + TableComment string `json:"tableComment" structs:"tableComment"` // 表描述 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +// GenTableBaseResp 生成表基本返回信息 +type GenTableBaseResp struct { + ID uint `json:"id" structs:"id"` // 主键 + TableName string `json:"tableName" structs:"tableName"` // 表的名称 + TableComment string `json:"tableComment" structs:"tableComment"` // 表的描述 + EntityName string `json:"entityName" structs:"entityName"` // 实体名称 + AuthorName string `json:"authorName" structs:"authorName"` // 作者名称 + Remarks string `json:"remarks" structs:"remarks"` // 备注信息 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +// GenTableGenResp 生成表生成返回信息 +type GenTableGenResp struct { + GenTpl string `json:"genTpl" structs:"genTpl"` // 生成模板方式: [crud=单表, tree=树表] + GenType int `json:"genType" structs:"genType"` // 生成代码方式: [0=zip压缩包, 1=自定义路径] + GenPath string `json:"genPath" structs:"genPath"` // 生成代码路径: [不填默认项目路径] + ModuleName string `json:"moduleName" structs:"moduleName"` // 生成模块名 + FunctionName string `json:"functionName" structs:"functionName"` // 生成功能名 + TreePrimary string `json:"treePrimary" structs:"treePrimary"` // 树主键字段 + TreeParent string `json:"treeParent" structs:"treeParent"` // 树父级字段 + TreeName string `json:"treeName" structs:"treeName"` // 树显示字段 + SubTableName string `json:"subTableName" structs:"subTableName"` // 关联表名称 + SubTableFk string `json:"subTableFk" structs:"subTableFk"` // 关联表外键 +} + +// GenColumnResp 生成列返回信息 +type GenColumnResp struct { + ID uint `json:"id" structs:"id"` // 字段主键 + TableID uint `json:"tableId" structs:"tableId"` // 归属表主键 + + ColumnName string `json:"columnName" structs:"columnName"` // 字段名称 + ColumnComment string `json:"columnComment" structs:"columnComment"` // 字段描述 + ColumnLength int `json:"columnLength" structs:"columnLength"` // 字段长度 + ColumnType string `json:"columnType" structs:"columnType"` // 字段类型 + GoType string `json:"goType" structs:"goType"` // Go类型 + GoField string `json:"goField" structs:"goField"` // Go字段 + + IsPk uint8 `json:"isPk" structs:"isPk"` + IsIncrement uint8 `json:"isIncrement" structs:"isIncrement"` + IsRequired uint8 `json:"isRequired" structs:"isRequired"` // 是否必填 + IsInsert uint8 `json:"isInsert" structs:"isInsert"` // 是否为插入字段 + IsEdit uint8 `json:"isEdit" structs:"isEdit"` // 是否编辑字段 + IsList uint8 `json:"isList" structs:"isList"` // 是否列表字段 + IsQuery uint8 `json:"isQuery" structs:"isQuery"` // 是否查询字段 + QueryType string `json:"queryType" structs:"queryType"` // 查询方式: [等于、不等于、大于、小于、范围] + HtmlType string `json:"htmlType" structs:"htmlType"` // 显示类型: [文本框、文本域、下拉框、复选框、单选框、日期控件] + DictType string `json:"dictType" structs:"dictType"` // 字典类型 + CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间 + UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间 +} + +// GenTableDetailResp 生成表详情返回信息 +type GenTableDetailResp struct { + Base GenTableBaseResp `json:"base" structs:"base"` // 基本信息 + Gen GenTableGenResp `json:"gen" structs:"gen"` // 生成信息 + Column []GenColumnResp `json:"column" structs:"column"` // 字段列表 +} diff --git a/server/generator/gen/service.go b/server/generator/gen/service.go new file mode 100644 index 0000000..818b2f2 --- /dev/null +++ b/server/generator/gen/service.go @@ -0,0 +1,448 @@ +package gen + +import ( + "archive/zip" + "bytes" + "x_admin/config" + "x_admin/core/request" + "x_admin/core/response" + + "strings" + "x_admin/generator/tpl_utils" + "x_admin/model/gen" + "x_admin/util" + + "gorm.io/gorm" +) + +type IGenerateService interface { + DbTables(page request.PageReq, req DbTablesReq) (res response.PageResp, e error) + List(page request.PageReq, listReq ListTableReq) (res response.PageResp, e error) + Detail(id uint) (res GenTableDetailResp, e error) + ImportTable(tableNames []string) (e error) + SyncTable(id uint) (e error) + EditTable(editReq EditTableReq) (e error) + DelTable(ids []uint) (e error) + PreviewCode(id uint) (res map[string]string, e error) + GenCode(tableName string) (e error) + DownloadCode(tableNames []string) ([]byte, error) +} + +// NewGenerateService 初始化 +func NewGenerateService(db *gorm.DB) IGenerateService { + return &generateService{db: db} +} + +// GenerateService 代码生成服务实现类 +type generateService struct { + db *gorm.DB +} + +// DbTables 库表列表 +func (genSrv generateService) DbTables(page request.PageReq, dbReq DbTablesReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + tbModel := tpl_utils.GenUtil.GetDbTablesQuery(genSrv.db, dbReq.TableName, dbReq.TableComment) + // 总数 + var count int64 + err := tbModel.Count(&count).Error + if e = response.CheckErr(err, "DbTables Count err"); e != nil { + return + } + // 数据 + var tbResp []DbTableResp + err = tbModel.Limit(limit).Offset(offset).Find(&tbResp).Error + if e = response.CheckErr(err, "DbTables Find err"); e != nil { + return + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: tbResp, + }, nil +} + +// List 生成列表 +func (genSrv generateService) List(page request.PageReq, listReq ListTableReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + genModel := genSrv.db.Model(&gen.GenTable{}) + if listReq.TableName != "" { + genModel = genModel.Where("table_name like ?", "%"+listReq.TableName+"%") + } + if listReq.TableComment != "" { + genModel = genModel.Where("table_comment like ?", "%"+listReq.TableComment+"%") + } + if !listReq.StartTime.IsZero() { + genModel = genModel.Where("create_time >= ?", listReq.StartTime.Unix()) + } + if !listReq.EndTime.IsZero() { + genModel = genModel.Where("create_time <= ?", listReq.EndTime.Unix()) + } + // 总数 + var count int64 + err := genModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + // 数据 + var genResp []GenTableResp + err = genModel.Limit(limit).Offset(offset).Find(&genResp).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: genResp, + }, nil +} + +// Detail 生成详情 +func (genSrv generateService) Detail(id uint) (res GenTableDetailResp, e error) { + var genTb gen.GenTable + err := genSrv.db.Where("id = ?", id).Limit(1).First(&genTb).Error + if e = response.CheckErrDBNotRecord(err, "查询的数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail Find err"); e != nil { + return + } + var columns []gen.GenTableColumn + err = genSrv.db.Where("table_id = ?", id).Order("sort").Find(&columns).Error + if e = response.CheckErr(err, "Detail Find err"); e != nil { + return + } + var base GenTableBaseResp + response.Copy(&base, genTb) + var gen GenTableGenResp + response.Copy(&gen, genTb) + var colResp []GenColumnResp + response.Copy(&colResp, columns) + return GenTableDetailResp{ + Base: base, + Gen: gen, + Column: colResp, + }, e +} + +// ImportTable 导入表结构 +func (genSrv generateService) ImportTable(tableNames []string) (e error) { + var dbTbs []DbTableResp + err := tpl_utils.GenUtil.GetDbTablesQueryByNames(genSrv.db, tableNames).Find(&dbTbs).Error + if e = response.CheckErr(err, "ImportTable Find tables err"); e != nil { + return + } + var tables []gen.GenTable + response.Copy(&tables, dbTbs) + if len(tables) == 0 { + e = response.AssertArgumentError.Make("表不存在!") + return + } + err = genSrv.db.Transaction(func(tx *gorm.DB) error { + for i := 0; i < len(tables); i++ { + //生成表信息 + genTable := tpl_utils.GenUtil.InitTable(tables[i]) + txErr := tx.Create(&genTable).Error + if te := response.CheckErr(txErr, "ImportTable Create table err"); te != nil { + return te + } + // 生成列信息 + var columns []gen.GenTableColumn + txErr = tpl_utils.GenUtil.GetDbTableColumnsQueryByName(genSrv.db, tables[i].TableName).Find(&columns).Error + if te := response.CheckErr(txErr, "ImportTable Find columns err"); te != nil { + return te + } + for j := 0; j < len(columns); j++ { + column := tpl_utils.GenUtil.InitColumn(genTable.ID, columns[j]) + txErr = tx.Create(&column).Error + if te := response.CheckErr(txErr, "ImportTable Create column err"); te != nil { + return te + } + } + } + return nil + }) + e = response.CheckErr(err, "ImportTable Transaction err") + return nil +} + +// SyncTable 同步表结构 +func (genSrv generateService) SyncTable(id uint) (e error) { + //旧数据 + var genTable gen.GenTable + err := genSrv.db.Where("id = ?", id).Limit(1).First(&genTable).Error + if e = response.CheckErrDBNotRecord(err, "生成数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "SyncTable First err"); e != nil { + return + } + var genTableCols []gen.GenTableColumn + err = genSrv.db.Where("table_id = ?", id).Order("sort").Find(&genTableCols).Error + if e = response.CheckErr(err, "SyncTable Find err"); e != nil { + return + } + if len(genTableCols) <= 0 { + e = response.AssertArgumentError.Make("旧数据异常!") + return + } + prevColMap := make(map[string]gen.GenTableColumn) + for i := 0; i < len(genTableCols); i++ { + prevColMap[genTableCols[i].ColumnName] = genTableCols[i] + } + //新数据 + var columns []gen.GenTableColumn + err = tpl_utils.GenUtil.GetDbTableColumnsQueryByName(genSrv.db, genTable.TableName).Find(&columns).Error + if e = response.CheckErr(err, "SyncTable Find new err"); e != nil { + return + } + if len(columns) <= 0 { + e = response.AssertArgumentError.Make("同步结构失败,原表结构不存在!") + return + } + //事务处理 + err = genSrv.db.Transaction(func(tx *gorm.DB) error { + //处理新增和更新 + for i := 0; i < len(columns); i++ { + col := tpl_utils.GenUtil.InitColumn(id, columns[i]) + if prevCol, ok := prevColMap[columns[i].ColumnName]; ok { + //更新 + col.ID = prevCol.ID + if col.IsList == 0 { + col.DictType = prevCol.DictType + col.QueryType = prevCol.QueryType + } + if prevCol.IsRequired == 1 && prevCol.IsPk == 0 && prevCol.IsInsert == 1 || prevCol.IsEdit == 1 { + col.HtmlType = prevCol.HtmlType + col.IsRequired = prevCol.IsRequired + } + txErr := tx.Save(&col).Error + if te := response.CheckErr(txErr, "SyncTable Save err"); te != nil { + return te + } + } else { + //新增 + txErr := tx.Create(&col).Error + if te := response.CheckErr(txErr, "SyncTable Create err"); te != nil { + return te + } + } + } + //处理删除 + colNames := make([]string, len(columns)) + for i := 0; i < len(columns); i++ { + colNames[i] = columns[i].ColumnName + } + delColIds := make([]uint, 0) + for _, prevCol := range prevColMap { + if !util.ToolsUtil.Contains(colNames, prevCol.ColumnName) { + delColIds = append(delColIds, prevCol.ID) + } + } + txErr := tx.Delete(&gen.GenTableColumn{}, "id in ?", delColIds).Error + if te := response.CheckErr(txErr, "SyncTable Delete err"); te != nil { + return te + } + return nil + }) + e = response.CheckErr(err, "SyncTable Transaction err") + return nil +} + +// EditTable 编辑表结构 +func (genSrv generateService) EditTable(editReq EditTableReq) (e error) { + if editReq.GenTpl == tpl_utils.GenConstants.TplTree { + if editReq.TreePrimary == "" { + e = response.AssertArgumentError.Make("树主ID不能为空!") + return + } + if editReq.TreeParent == "" { + e = response.AssertArgumentError.Make("树父ID不能为空!") + return + } + } + var genTable gen.GenTable + err := genSrv.db.Where("id = ?", editReq.ID).Limit(1).First(&genTable).Error + if e = response.CheckErrDBNotRecord(err, "数据已丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "EditTable First err"); e != nil { + return + } + response.Copy(&genTable, editReq) + err = genSrv.db.Transaction(func(tx *gorm.DB) error { + genTable.SubTableName = strings.Replace(editReq.SubTableName, config.Config.DbTablePrefix, "", 1) + txErr := tx.Save(&genTable).Error + if te := response.CheckErr(txErr, "EditTable Save GenTable err"); te != nil { + return te + } + for i := 0; i < len(editReq.Columns); i++ { + var col gen.GenTableColumn + response.Copy(&col, editReq.Columns[i]) + txErr = tx.Save(&col).Error + if te := response.CheckErr(txErr, "EditTable Save GenTableColumn err"); te != nil { + return te + } + } + return nil + }) + e = response.CheckErr(err, "EditTable Transaction err") + return +} + +// DelTable 删除表结构 +func (genSrv generateService) DelTable(ids []uint) (e error) { + err := genSrv.db.Transaction(func(tx *gorm.DB) error { + txErr := tx.Delete(&gen.GenTable{}, "id in ?", ids).Error + if te := response.CheckErr(txErr, "DelTable Delete GenTable err"); te != nil { + return te + } + txErr = tx.Delete(&gen.GenTableColumn{}, "table_id in ?", ids).Error + if te := response.CheckErr(txErr, "DelTable Delete GenTableColumn err"); te != nil { + return te + } + return nil + }) + e = response.CheckErr(err, "DelTable Transaction err") + return +} + +// getSubTableInfo 根据主表获取子表主键和列信息 +func (genSrv generateService) getSubTableInfo(genTable gen.GenTable) (pkCol gen.GenTableColumn, cols []gen.GenTableColumn, e error) { + if genTable.SubTableName == "" || genTable.SubTableFk == "" { + return + } + var table gen.GenTable + err := genSrv.db.Where("table_name = ?", genTable.SubTableName).Limit(1).First(&table).Error + if e = response.CheckErrDBNotRecord(err, "子表记录丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "getSubTableInfo First err"); e != nil { + return + } + err = tpl_utils.GenUtil.GetDbTableColumnsQueryByName(genSrv.db, genTable.SubTableName).Find(&cols).Error + if e = response.CheckErr(err, "getSubTableInfo Find err"); e != nil { + return + } + pkCol = tpl_utils.GenUtil.InitColumn(table.ID, tpl_utils.GenUtil.GetTablePriCol(cols)) + return +} + +// renderCodeByTable 根据主表和模板文件渲染模板代码 +func (genSrv generateService) renderCodeByTable(genTable gen.GenTable) (res map[string]string, e error) { + var columns []gen.GenTableColumn + err := genSrv.db.Where("table_id = ?", genTable.ID).Order("sort").Find(&columns).Error + if e = response.CheckErr(err, "renderCodeByTable Find err"); e != nil { + return + } + //获取子表信息 + pkCol, cols, err := genSrv.getSubTableInfo(genTable) + if e = response.CheckErr(err, "renderCodeByTable getSubTableInfo err"); e != nil { + return + } + + //获取模板变量信息 + vars := tpl_utils.TemplateUtil.PrepareVars(genTable, columns, pkCol, cols) + //生成模板内容 + res = make(map[string]string) + tplPaths := tpl_utils.TemplateUtil.GetTemplatePaths(genTable.GenTpl) + for _, tplPath := range tplPaths { + res[tplPath], err = tpl_utils.TemplateUtil.Render(tplPath, vars) + if e = response.CheckErr(err, "renderCodeByTable Render err"); e != nil { + return + } + } + return +} + +// PreviewCode 预览代码 +func (genSrv generateService) PreviewCode(id uint) (res map[string]string, e error) { + var genTable gen.GenTable + err := genSrv.db.Where("id = ?", id).Limit(1).First(&genTable).Error + if e = response.CheckErrDBNotRecord(err, "记录丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "PreviewCode First err"); e != nil { + return + } + //获取模板内容 + tplCodeMap, err := genSrv.renderCodeByTable(genTable) + if e = response.CheckErr(err, "PreviewCode renderCodeByTable err"); e != nil { + return + } + res = make(map[string]string) + for tplPath, tplCode := range tplCodeMap { + res[strings.ReplaceAll(tplPath, ".tpl", "")] = tplCode + } + return +} + +// GenCode 生成代码 (自定义路径) +func (genSrv generateService) GenCode(tableName string) (e error) { + var genTable gen.GenTable + err := genSrv.db.Where("table_name = ?", tableName).Order("id desc").Limit(1).First(&genTable).Error + if e = response.CheckErrDBNotRecord(err, "记录丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "GenCode First err"); e != nil { + return + } + //获取模板内容 + tplCodeMap, err := genSrv.renderCodeByTable(genTable) + if e = response.CheckErr(err, "GenCode renderCodeByTable err"); e != nil { + return + } + //获取生成根路径 + basePath := tpl_utils.TemplateUtil.GetGenPath(genTable) + //生成代码文件 + err = tpl_utils.TemplateUtil.GenCodeFiles(tplCodeMap, genTable.TableName, basePath) + if e = response.CheckErr(err, "GenCode GenCodeFiles err"); e != nil { + return + } + return +} + +// genZipCode 生成代码 (压缩包下载) +func (genSrv generateService) genZipCode(zipWriter *zip.Writer, tableName string) (e error) { + var genTable gen.GenTable + err := genSrv.db.Where("table_name = ?", tableName).Order("id desc").Limit(1).First(&genTable).Error + if e = response.CheckErrDBNotRecord(err, "记录丢失!"); e != nil { + return + } + if e = response.CheckErr(err, "genZipCode First err"); e != nil { + return + } + //获取模板内容 + tplCodeMap, err := genSrv.renderCodeByTable(genTable) + if e = response.CheckErr(err, "genZipCode renderCodeByTable err"); e != nil { + return + } + //压缩文件 + err = tpl_utils.TemplateUtil.GenZip(zipWriter, tplCodeMap, genTable.ModuleName) + if e = response.CheckErr(err, "genZipCode GenZip err"); e != nil { + return + } + return +} + +// DownloadCode 下载代码 +func (genSrv generateService) DownloadCode(tableNames []string) ([]byte, error) { + buf := new(bytes.Buffer) + zipWriter := zip.NewWriter(buf) + for _, tableName := range tableNames { + err := genSrv.genZipCode(zipWriter, tableName) + if err != nil { + return nil, response.CheckErr(err, "DownloadCode genZipCode for %s err", tableName) + } + } + err := zipWriter.Close() + if err != nil { + return nil, response.CheckErr(err, "DownloadCode zipWriter.Close err") + } + return buf.Bytes(), nil +} diff --git a/server/generator/templates/gocode/controller.go copy.tpl b/server/generator/templates/gocode/controller.go copy.tpl new file mode 100644 index 0000000..45c660b --- /dev/null +++ b/server/generator/templates/gocode/controller.go copy.tpl @@ -0,0 +1,82 @@ +package {{{ .TableName }}} + +import ( + "github.com/gin-gonic/gin" + "x_admin/admin/schemas/req" + "x_admin/admin/service/system" + "x_admin/core" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/util" +) + + +func {{{ title (toCamelCase .ModuleName) }}}Route(rg *gin.RouterGroup) { + db := core.GetDB() + + server := New{{{ title (toCamelCase .EntityName) }}}Service(db) + + handle := productHandler{service: server} + + rg = rg.Group("/", middleware.TokenAuth()) + rg.GET("/{{{ .ModuleName }}}/list", handle.List) + rg.GET("/{{{ .ModuleName }}}/detail", handle.Detail) + rg.POST("/{{{ .ModuleName }}}/add", handle.Add) + rg.POST("/{{{ .ModuleName }}}/edit", handle.Edit) + rg.POST("/{{{ .ModuleName }}}/del", handle.Del) +} +type {{{ toCamelCase .ModuleName }}}Handler struct { + service I{{{ title (toCamelCase .EntityName) }}}Service +} + +//list {{{ .ModuleName }}}列表 +func (hd {{{ toCamelCase .ModuleName }}}Handler) List(c *gin.Context) { + var page request.PageReq + var listReq {{{ title (toCamelCase .EntityName) }}}ListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := hd.service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +//detail {{{ .ModuleName }}}详情 +func (hd {{{ toCamelCase .ModuleName }}}Handler) Detail(c *gin.Context) { + var detailReq {{{ title (toCamelCase .EntityName) }}}DetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := hd.service.Detail(detailReq.{{{ title (toCamelCase .PrimaryKey) }}}) + response.CheckAndRespWithData(c, res, err) +} + +//add {{{ .ModuleName }}}新增 +func (hd {{{ toCamelCase .ModuleName }}}Handler) Add(c *gin.Context) { + var addReq {{{ title (toCamelCase .EntityName) }}}AddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) { + return + } + response.CheckAndResp(c, hd.service.Add(addReq)) +} + +//edit {{{ .ModuleName }}}编辑 +func (hd {{{ toCamelCase .ModuleName }}}Handler) Edit(c *gin.Context) { + var editReq {{{ title (toCamelCase .EntityName) }}}EditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, hd.service.Edit(editReq)) +} + +//del {{{ .ModuleName }}}删除 +func (hd {{{ toCamelCase .ModuleName }}}Handler) Del(c *gin.Context) { + var delReq {{{ title (toCamelCase .EntityName) }}}DelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) { + return + } + response.CheckAndResp(c, hd.service.Del(delReq.{{{ title (toCamelCase .PrimaryKey) }}})) +} diff --git a/server/generator/templates/gocode/controller.go.tpl b/server/generator/templates/gocode/controller.go.tpl new file mode 100644 index 0000000..706b3e3 --- /dev/null +++ b/server/generator/templates/gocode/controller.go.tpl @@ -0,0 +1,64 @@ +package {{{ .ModuleName }}} + +import ( + "github.com/gin-gonic/gin" + "x_admin/core/request" + "x_admin/core/response" + "x_admin/util" +) + + +type {{{ title (toCamelCase .ModuleName) }}}Handler struct { + Service I{{{ title (toCamelCase .EntityName) }}}Service +} + +//list {{{ .ModuleName }}}列表 +func (hd {{{ title (toCamelCase .ModuleName) }}}Handler) List(c *gin.Context) { + var page request.PageReq + var listReq {{{ title (toCamelCase .EntityName) }}}ListReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) { + return + } + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) { + return + } + res, err := hd.Service.List(page, listReq) + response.CheckAndRespWithData(c, res, err) +} + +//detail {{{ .ModuleName }}}详情 +func (hd {{{ title (toCamelCase .ModuleName) }}}Handler) Detail(c *gin.Context) { + var detailReq {{{ title (toCamelCase .EntityName) }}}DetailReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) { + return + } + res, err := hd.Service.Detail(detailReq.{{{ title (toCamelCase .PrimaryKey) }}}) + response.CheckAndRespWithData(c, res, err) +} + +//add {{{ .ModuleName }}}新增 +func (hd {{{ title (toCamelCase .ModuleName) }}}Handler) Add(c *gin.Context) { + var addReq {{{ title (toCamelCase .EntityName) }}}AddReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) { + return + } + response.CheckAndResp(c, hd.Service.Add(addReq)) +} + +//edit {{{ .ModuleName }}}编辑 +func (hd {{{ title (toCamelCase .ModuleName) }}}Handler) Edit(c *gin.Context) { + var editReq {{{ title (toCamelCase .EntityName) }}}EditReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) { + return + } + response.CheckAndResp(c, hd.Service.Edit(editReq)) +} + +//del {{{ .ModuleName }}}删除 +func (hd {{{ title (toCamelCase .ModuleName) }}}Handler) Del(c *gin.Context) { + var delReq {{{ title (toCamelCase .EntityName) }}}DelReq + if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) { + return + } + response.CheckAndResp(c, hd.Service.Del(delReq.{{{ title (toCamelCase .PrimaryKey) }}})) +} diff --git a/server/generator/templates/gocode/model.go.tpl b/server/generator/templates/gocode/model.go.tpl new file mode 100644 index 0000000..f3b8434 --- /dev/null +++ b/server/generator/templates/gocode/model.go.tpl @@ -0,0 +1,10 @@ +package model + +//{{{ title (toCamelCase .EntityName) }}} {{{ .FunctionName }}}实体 +type {{{ title (toCamelCase .EntityName) }}} struct { + {{{- range .Columns }}} + {{{- if not (contains $.SubTableFields .ColumnName) }}} + {{{ title (toCamelCase .GoField) }}} {{{ if eq .GoType "core.TsTime" }}} int64 {{{ else }}} {{{ .GoType }}} {{{ end }}} `gorm:"{{{ if .IsPk }}}primarykey;{{{ end }}}comment:'{{{ .ColumnComment }}}'"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} diff --git a/server/generator/templates/gocode/route.go.tpl b/server/generator/templates/gocode/route.go.tpl new file mode 100644 index 0000000..0dceb0a --- /dev/null +++ b/server/generator/templates/gocode/route.go.tpl @@ -0,0 +1,25 @@ +package admin + +import ( + "github.com/gin-gonic/gin" + "x_admin/core" + "x_admin/middleware" + "x_admin/admin/{{{ .ModuleName }}}" +) + +// 请在 admin/entry.go 目录引入这个函数 +// {{{ title (toCamelCase .ModuleName) }}}Route(rg) +func {{{ title (toCamelCase .ModuleName) }}}Route(rg *gin.RouterGroup) { + db := core.GetDB() + + server := {{{ .ModuleName }}}.New{{{ title (toCamelCase .EntityName) }}}Service(db) + + handle := {{{ .ModuleName}}}.{{{ title (toCamelCase .EntityName) }}}Handler{Service: server} + + rg = rg.Group("/", middleware.TokenAuth()) + rg.GET("/{{{ .ModuleName }}}/list", handle.List) + rg.GET("/{{{ .ModuleName }}}/detail", handle.Detail) + rg.POST("/{{{ .ModuleName }}}/add", handle.Add) + rg.POST("/{{{ .ModuleName }}}/edit", handle.Edit) + rg.POST("/{{{ .ModuleName }}}/del", handle.Del) +} \ No newline at end of file diff --git a/server/generator/templates/gocode/schema.go.tpl b/server/generator/templates/gocode/schema.go.tpl new file mode 100644 index 0000000..6e22027 --- /dev/null +++ b/server/generator/templates/gocode/schema.go.tpl @@ -0,0 +1,57 @@ +package {{{ .ModuleName }}} + +import "x_admin/core" + +//{{{ title (toCamelCase .EntityName) }}}ListReq {{{ .FunctionName }}}列表参数 +type {{{ title (toCamelCase .EntityName) }}}ListReq struct { + {{{- range .Columns }}} + {{{- if .IsQuery }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `form:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} + +//{{{ title (toCamelCase .EntityName) }}}DetailReq {{{ .FunctionName }}}详情参数 +type {{{ title (toCamelCase .EntityName) }}}DetailReq struct { + {{{- range .Columns }}} + {{{- if .IsPk }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `form:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} + +//{{{ title (toCamelCase .EntityName) }}}AddReq {{{ .FunctionName }}}新增参数 +type {{{ title (toCamelCase .EntityName) }}}AddReq struct { + {{{- range .Columns }}} + {{{- if .IsInsert }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `form:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} + +//{{{ title (toCamelCase .EntityName) }}}EditReq {{{ .FunctionName }}}新增参数 +type {{{ title (toCamelCase .EntityName) }}}EditReq struct { + {{{- range .Columns }}} + {{{- if .IsEdit }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `form:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} + +//{{{ title (toCamelCase .EntityName) }}}DelReq {{{ .FunctionName }}}新增参数 +type {{{ title (toCamelCase .EntityName) }}}DelReq struct { + {{{- range .Columns }}} + {{{- if .IsPk }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `form:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} + +//{{{ title (toCamelCase .EntityName) }}}Resp {{{ .FunctionName }}}返回信息 +type {{{ title (toCamelCase .EntityName) }}}Resp struct { + {{{- range .Columns }}} + {{{- if or .IsList .IsPk }}} + {{{ title (toCamelCase .GoField) }}} {{{ .GoType }}} `json:"{{{ toCamelCase .GoField }}}" structs:"{{{ toCamelCase .GoField }}}"` // {{{ .ColumnComment }}} + {{{- end }}} + {{{- end }}} +} diff --git a/server/generator/templates/gocode/service.go.tpl b/server/generator/templates/gocode/service.go.tpl new file mode 100644 index 0000000..1141574 --- /dev/null +++ b/server/generator/templates/gocode/service.go.tpl @@ -0,0 +1,141 @@ +package {{{ .ModuleName }}} + +import ( + "x_admin/core/request" + "x_admin/core/response" + "x_admin/model" + "gorm.io/gorm" +) + +type I{{{ title (toCamelCase .EntityName) }}}Service interface { + List(page request.PageReq, listReq {{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error) + Detail(id int) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error) + Add(addReq {{{ title (toCamelCase .EntityName) }}}AddReq) (e error) + Edit(editReq {{{ title (toCamelCase .EntityName) }}}EditReq) (e error) + Del(id int) (e error) +} + +//New{{{ title (toCamelCase .EntityName) }}}Service 初始化 +func New{{{ title (toCamelCase .EntityName) }}}Service(db *gorm.DB) I{{{ title (toCamelCase .EntityName) }}}Service { + return &{{{ toCamelCase .EntityName }}}Service{db: db} +} + +//{{{ toCamelCase .EntityName }}}Service {{{ .FunctionName }}}服务实现类 +type {{{ toCamelCase .EntityName }}}Service struct { + db *gorm.DB +} + +//List {{{ .FunctionName }}}列表 +func (Service {{{ toCamelCase .EntityName }}}Service) List(page request.PageReq, listReq {{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error) { + // 分页信息 + limit := page.PageSize + offset := page.PageSize * (page.PageNo - 1) + // 查询 + dbModel := Service.db.Model(&model.{{{ title (toCamelCase .EntityName) }}}{}) + {{{- range .Columns }}} + {{{- if .IsQuery }}} + {{{- $queryOpr := index $.ModelOprMap .QueryType }}} + {{{- if and (eq .GoType "string") (eq $queryOpr "like") }}} + if listReq.{{{ title (toCamelCase .ColumnName) }}} != "" { + dbModel = dbModel.Where("{{{ .ColumnName }}} like ?", "%"+listReq.{{{ title (toCamelCase .ColumnName) }}}+"%") + } + {{{- else }}} + if listReq.{{{ title (toCamelCase .ColumnName) }}} {{{ if eq .GoType "string" }}}!= ""{{{ else }}}> 0{{{ end }}} { + dbModel = dbModel.Where("{{{ .ColumnName }}} = ?", listReq.{{{ title (toCamelCase .ColumnName) }}}) + } + {{{- end }}} + {{{- end }}} + {{{- end }}} + {{{- if contains .AllFields "is_delete" }}} + dbModel = dbModel.Where("is_delete = ?", 0) + {{{- end }}} + // 总数 + var count int64 + err := dbModel.Count(&count).Error + if e = response.CheckErr(err, "List Count err"); e != nil { + return + } + // 数据 + var objs []model.{{{ title (toCamelCase .EntityName) }}} + err = dbModel.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error + if e = response.CheckErr(err, "List Find err"); e != nil { + return + } + resps := []{{{ title (toCamelCase .EntityName) }}}Resp{} + response.Copy(&resps, objs) + return response.PageResp{ + PageNo: page.PageNo, + PageSize: page.PageSize, + Count: count, + Lists: resps, + }, nil +} + +//Detail {{{ .FunctionName }}}详情 +func (Service {{{ toCamelCase .EntityName }}}Service) Detail(id int) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error) { + var obj model.{{{ title (toCamelCase .EntityName) }}} + err := Service.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", id{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Detail First err"); e != nil { + return + } + response.Copy(&res, obj) + {{{- range .Columns }}} + {{{- if and .IsEdit (contains (slice "image" "avatar" "logo" "img") .GoField) }}} + res.Avatar = util.UrlUtil.ToAbsoluteUrl(res.Avatar) + {{{- end }}} + {{{- end }}} + return +} + +//Add {{{ .FunctionName }}}新增 +func (Service {{{ toCamelCase .EntityName }}}Service) Add(addReq {{{ title (toCamelCase .EntityName) }}}AddReq) (e error) { + var obj model.{{{ title (toCamelCase .EntityName) }}} + response.Copy(&obj, addReq) + err := Service.db.Create(&obj).Error + e = response.CheckErr(err, "Add Create err") + return +} + +//Edit {{{ .FunctionName }}}编辑 +func (Service {{{ toCamelCase .EntityName }}}Service) Edit(editReq {{{ title (toCamelCase .EntityName) }}}EditReq) (e error) { + var obj model.{{{ title (toCamelCase .EntityName) }}} + err := Service.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", editReq.Id{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Edit First err"); e != nil { + return + } + // 更新 + response.Copy(&obj, editReq) + err = Service.db.Model(&obj).Updates(obj).Error + e = response.CheckErr(err, "Edit Updates err") + return +} + +//Del {{{ .FunctionName }}}删除 +func (Service {{{ toCamelCase .EntityName }}}Service) Del(id int) (e error) { + var obj model.{{{ title (toCamelCase .EntityName) }}} + err := Service.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", id{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error + // 校验 + if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil { + return + } + if e = response.CheckErr(err, "Del First err"); e != nil { + return + } + // 删除 + {{{- if contains .AllFields "is_delete" }}} + obj.IsDelete = 1 + err = Service.db.Save(&obj).Error + e = response.CheckErr(err, "Del Save err") + {{{- else }}} + err = Service.db.Delete(&obj).Error + e = response.CheckErr(err, "Del Delete err") + {{{- end }}} + return +} diff --git a/server/generator/templates/vue/api.ts.tpl b/server/generator/templates/vue/api.ts.tpl new file mode 100644 index 0000000..9617572 --- /dev/null +++ b/server/generator/templates/vue/api.ts.tpl @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// {{{.FunctionName}}}列表 +export function {{{.ModuleName}}}_lists(params?: Record) { + return request.get({ url: '/{{{.ModuleName}}}/list', params }) +} + +// {{{.FunctionName}}}详情 +export function {{{.ModuleName}}}_detail(params: Record) { + return request.get({ url: '/{{{.ModuleName}}}/detail', params }) +} + +// {{{.FunctionName}}}新增 +export function {{{.ModuleName}}}_add(params: Record) { + return request.post({ url: '/{{{.ModuleName}}}/add', params }) +} + +// {{{.FunctionName}}}编辑 +export function {{{.ModuleName}}}_edit(params: Record) { + return request.post({ url: '/{{{.ModuleName}}}/edit', params }) +} + +// {{{.FunctionName}}}删除 +export function {{{.ModuleName}}}_delete(params: Record) { + return request.post({ url: '/{{{.ModuleName}}}/del', params }) +} diff --git a/server/generator/templates/vue/edit.vue.tpl b/server/generator/templates/vue/edit.vue.tpl new file mode 100644 index 0000000..a79cad0 --- /dev/null +++ b/server/generator/templates/vue/edit.vue.tpl @@ -0,0 +1,252 @@ + + diff --git a/server/generator/templates/vue/index-tree.vue.tpl b/server/generator/templates/vue/index-tree.vue.tpl new file mode 100644 index 0000000..a401d5d --- /dev/null +++ b/server/generator/templates/vue/index-tree.vue.tpl @@ -0,0 +1,222 @@ + + diff --git a/server/generator/templates/vue/index.vue.tpl b/server/generator/templates/vue/index.vue.tpl new file mode 100644 index 0000000..65261fa --- /dev/null +++ b/server/generator/templates/vue/index.vue.tpl @@ -0,0 +1,183 @@ + + diff --git a/server/generator/tpl_utils/constants.go b/server/generator/tpl_utils/constants.go new file mode 100644 index 0000000..fe11c64 --- /dev/null +++ b/server/generator/tpl_utils/constants.go @@ -0,0 +1,93 @@ +package tpl_utils + +//GenConstants 代码生成常量 +var GenConstants = genConstants{ + UTF8: "utf-8", //编码 + TplCrud: "crud", //单表 (增删改查) + TplTree: "tree", //树表 (增删改查) + QueryLike: "LIKE", //模糊查询 + QueryEq: "=", //相等查询 + Require: 1, //需要的 +} + +//GoConstants Go相关常量 +var GoConstants = goConstants{ + TypeString: "string", //字符串类型 + TypeFloat: "float64", //浮点型 + TypeInt: "int", //整型 + TypeDate: "core.TsTime", //时间类型 +} + +//SqlConstants 数据库相关常量 +var SqlConstants = sqlConstants{ + //数据库字符串类型 + ColumnTypeStr: []string{"char", "varchar", "nvarchar", "varchar2"}, + //数据库文本类型 + ColumnTypeText: []string{"tinytext", "text", "mediumtext", "longtext"}, + //数据库时间类型 + ColumnTypeTime: []string{"datetime", "time", "date", "timestamp"}, + //数据库数字类型 + ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "integer", "bit", "bigint", + "float", "double", "decimal"}, + //时间日期字段名 + ColumnTimeName: []string{"create_time", "update_time", "delete_time", "start_time", "end_time"}, + //页面不需要插入字段 + ColumnNameNotAdd: []string{"id", "is_delete", "create_time", "update_time", "delete_time"}, + //页面不需要编辑字段 + ColumnNameNotEdit: []string{"is_delete", "create_time", "update_time", "delete_time"}, + //页面不需要列表字段 + ColumnNameNotList: []string{"id", "intro", "content", "is_delete", "delete_time"}, + //页面不需要查询字段 + ColumnNameNotQuery: []string{"is_delete", "create_time", "update_time", "delete_time"}, +} + +//HtmlConstants HTML相关常量 +var HtmlConstants = htmlConstants{ + HtmlInput: "input", //文本框 + HtmlTextarea: "textarea", //文本域 + HtmlSelect: "select", //下拉框 + HtmlRadio: "radio", //单选框 + HtmlDatetime: "datetime", //日期控件 + HtmlImageUpload: "imageUpload", //图片上传控件 + HtmlFileUpload: "fileUpload", //文件上传控件 + HtmlEditor: "editor", //富文本控件 +} + +type genConstants struct { + UTF8 string + TplCrud string + TplTree string + QueryLike string + QueryEq string + Require uint8 +} + +type goConstants struct { + TypeString string + TypeFloat string + TypeInt string + TypeDate string +} + +type sqlConstants struct { + ColumnTypeStr []string + ColumnTypeText []string + ColumnTypeTime []string + ColumnTypeNumber []string + ColumnTimeName []string + ColumnNameNotAdd []string + ColumnNameNotEdit []string + ColumnNameNotList []string + ColumnNameNotQuery []string +} + +type htmlConstants struct { + HtmlInput string + HtmlTextarea string + HtmlSelect string + HtmlRadio string + HtmlDatetime string + HtmlImageUpload string + HtmlFileUpload string + HtmlEditor string +} diff --git a/server/generator/tpl_utils/tpl.go b/server/generator/tpl_utils/tpl.go new file mode 100644 index 0000000..362ed5b --- /dev/null +++ b/server/generator/tpl_utils/tpl.go @@ -0,0 +1,279 @@ +package tpl_utils + +import ( + "archive/zip" + "bytes" + "io" + "os" + "path" + "strings" + "text/template" + "x_admin/config" + "x_admin/core/response" + "x_admin/model/gen" + "x_admin/util" +) + +var TemplateUtil = templateUtil{ + basePath: "generator/templates", + tpl: template.New("").Delims("{{{", "}}}").Funcs( + template.FuncMap{ + "sub": sub, + "slice": slice, + "title": strings.Title, + "toSnakeCase": util.StringUtil.ToSnakeCase, + "toCamelCase": util.StringUtil.ToCamelCase, + "contains": util.ToolsUtil.Contains, + }), +} + +// sub 模板-减函数 +func sub(a, b int) int { + return a - b +} + +// slice 模板-创建切片 +func slice(items ...interface{}) []interface{} { + return items +} + +// zFile 待加入zip的文件 +type zFile struct { + Name string + Body string +} + +// TplVars 模板变量 +type TplVars struct { + GenTpl string + TableName string + AuthorName string + PackageName string + EntityName string + EntitySnakeName string + ModuleName string + FunctionName string + JavaCamelField string + DateFields []string + PrimaryKey string + PrimaryField string + AllFields []string + SubPriCol gen.GenTableColumn + SubPriField string + SubTableFields []string + ListFields []string + DetailFields []string + DictFields []string + IsSearch bool + ModelOprMap map[string]string + Table gen.GenTable + Columns []gen.GenTableColumn + SubColumns []gen.GenTableColumn + //ModelTypeMap map[string]string +} + +// genUtil 模板工具 +type templateUtil struct { + basePath string + tpl *template.Template +} + +// PrepareVars 获取模板变量信息 +func (tu templateUtil) PrepareVars(table gen.GenTable, columns []gen.GenTableColumn, + oriSubPriCol gen.GenTableColumn, oriSubCols []gen.GenTableColumn) TplVars { + subPriField := "id" + isSearch := false + primaryKey := "id" + primaryField := "id" + functionName := "【请填写功能名称】" + var allFields []string + var subTableFields []string + var listFields []string + var detailFields []string + var dictFields []string + var subColumns []gen.GenTableColumn + var oriSubColNames []string + for _, column := range oriSubCols { + oriSubColNames = append(oriSubColNames, column.ColumnName) + } + if oriSubPriCol.ID > 0 { + subPriField = oriSubPriCol.ColumnName + subColumns = append(subColumns, oriSubPriCol) + } + for _, column := range columns { + allFields = append(allFields, column.ColumnName) + if util.ToolsUtil.Contains(oriSubColNames, column.ColumnName) { + subTableFields = append(subTableFields, column.ColumnName) + subColumns = append(subColumns, column) + } + if column.IsList == 1 { + listFields = append(listFields, column.ColumnName) + } + if column.IsEdit == 1 { + detailFields = append(detailFields, column.ColumnName) + } + if column.IsQuery == 1 { + isSearch = true + } + if column.IsPk == 1 { + primaryKey = column.GoField + primaryField = column.ColumnName + } + if column.DictType != "" && !util.ToolsUtil.Contains(dictFields, column.DictType) { + dictFields = append(dictFields, column.DictType) + } + } + //QueryType转换查询比较运算符 + modelOprMap := map[string]string{ + "=": "==", + "LIKE": "like", + } + if table.FunctionName != "" { + functionName = table.FunctionName + } + return TplVars{ + GenTpl: table.GenTpl, + TableName: table.TableName, + AuthorName: table.AuthorName, + PackageName: table.ModuleName, //config.GenConfig.PackageName, + EntityName: table.EntityName, + EntitySnakeName: util.StringUtil.ToSnakeCase(table.EntityName), + ModuleName: table.ModuleName, + FunctionName: functionName, + DateFields: SqlConstants.ColumnTimeName, + PrimaryKey: primaryKey, + PrimaryField: primaryField, + AllFields: allFields, + SubPriCol: oriSubPriCol, + SubPriField: subPriField, + SubTableFields: subTableFields, + ListFields: listFields, + DetailFields: detailFields, + DictFields: dictFields, + IsSearch: isSearch, + ModelOprMap: modelOprMap, + Columns: columns, + SubColumns: subColumns, + } +} + +// GetTemplatePaths 获取模板路径 +func (tu templateUtil) GetTemplatePaths(genTpl string) []string { + tplPaths := []string{ + "gocode/model.go.tpl", + "gocode/schema.go.tpl", + "gocode/service.go.tpl", + "gocode/route.go.tpl", + "gocode/controller.go.tpl", + "vue/api.ts.tpl", + "vue/edit.vue.tpl", + } + if genTpl == GenConstants.TplCrud { + tplPaths = append(tplPaths, "vue/index.vue.tpl") + } else if genTpl == GenConstants.TplTree { + tplPaths = append(tplPaths, "vue/index-tree.vue.tpl") + } + return tplPaths +} + +// Render 渲染模板 +func (tu templateUtil) Render(tplPath string, tplVars TplVars) (res string, e error) { + tpl, err := tu.tpl.ParseFiles(path.Join(config.Config.RootPath, tu.basePath, tplPath)) + if e = response.CheckErr(err, "TemplateUtil.Render ParseFiles err"); e != nil { + return "", e + } + buf := &bytes.Buffer{} + err = tpl.ExecuteTemplate(buf, path.Base(tplPath), tplVars) + if e = response.CheckErr(err, "TemplateUtil.Render Execute err"); e != nil { + return "", e + } + return buf.String(), nil +} + +// GetGenPath 获取生成路径 +func (tu templateUtil) GetGenPath(table gen.GenTable) string { + if table.GenPath == "/" { + //return path.Join(config.Config.RootPath, config.GenConfig.GenRootPath) + return config.GenConfig.GenRootPath + } + return table.GenPath +} + +// GetFilePaths 获取生成文件相对路径 +func (tu templateUtil) GetFilePaths(tplCodeMap map[string]string, TableName string) map[string]string { + //模板文件对应的输出文件 + fmtMap := map[string]string{ + "gocode/model.go.tpl": strings.Join([]string{"server/model/", TableName, ".go"}, ""), + "gocode/route.go.tpl": strings.Join([]string{"server/admin/", TableName, "_route.go"}, ""), + "gocode/schema.go.tpl": strings.Join([]string{"server/admin/", TableName, "/", TableName, "_schema.go"}, ""), //"server/admin/%s/%s_schema.go" + "gocode/service.go.tpl": strings.Join([]string{"server/admin/", TableName, "/", TableName, "_service.go"}, ""), //"server/admin/%s/%s_service.go", + // "server/admin/%s_route.go", + "gocode/controller.go.tpl": strings.Join([]string{"server/admin/", TableName, "/", TableName, "_ctl.go"}, ""), //"server/admin/%s/%s_ctl.go", + + "vue/api.ts.tpl": strings.Join([]string{"admin/src/api/", TableName, ".ts"}, ""), // "admin/src/api/%s.ts", + "vue/edit.vue.tpl": strings.Join([]string{"admin/src/views/", TableName, "/edit.vue"}, ""), // "admin/src/views/%s/edit.vue", + "vue/index.vue.tpl": strings.Join([]string{"admin/src/views/", TableName, "/index.vue"}, ""), // "admin/src/views/%s/index.vue", + "vue/index-tree.vue.tpl": strings.Join([]string{"admin/src/views/", TableName, "/index-tree.vue"}, ""), // "admin/src/views/%s/index-tree.vue", + } + filePath := make(map[string]string) + for tplPath, tplCode := range tplCodeMap { + file := fmtMap[tplPath] + filePath[file] = tplCode + } + return filePath +} + +// GenCodeFiles 生成代码文件 +func (tu templateUtil) GenCodeFiles(tplCodeMap map[string]string, TableName string, basePath string) error { + filePaths := tu.GetFilePaths(tplCodeMap, TableName) + for file, tplCode := range filePaths { + filePath := path.Join(basePath, file) + dir := path.Dir(filePath) + if !util.ToolsUtil.IsFileExist(dir) { + err := os.MkdirAll(dir, 0755) + if err != nil { + return response.CheckErr(err, "TemplateUtil.GenCodeFiles MkdirAll err") + } + } + err := os.WriteFile(filePath, []byte(tplCode), 0644) + if err != nil { + return response.CheckErr(err, "TemplateUtil.GenCodeFiles WriteFile err") + } + } + return nil +} + +func addFileToZip(zipWriter *zip.Writer, file zFile) error { + header := &zip.FileHeader{ + Name: file.Name, + Method: zip.Deflate, + } + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return response.CheckErr(err, "TemplateUtil.addFileToZip CreateHeader err") + } + _, err = io.WriteString(writer, file.Body) + if err != nil { + return response.CheckErr(err, "TemplateUtil.addFileToZip WriteString err") + } + return nil +} + +// GenZip 生成代码压缩包 +func (tu templateUtil) GenZip(zipWriter *zip.Writer, tplCodeMap map[string]string, TableName string) error { + filePaths := tu.GetFilePaths(tplCodeMap, TableName) + files := make([]zFile, 0) + for file, tplCode := range filePaths { + files = append(files, zFile{ + Name: file, + Body: tplCode, + }) + } + for _, file := range files { + err := addFileToZip(zipWriter, file) + if err != nil { + return response.CheckErr(err, "TemplateUtil.GenZip zipFiles err") + } + } + return nil +} diff --git a/server/generator/tpl_utils/utils.go b/server/generator/tpl_utils/utils.go new file mode 100644 index 0000000..db15596 --- /dev/null +++ b/server/generator/tpl_utils/utils.go @@ -0,0 +1,214 @@ +package tpl_utils + +import ( + "strconv" + "strings" + "time" + "x_admin/config" + "x_admin/model/gen" + "x_admin/util" + + "gorm.io/gorm" +) + +var GenUtil = genUtil{} + +// genUtil 代码生成工具 +type genUtil struct{} + +// GetDbTablesQuery 查询库中的数据表 +func (gu genUtil) GetDbTablesQuery(db *gorm.DB, tableName string, tableComment string) *gorm.DB { + whereStr := "" + if tableName != "" { + whereStr += `and lower(table_name) like lower("%` + tableName + `%")` + } + if tableComment != "" { + whereStr += `and lower(table_comment) like lower("%` + tableComment + `%")` + } + query := db.Table("information_schema.tables").Where( + `table_schema = (SELECT database()) + AND table_name NOT LIKE "qrtz_%" + AND table_name NOT LIKE "gen_%" + AND table_name NOT IN (select table_name from x_gen_table) ` + whereStr).Select( + "table_name, table_comment, create_time, update_time") + return query +} + +// GetDbTablesQueryByNames 根据表名集查询表 +func (gu genUtil) GetDbTablesQueryByNames(db *gorm.DB, tableNames []string) *gorm.DB { + query := db.Table("information_schema.tables").Where( + `table_schema = (SELECT database()) + AND table_name NOT LIKE "qrtz_%" + AND table_name NOT LIKE "gen_%" + AND table_name IN ?`, tableNames).Select( + "table_name, table_comment, create_time, update_time") + return query +} + +// GetDbTableColumnsQueryByName 根据表名查询列信息 +func (gu genUtil) GetDbTableColumnsQueryByName(db *gorm.DB, tableName string) *gorm.DB { + query := db.Table("information_schema.columns").Where( + `table_schema = (SELECT database()) + AND table_name = ?`, tableName).Order("ordinal_position").Select( + `column_name, + (CASE WHEN (is_nullable = "no" && column_key != "PRI") THEN "1" ELSE NULL END) AS is_required, + (CASE WHEN column_key = "PRI" THEN "1" ELSE "0" END) AS is_pk, + ordinal_position AS sort, column_comment, + (CASE WHEN extra = "auto_increment" THEN "1" ELSE "0" END) AS is_increment, column_type`) + return query +} + +// InitTable 初始化表 +func (gu genUtil) InitTable(table gen.GenTable) gen.GenTable { + return gen.GenTable{ + TableName: table.TableName, + TableComment: table.TableComment, + AuthorName: "", + EntityName: gu.ToClassName(table.TableName), + ModuleName: gu.ToModuleName(table.TableName), + FunctionName: strings.Replace(table.TableComment, "表", "", -1), + CreateTime: time.Now().Unix(), + UpdateTime: time.Now().Unix(), + } +} + +// InitColumn 初始化字段列 +func (gu genUtil) InitColumn(tableId uint, column gen.GenTableColumn) gen.GenTableColumn { + columnType := gu.GetDbType(column.ColumnType) + columnLen := gu.GetColumnLength(column.ColumnType) + col := gen.GenTableColumn{ + TableID: tableId, + ColumnName: column.ColumnName, + ColumnComment: column.ColumnComment, + ColumnType: columnType, + ColumnLength: columnLen, + GoField: column.ColumnName, + GoType: GoConstants.TypeString, + QueryType: GenConstants.QueryEq, + Sort: column.Sort, + IsPk: column.IsPk, + IsIncrement: column.IsIncrement, + IsRequired: column.IsRequired, + CreateTime: time.Now().Unix(), + UpdateTime: time.Now().Unix(), + } + if util.ToolsUtil.Contains(append(SqlConstants.ColumnTypeStr, SqlConstants.ColumnTypeText...), columnType) { + //文本域组 + if columnLen >= 500 || util.ToolsUtil.Contains(SqlConstants.ColumnTypeText, columnType) { + col.HtmlType = HtmlConstants.HtmlTextarea + } else { + col.HtmlType = HtmlConstants.HtmlInput + } + } else if util.ToolsUtil.Contains(SqlConstants.ColumnTypeTime, columnType) { + //日期字段 + col.GoType = GoConstants.TypeDate + col.HtmlType = HtmlConstants.HtmlDatetime + } else if util.ToolsUtil.Contains(SqlConstants.ColumnTimeName, col.ColumnName) { + //时间字段 + col.GoType = GoConstants.TypeDate + col.HtmlType = HtmlConstants.HtmlDatetime + } else if util.ToolsUtil.Contains(SqlConstants.ColumnTypeNumber, columnType) { + //数字字段 + col.HtmlType = HtmlConstants.HtmlInput + if strings.Contains(columnType, ",") { + col.GoType = GoConstants.TypeFloat + } else { + col.GoType = GoConstants.TypeInt + } + } + //非必填字段 + if util.ToolsUtil.Contains(SqlConstants.ColumnNameNotEdit, col.ColumnName) { + col.IsRequired = 0 + } + //需插入字段 + if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotAdd, col.ColumnName) { + col.IsInsert = GenConstants.Require + } + //需编辑字段 + if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotEdit, col.ColumnName) { + col.IsEdit = GenConstants.Require + col.IsRequired = GenConstants.Require + } + //需列表字段 + if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotList, col.ColumnName) && col.IsPk == 0 { + col.IsList = GenConstants.Require + } + //需查询字段 + if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotQuery, col.ColumnName) && col.IsPk == 0 { + col.IsQuery = GenConstants.Require + } + lowerColName := strings.ToLower(col.ColumnName) + //模糊查字段 + if strings.HasSuffix(lowerColName, "name") || util.ToolsUtil.Contains([]string{"title", "mobile"}, lowerColName) { + col.QueryType = GenConstants.QueryLike + } + //根据字段设置 + if strings.HasSuffix(lowerColName, "status") || util.ToolsUtil.Contains([]string{"is_show", "is_disable"}, lowerColName) { + //状态字段设置单选框 + col.HtmlType = HtmlConstants.HtmlRadio + } else if strings.HasSuffix(lowerColName, "type") || strings.HasSuffix(lowerColName, "sex") { + //类型&性别字段设置下拉框 + col.HtmlType = HtmlConstants.HtmlSelect + } else if strings.HasSuffix(lowerColName, "image") { + //图片字段设置图片上传 + col.HtmlType = HtmlConstants.HtmlImageUpload + } else if strings.HasSuffix(lowerColName, "file") { + //文件字段设置文件上传 + col.HtmlType = HtmlConstants.HtmlFileUpload + } else if strings.HasSuffix(lowerColName, "content") { + //富文本字段设置富文本编辑器 + col.HtmlType = HtmlConstants.HtmlEditor + } + return col +} + +// ToModuleName 表名转业务名 +func (gu genUtil) ToModuleName(name string) string { + names := strings.Split(name, config.Config.DbTablePrefix) + return names[len(names)-1] +} + +// ToClassName 表名转类名 +func (gu genUtil) ToClassName(name string) string { + tablePrefix := config.Config.DbTablePrefix + name = strings.TrimPrefix(name, tablePrefix) + // if config.GenConfig.IsRemoveTablePrefix && tablePrefix != "" { + // if strings.HasPrefix(name, tablePrefix) { + // name = name[len(tablePrefix):] + // } + // } + return util.StringUtil.ToCamelCase(name) +} + +// GetDbType 获取数据库类型字段 +func (gu genUtil) GetDbType(columnType string) string { + index := strings.IndexRune(columnType, '(') + if index < 0 { + return columnType + } + return columnType[:index] +} + +// GetColumnLength 获取字段长度 +func (gu genUtil) GetColumnLength(columnType string) int { + index := strings.IndexRune(columnType, '(') + if index < 0 { + return 0 + } + length, err := strconv.Atoi(columnType[index+1 : strings.IndexRune(columnType, ')')]) + if err != nil { + return 0 + } + return length +} + +// GetTablePriCol 获取主键列名称 +func (gu genUtil) GetTablePriCol(columns []gen.GenTableColumn) (res gen.GenTableColumn) { + for _, col := range columns { + if col.IsPk == 1 { + res = col + return + } + } + return +} diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..d3cd30f --- /dev/null +++ b/server/go.mod @@ -0,0 +1,74 @@ +module x_admin + +go 1.21 + +require ( + github.com/fatih/structs v1.1.0 + github.com/gin-contrib/cors v1.4.0 + github.com/gin-gonic/gin v1.9.1 + github.com/go-redis/redis/v9 v9.0.0-rc.2 + github.com/google/uuid v1.4.0 + github.com/jinzhu/copier v0.4.0 + github.com/shirou/gopsutil v3.21.11+incompatible + github.com/spf13/viper v1.17.0 + github.com/ua-parser/uap-go v0.0.0-20230823213814-f77b3e91e9dc + go.uber.org/zap v1.26.0 + gorm.io/driver/mysql v1.5.2 + gorm.io/gorm v1.25.5 +) + +require ( + github.com/bytedance/sonic v1.10.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/frankban/quicktest v1.14.6 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.16.0 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.10.0 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/arch v0.6.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..efdd1d4 --- /dev/null +++ b/server/go.sum @@ -0,0 +1,647 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= +github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= +github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/cors v1.4.0 h1:oJ6gwtUl3lqV0WEIwM/LxPF1QZ5qe2lGWdY2+bz7y0g= +github.com/gin-contrib/cors v1.4.0/go.mod h1:bs9pNM0x/UsmHPBWT2xZz9ROh8xYjYkiURUfmBoMlcs= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-redis/redis/v9 v9.0.0-rc.2 h1:IN1eI8AvJJeWHjMW/hlFAv2sAfvTun2DVksDDJ3a6a0= +github.com/go-redis/redis/v9 v9.0.0-rc.2/go.mod h1:cgBknjwcBJa2prbnuHH/4k/Mlj4r0pWNV2HBanHujfY= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= +github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= +github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ua-parser/uap-go v0.0.0-20230823213814-f77b3e91e9dc h1:iT5lwxf894PiMq7cnMMQg/7VOD1pxmu//gQuHWAFy4s= +github.com/ua-parser/uap-go v0.0.0-20230823213814-f77b3e91e9dc/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc= +golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= +gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..8046ebf --- /dev/null +++ b/server/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "log" + "net/http" + "strconv" + "time" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/middleware" + "x_admin/routers" + + "github.com/gin-gonic/gin" +) + +// initRouter 初始化router +func initRouter() *gin.Engine { + // 初始化gin + gin.SetMode(config.Config.GinMode) + router := gin.New() + // 设置静态路径 + router.Static(config.Config.PublicPrefix, config.Config.UploadDirectory) + router.Static(config.Config.StaticPath, config.Config.StaticDirectory) + // 设置中间件 + router.Use(gin.Logger(), middleware.Cors(), middleware.ErrorRecover()) + // 演示模式 + if config.Config.DisallowModify { + router.Use(middleware.ShowMode()) + } + // 特殊异常处理 + router.NoMethod(response.NoMethod) + router.NoRoute(response.NoRoute) + // 注册路由 + group := router.Group("/api") + + routers.RegisterGroup(group) + + return router +} + +// initServer 初始化server +func initServer(router *gin.Engine) *http.Server { + return &http.Server{ + Addr: ":" + strconv.Itoa(config.Config.ServerPort), + Handler: router, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } +} + +func main() { + // 刷新日志缓冲 + defer core.Logger.Sync() + // 程序结束前关闭数据库连接 + if core.GetDB() != nil { + db, _ := core.GetDB().DB() + defer db.Close() + } + // 初始化DI + // initDI() + // 初始化router + router := initRouter() + // 初始化server + s := initServer(router) + // 运行服务 + log.Fatalln(s.ListenAndServe().Error()) +} diff --git a/server/middleware/auth.go b/server/middleware/auth.go new file mode 100644 index 0000000..14ab426 --- /dev/null +++ b/server/middleware/auth.go @@ -0,0 +1,149 @@ +package middleware + +import ( + "strconv" + "strings" + "x_admin/admin/system/admin" + "x_admin/admin/system/role" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + sysModel "x_admin/model/system" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +var ( + permSrv = role.NewSystemAuthPermService(core.GetDB()) + roleSrv = role.NewSystemAuthRoleService(core.GetDB(), permSrv) + adminSrv = admin.NewSystemAuthAdminService(core.GetDB(), permSrv, roleSrv) +) + +// TokenAuth Token认证中间件 +func TokenAuth() gin.HandlerFunc { + return func(c *gin.Context) { + // 路由转权限 + auths := strings.ReplaceAll(strings.Replace(c.Request.URL.Path, "/api/", "", 1), "/", ":") + + // 免登录接口 + if util.ToolsUtil.Contains(config.AdminConfig.NotLoginUri, auths) { + c.Next() + return + } + + // Token是否为空 + token := c.Request.Header.Get("token") + if token == "" { + response.Fail(c, response.TokenEmpty) + c.Abort() + return + } + + // Token是否过期 + token = config.AdminConfig.BackstageTokenKey + token + existCnt := util.RedisUtil.Exists(token) + if existCnt < 0 { + response.Fail(c, response.SystemError) + c.Abort() + return + } else if existCnt == 0 { + response.Fail(c, response.TokenInvalid) + c.Abort() + return + } + + // 用户信息缓存 + uidStr := util.RedisUtil.Get(token) + var uid uint + if uidStr != "" { + i, err := strconv.ParseUint(uidStr, 10, 32) + if err != nil { + core.Logger.Errorf("TokenAuth Atoi uidStr err: err=[%+v]", err) + response.Fail(c, response.TokenInvalid) + c.Abort() + return + } + uid = uint(i) + } + + if !util.RedisUtil.HExists(config.AdminConfig.BackstageManageKey, uidStr) { + err := adminSrv.CacheAdminUserByUid(uid) + if err != nil { + core.Logger.Errorf("TokenAuth CacheAdminUserByUid err: err=[%+v]", err) + response.Fail(c, response.SystemError) + c.Abort() + return + } + } + + // 校验用户被删除 + var mapping sysModel.SystemAuthAdmin + err := util.ToolsUtil.JsonToObj(util.RedisUtil.HGet(config.AdminConfig.BackstageManageKey, uidStr), &mapping) + if err != nil { + core.Logger.Errorf("TokenAuth Unmarshal err: err=[%+v]", err) + response.Fail(c, response.SystemError) + c.Abort() + return + } + if mapping.IsDelete == 1 { + util.RedisUtil.Del(token) + util.RedisUtil.HDel(config.AdminConfig.BackstageManageKey + uidStr) + response.Fail(c, response.TokenInvalid) + c.Abort() + return + } + + // 校验用户被禁用 + if mapping.IsDisable == 1 { + response.Fail(c, response.LoginDisableError) + c.Abort() + return + } + + // 令牌剩余30分钟自动续签 + if util.RedisUtil.TTL(token) < 1800 { + util.RedisUtil.Expire(token, 7200) + } + + // 单次请求信息保存 + c.Set(config.AdminConfig.ReqAdminIdKey, uid) + c.Set(config.AdminConfig.ReqRoleIdKey, mapping.Role) + c.Set(config.AdminConfig.ReqUsernameKey, mapping.Username) + c.Set(config.AdminConfig.ReqNicknameKey, mapping.Nickname) + + // 免权限验证接口 + if util.ToolsUtil.Contains(config.AdminConfig.NotAuthUri, auths) || uid == 1 { + c.Next() + return + } + + // 校验角色的权限,redis没有就重新查询 + roleId := mapping.Role + if !util.RedisUtil.HExists(config.AdminConfig.BackstageRolesKey, roleId) { + i, err := strconv.ParseUint(roleId, 10, 32) + if err != nil { + core.Logger.Errorf("TokenAuth Atoi roleId err: err=[%+v]", err) + response.Fail(c, response.SystemError) + c.Abort() + return + } + err = permSrv.CacheRoleMenusByRoleId(uint(i)) + if err != nil { + core.Logger.Errorf("TokenAuth CacheRoleMenusByRoleId err: err=[%+v]", err) + response.Fail(c, response.SystemError) + c.Abort() + return + } + } + + // 验证是否有权限操作 + menus := util.RedisUtil.HGet(config.AdminConfig.BackstageRolesKey, roleId) + if !(menus != "" && util.ToolsUtil.Contains(strings.Split(menus, ","), auths)) { + response.Fail(c, response.NoPermission) + c.Abort() + return + } + c.Next() + } +} diff --git a/server/middleware/cors.go b/server/middleware/cors.go new file mode 100644 index 0000000..aafbeee --- /dev/null +++ b/server/middleware/cors.go @@ -0,0 +1,17 @@ +package middleware + +import ( + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "time" +) + +//Cors CORS(跨域资源共享)中间件 +func Cors() gin.HandlerFunc { + return cors.New(cors.Config{ + AllowOrigins: []string{"*"}, + AllowHeaders: []string{"*"}, + AllowMethods: []string{"OPTIONS", "GET", "POST", "POST", "DELETE", "PUT"}, + MaxAge: 1 * time.Hour, + }) +} diff --git a/server/middleware/error.go b/server/middleware/error.go new file mode 100644 index 0000000..f797b34 --- /dev/null +++ b/server/middleware/error.go @@ -0,0 +1,37 @@ +package middleware + +import ( + "runtime/debug" + "x_admin/core" + "x_admin/core/response" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +// ErrorRecover 异常恢复中间件 +func ErrorRecover() gin.HandlerFunc { + return func(c *gin.Context) { + defer func() { + if r := recover(); r != nil { + switch v := r.(type) { + // 自定义类型 + case response.RespType: + core.Logger.WithOptions(zap.AddCallerSkip(2)).Warnf( + "Request Fail by recover: url=[%s], resp=[%+v]", c.Request.URL.Path, v) + var data interface{} + if v.Data() == nil { + data = []string{} + } + response.Result(c, v, data) + // 其他类型 + default: + core.Logger.Errorf("stacktrace from panic: %+v\n%s", r, string(debug.Stack())) + response.Fail(c, response.SystemError) + } + c.Abort() + } + }() + c.Next() + } +} diff --git a/server/middleware/log.go b/server/middleware/log.go new file mode 100644 index 0000000..1e25754 --- /dev/null +++ b/server/middleware/log.go @@ -0,0 +1,129 @@ +package middleware + +import ( + "fmt" + "net/url" + "strings" + "time" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/model/system" + "x_admin/util" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "go.uber.org/zap" +) + +// requestType 请求参数类 +type requestType string + +const ( + RequestFile requestType = "file" // 文件类型 + RequestDefault requestType = "default" // 默认数据类型 +) + +// RecordLog 记录系统日志信息中间件 +func RecordLog(title string, reqTypes ...requestType) gin.HandlerFunc { + reqType := RequestDefault + if len(reqTypes) > 0 { + reqType = reqTypes[0] + } + return func(c *gin.Context) { + // 开始时间 + startTime := time.Now().UnixMilli() + // 异常信息 + errStr := "" + var status uint8 = 1 // 1=成功, 2=失败 + args := "" + // 请求方式 + reqMethod := c.Request.Method + // 获取请求参数 + if reqMethod == "POST" { + // POST请求 + if reqType == RequestFile { + // 文件类型 + var filenames []string + form, err := c.MultipartForm() + // 校验错误 + if response.IsFailWithResp(c, response.CheckErr(err, "RecordLog MultipartForm err")) { + c.Abort() + return + } + // 获取文件列表 + for _, files := range form.File { + for _, file := range files { + filenames = append(filenames, file.Filename) + } + } + args = strings.Join(filenames, ",") + } else { + //默认类型 + var formParams map[string]interface{} + err := c.ShouldBindBodyWith(&formParams, binding.JSON) + if err == nil { + val, err := util.ToolsUtil.ObjToJson(&formParams) + // 校验错误 + if response.IsFailWithResp(c, response.CheckErr(err, "RecordLog POST Marshal err")) { + c.Abort() + return + } + args = val + } + } + } else if reqMethod == "GET" { + // GET请求 + query := c.Request.URL.RawQuery + if query != "" { + args, _ = url.QueryUnescape(query) + } + } + // 处理异常 + defer func() { + if r := recover(); r != nil { + errStr = fmt.Sprintf("%+v", r) + status = 2 + // 结束时间 + endTime := time.Now().UnixMilli() + // 执行时间(毫秒) + taskTime := endTime - startTime + // 获取当前的用户 + adminId := config.AdminConfig.GetAdminId(c) + urlPath := c.Request.URL.Path + ip := c.ClientIP() + method := c.HandlerName() + err := core.GetDB().Create(&system.SystemLogOperate{ + AdminId: adminId, Type: reqMethod, Title: title, Ip: ip, + Url: urlPath, Method: method, Args: args, Error: errStr, Status: status, + StartTime: startTime / 1000, EndTime: endTime / 1000, TaskTime: taskTime, + }).Error + response.CheckErr(err, "RecordLog recover Create err") + core.Logger.WithOptions(zap.AddCallerSkip(2)).Infof( + "RecordLog recover: err=[%+v]", r) + panic(r) + } + }() + // 执行方法 + c.Next() + if len(c.Errors) > 0 { + errStr = c.Errors.String() + status = 2 + } + // 结束时间 + endTime := time.Now().UnixMilli() + // 执行时间(毫秒) + taskTime := endTime - startTime + // 获取当前的用户 + adminId := config.AdminConfig.GetAdminId(c) + urlPath := c.Request.URL.Path + ip := c.ClientIP() + method := c.HandlerName() + err := core.GetDB().Create(&system.SystemLogOperate{ + AdminId: adminId, Type: reqMethod, Title: title, Ip: ip, + Url: urlPath, Method: method, Args: args, Error: errStr, Status: status, + StartTime: startTime / 1000, EndTime: endTime / 1000, TaskTime: taskTime, + }).Error + response.CheckErr(err, "RecordLog Create err") + } +} diff --git a/server/middleware/show.go b/server/middleware/show.go new file mode 100644 index 0000000..4036243 --- /dev/null +++ b/server/middleware/show.go @@ -0,0 +1,24 @@ +package middleware + +import ( + "strings" + "x_admin/config" + "x_admin/core/response" + "x_admin/util" + + "github.com/gin-gonic/gin" +) + +// ShowMode 演示模式中间件,演示模式禁止POST +func ShowMode() gin.HandlerFunc { + return func(c *gin.Context) { + // 路由转权限 + auths := strings.ReplaceAll(strings.Replace(c.Request.URL.Path, "/api/", "", 1), "/", ":") + // 禁止修改操作 (演示功能,限制POST请求) + if c.Request.Method == "POST" && !util.ToolsUtil.Contains(config.AdminConfig.ShowWhitelistUri, auths) { + response.FailWithMsg(c, response.NoPermission, "演示环境不支持修改数据,请下载源码本地部署体验!") + c.Abort() + return + } + } +} diff --git a/server/model/article_collect.go b/server/model/article_collect.go new file mode 100644 index 0000000..67043e5 --- /dev/null +++ b/server/model/article_collect.go @@ -0,0 +1,12 @@ +package model + +//ArticleCollect 文章收藏实体 +type ArticleCollect struct { + Id int `gorm:"primarykey;comment:'主键'"` // 主键 + UserId int `gorm:"comment:'用户ID'"` // 用户ID + ArticleId int `gorm:"comment:'文章ID'"` // 文章ID + IsDelete int `gorm:"comment:'是否删除'"` // 是否删除 + CreateTime int64 `gorm:"comment:'创建时间'"` // 创建时间 + UpdateTime int64 `gorm:"comment:'更新时间'"` // 更新时间 + DeleteTime int64 `gorm:"comment:'是否删除'"` // 是否删除 +} diff --git a/server/model/common/album.go b/server/model/common/album.go new file mode 100644 index 0000000..07ad2c8 --- /dev/null +++ b/server/model/common/album.go @@ -0,0 +1,30 @@ +package common + +//Album 相册实体 +type Album struct { + ID uint `gorm:"primarykey;comment:'主键ID'"` + Cid uint `gorm:"not null;default:0;comment:'类目ID'"` + Aid uint `gorm:"not null;default:0;comment:'管理ID'"` + Uid uint `gorm:"not null;default:0;comment:'用户ID'"` + Type int `gorm:"not null;default:10;comment:'文件类型: [10=图片, 20=视频]''"` + Name string `gorm:"not null;default:'';comment:'文件名称''"` + Uri string `gorm:"not null;comment:'文件路径'"` + Ext string `gorm:"not null;default:'';comment:'文件扩展'"` + Size int64 `gorm:"not null;default:0;comment:文件大小"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} + +//AlbumCate 相册分类实体 +type AlbumCate struct { + ID uint `gorm:"primarykey;comment:'主键ID'"` + Pid uint `gorm:"not null;default:0;comment:'父级ID'"` + Type int `gorm:"not null;default:10;comment:'文件类型: [10=图片, 20=视频]''"` + Name string `gorm:"not null;default:'';comment:'分类名称''"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} diff --git a/server/model/gen/gen.go b/server/model/gen/gen.go new file mode 100644 index 0000000..25df580 --- /dev/null +++ b/server/model/gen/gen.go @@ -0,0 +1,48 @@ +package gen + +//GenTable 代码生成业务实体 +type GenTable struct { + ID uint `gorm:"primarykey;comment:'主键'"` + TableName string `gorm:"not null;default:'';comment:'表名称''"` + TableComment string `gorm:"not null;default:'';comment:'表描述'"` + SubTableName string `gorm:"not null;default:'';comment:'关联表名称'"` + SubTableFk string `gorm:"not null;default:'';comment:'关联表外键'"` + AuthorName string `gorm:"not null;default:'';comment:'作者的名称'"` + EntityName string `gorm:"not null;default:'';comment:'实体的名称'"` + ModuleName string `gorm:"not null;default:'';comment:'生成模块名'"` + FunctionName string `gorm:"not null;default:'';comment:'生成功能名'"` + TreePrimary string `gorm:"not null;default:'';comment:'树主键字段'"` + TreeParent string `gorm:"not null;default:'';comment:'树父级字段'"` + TreeName string `gorm:"not null;default:'';comment:'树显示字段'"` + GenTpl string `gorm:"not null;default:'crud';comment:'生成模板方式: [crud=单表, tree=树表]'"` + GenType int `gorm:"not null;default:0;comment:'生成代码方式: [0=zip压缩包, 1=自定义路径]'"` + GenPath string `gorm:"not null;default:'/';comment:'生成代码路径: [不填默认项目路径]'"` + Remarks string `gorm:"not null;default:'';comment:'备注信息'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` +} + +//GenTableColumn 代码生成表列实体 +type GenTableColumn struct { + ID uint `gorm:"primarykey;comment:'列主键'"` + TableID uint `gorm:"not null;default:0;comment:'表外键'"` + ColumnName string `gorm:"not null;default:'';comment:'列名称'"` + ColumnComment string `gorm:"not null;default:'';comment:'列描述'"` + ColumnLength int `gorm:"not null;default:0;comment:'列长度'"` + ColumnType string `gorm:"not null;default:'';comment:'列类型'"` + GoType string `gorm:"not null;default:'';comment:'类型'"` + GoField string `gorm:"not null;default:'';comment:'字段名'"` + IsPk uint8 `gorm:"not null;default:0;comment:'是否主键: [1=是, 0=否]'"` + IsIncrement uint8 `gorm:"not null;default:0;comment:'是否自增: [1=是, 0=否]'"` + IsRequired uint8 `gorm:"not null;default:0;comment:'是否必填: [1=是, 0=否]'"` + IsInsert uint8 `gorm:"not null;default:0;comment:'是否为插入字段: [1=是, 0=否]'"` + IsEdit uint8 `gorm:"not null;default:0;comment:'是否编辑字段: [1=是, 0=否]'"` + IsList uint8 `gorm:"not null;default:0;comment:'是否列表字段: [1=是, 0=否]'"` + IsQuery uint8 `gorm:"not null;default:0;comment:'是否查询字段: [1=是, 0=否]'"` + QueryType string `gorm:"not null;default:'=';comment:'查询方式: [等于、不等于、大于、小于、范围]'"` + HtmlType string `gorm:"not null;default:'';comment:'显示类型: [文本框、文本域、下拉框、复选框、单选框、日期控件]'"` + DictType string `gorm:"not null;default:'';comment:'字典类型'"` + Sort int `gorm:"not null;default:0;comment:'排序编号'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` +} diff --git a/server/model/setting/dict_data.go b/server/model/setting/dict_data.go new file mode 100644 index 0000000..7cffe98 --- /dev/null +++ b/server/model/setting/dict_data.go @@ -0,0 +1,16 @@ +package setting + +//DictData 字典数据实体 +type DictData struct { + ID uint `gorm:"primarykey;comment:'主键'"` + TypeId uint `gorm:"not null;default:0;comment:'类型'"` + Name string `gorm:"not null;default:'';comment:'键名''"` + Value string `gorm:"not null;default:'';comment:'数值'"` + Remark string `gorm:"not null;default:'';comment:'备注'"` + Sort uint16 `gorm:"not null;default:0;comment:'排序'"` + Status uint8 `gorm:"not null;default:1;comment:'字典状态: 0=停用, 1=正常'"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} diff --git a/server/model/setting/dict_type.go b/server/model/setting/dict_type.go new file mode 100644 index 0000000..f066482 --- /dev/null +++ b/server/model/setting/dict_type.go @@ -0,0 +1,14 @@ +package setting + +//DictType 字典类型实体 +type DictType struct { + ID uint `gorm:"primarykey;comment:'主键'"` + DictName string `gorm:"not null;default:'';comment:'字典名称''"` + DictType string `gorm:"not null;default:'';comment:'字典类型'"` + DictRemark string `gorm:"not null;default:'';comment:'字典备注'"` + DictStatus uint8 `gorm:"not null;default:1;comment:'字典状态: 0=停用, 1=正常'"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} diff --git a/server/model/system/system.go b/server/model/system/system.go new file mode 100644 index 0000000..30c352f --- /dev/null +++ b/server/model/system/system.go @@ -0,0 +1,130 @@ +package system + +//SystemConfig 系统配置实体 +type SystemConfig struct { + ID uint `gorm:"primarykey;comment:'主键'"` + Type string `gorm:"default:'';comment:'类型''"` + Name string `gorm:"not null;default:'';comment:'键'"` + Value string `gorm:"type:text;not null;default:'';comment:'值'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` +} + +//SystemAuthAdmin 系统管理员实体 +type SystemAuthAdmin struct { + ID uint `gorm:"primarykey;comment:'主键'"` + DeptId uint `gorm:"not null;default:0;comment:'部门ID'"` + PostId uint `gorm:"not null;default:0;comment:'岗位ID'"` + Username string `gorm:"not null;default:'';comment:'用户账号''"` + Nickname string `gorm:"not null;default:'';comment:'用户昵称'"` + Password string `gorm:"not null;default:'';comment:'用户密码'"` + Avatar string `gorm:"not null;default:'';comment:'用户头像'"` + Role string `gorm:"not null;default:'';comment:'角色主键'"` + Salt string `gorm:"not null;default:'';comment:'加密盐巴'"` + Sort uint16 `gorm:"not null;default:0;comment:'排序编号'"` + IsMultipoint uint8 `gorm:"not null;default:0;comment:'多端登录: 0=否, 1=是''"` + IsDisable uint8 `gorm:"not null;default:0;comment:'是否禁用: 0=否, 1=是'"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + LastLoginIp string `gorm:"not null;default:'';comment:'最后登录IP'"` + LastLoginTime int64 `gorm:"not null;default:0;comment:'最后登录时间'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} + +//SystemAuthMenu 系统菜单实体 +type SystemAuthMenu struct { + ID uint `gorm:"primarykey;comment:'主键'"` + Pid uint `gorm:"not null;default:0;comment:'上级菜单'"` + MenuType string `gorm:"not null;default:'';comment:'权限类型: M=目录,C=菜单,A=按钮''"` + MenuName string `gorm:"not null;default:'';comment:'菜单名称'"` + MenuIcon string `gorm:"not null;default:'';comment:'菜单图标'"` + MenuSort uint16 `gorm:"not null;default:0;comment:'菜单排序'"` + Perms string `gorm:"not null;default:'';comment:'权限标识'"` + Paths string `gorm:"not null;default:'';comment:'路由地址'"` + Component string `gorm:"not null;default:'';comment:'前端组件'"` + Selected string `gorm:"not null;default:'';comment:'选中路径'"` + Params string `gorm:"not null;default:'';comment:'路由参数'"` + IsCache uint8 `gorm:"not null;default:0;comment:'是否缓存: 0=否, 1=是''"` + IsShow uint8 `gorm:"not null;default:1;comment:'是否显示: 0=否, 1=是'"` + IsDisable uint8 `gorm:"not null;default:0;comment:'是否禁用: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` +} + +//SystemAuthPerm 系统角色菜单实体 +type SystemAuthPerm struct { + ID string `gorm:"primarykey;comment:'主键'"` + RoleId uint `gorm:"not null;default:0;comment:'角色ID'"` + MenuId uint `gorm:"not null;default:0;comment:'菜单ID'"` +} + +//SystemAuthRole 系统角色实体 +type SystemAuthRole struct { + ID uint `gorm:"primarykey;comment:'主键'"` + Name string `gorm:"not null;default:'';comment:'角色名称''"` + Remark string `gorm:"not null;default:'';comment:'备注信息'"` + IsDisable uint8 `gorm:"not null;default:0;comment:'是否禁用: 0=否, 1=是'"` + Sort uint16 `gorm:"not null;default:0;comment:'角色排序'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` +} + +//SystemAuthDept 系统部门实体 +type SystemAuthDept struct { + ID uint `gorm:"primarykey;comment:'主键'"` + Pid uint `gorm:"not null;default:0;comment:'上级主键'"` + Name string `gorm:"not null;default:'';comment:'部门名称''"` + Duty string `gorm:"not null;default:'';comment:'负责人名'"` + Mobile string `gorm:"not null;default:'';comment:'联系电话'"` + Sort uint16 `gorm:"not null;default:0;comment:'排序编号'"` + IsStop uint8 `gorm:"not null;default:0;comment:'是否停用: 0=否, 1=是'"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} + +//SystemAuthPost 系统岗位管理 +type SystemAuthPost struct { + ID uint `gorm:"primarykey;comment:'主键'"` + Code string `gorm:"not null;default:'';comment:'岗位编码''"` + Name string `gorm:"not null;default:'';comment:'岗位名称''"` + Remarks string `gorm:"not null;default:'';comment:'岗位备注''"` + Sort uint16 `gorm:"not null;default:0;comment:'岗位排序'"` + IsStop uint8 `gorm:"not null;default:0;comment:'是否停用: 0=否, 1=是'"` + IsDelete uint8 `gorm:"not null;default:0;comment:'是否删除: 0=否, 1=是'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` + UpdateTime int64 `gorm:"autoUpdateTime;not null;comment:'更新时间'"` + DeleteTime int64 `gorm:"not null;default:0;comment:'删除时间'"` +} + +//SystemLogLogin 系统登录日志实体 +type SystemLogLogin struct { + ID uint `gorm:"primarykey;comment:'主键'"` + AdminId uint `gorm:"not null;default:0;comment:'管理员ID'"` + Username string `gorm:"not null;default:'';comment:'登录账号'"` + Ip string `gorm:"not null;default:'';comment:'登录地址'"` + Os string `gorm:"not null;default:'';comment:'操作系统'"` + Browser string `gorm:"not null;default:'';comment:'浏览器'"` + Status uint8 `gorm:"not null;default:0;comment:'操作状态: 1=成功, 0=失败'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` +} + +//SystemLogOperate 系统操作日志实体 +type SystemLogOperate struct { + ID uint `gorm:"primarykey;comment:'主键'"` + AdminId uint `gorm:"not null;default:0;comment:'操作人ID'"` + Type string `gorm:"not null;default:'';comment:'请求类型: GET/POST/PUT'"` + Title string `gorm:"default:'';comment:'操作标题'"` + Ip string `gorm:"not null;default:'';comment:'请求IP'"` + Url string `gorm:"not null;default:'';comment:'请求接口'"` + Method string `gorm:"not null;default:'';comment:'请求方法'"` + Args string `gorm:"comment:'请求参数'"` + Error string `gorm:"comment:'错误信息'"` + Status uint8 `gorm:"not null;default:0;comment:'执行状态: 1=成功, 2=失败'"` + StartTime int64 `gorm:"not null;default:0;comment:'开始时间'"` + EndTime int64 `gorm:"not null;default:0;comment:'结束时间'"` + TaskTime int64 `gorm:"not null;default:0;comment:'执行耗时'"` + CreateTime int64 `gorm:"autoCreateTime;not null;comment:'创建时间'"` +} diff --git a/server/plugin/storage.go b/server/plugin/storage.go new file mode 100644 index 0000000..ef6685b --- /dev/null +++ b/server/plugin/storage.go @@ -0,0 +1,134 @@ +package plugin + +import ( + "fmt" + "io" + "mime/multipart" + "os" + "path" + "strconv" + "strings" + "time" + "x_admin/config" + "x_admin/core" + "x_admin/core/response" + "x_admin/util" +) + +var StorageDriver = storageDriver{} + +// UploadFile 文件对象 +type UploadFile struct { + Name string // 文件名称 + Type int // 文件类型 + Size int64 // 文件大小 + Ext string // 文件扩展 + Uri string // 文件路径 + Path string // 访问地址 +} + +// storageDriver 存储引擎 +type storageDriver struct{} + +// Upload 根据引擎类型上传文件 +func (sd storageDriver) Upload(file *multipart.FileHeader, folder string, fileType int) (uf *UploadFile, e error) { + // TODO: engine默认local + if e = sd.checkFile(file, fileType); e != nil { + return + } + key := sd.buildSaveName(file) + engine := "local" + if engine == "local" { + if e = sd.localUpload(file, key, folder); e != nil { + return + } + } else { + core.Logger.Errorf("storageDriver.Upload engine err: err=[unsupported engine]") + return nil, response.Failed.Make(fmt.Sprintf("engine:%s 暂时不支持", engine)) + } + fileRelPath := path.Join(folder, key) + return &UploadFile{ + Name: file.Filename, + Type: fileType, + Size: file.Size, + Ext: strings.ToLower(strings.Replace(path.Ext(file.Filename), ".", "", 1)), + Uri: fileRelPath, + Path: util.UrlUtil.ToAbsoluteUrl(fileRelPath), + }, nil +} + +// localUpload 本地上传 (临时方法) +func (sd storageDriver) localUpload(file *multipart.FileHeader, key string, folder string) (e error) { + // TODO: 临时方法,后续调整 + // 映射目录 + directory := config.Config.UploadDirectory + // 打开源文件 + src, err := file.Open() + if err != nil { + core.Logger.Errorf("storageDriver.localUpload Open err: err=[%+v]", err) + return response.Failed.Make("打开文件失败!") + } + defer src.Close() + // 文件信息 + savePath := path.Join(directory, folder, path.Dir(key)) + saveFilePath := path.Join(directory, folder, key) + // 创建目录 + err = os.MkdirAll(savePath, 0755) + if err != nil && !os.IsExist(err) { + core.Logger.Errorf( + "storageDriver.localUpload MkdirAll err: path=[%s], err=[%+v]", savePath, err) + return response.Failed.Make("创建上传目录失败!") + } + // 创建目标文件 + out, err := os.Create(saveFilePath) + if err != nil { + core.Logger.Errorf( + "storageDriver.localUpload Create err: file=[%s], err=[%+v]", saveFilePath, err) + return response.Failed.Make("创建文件失败!") + } + defer out.Close() + // 写入目标文件 + _, err = io.Copy(out, src) + if err != nil { + core.Logger.Errorf( + "storageDriver.localUpload Copy err: file=[%s], err=[%+v]", saveFilePath, err) + return response.Failed.Make("上传文件失败: " + err.Error()) + } + return nil +} + +// checkFile 生成文件名称 +func (sd storageDriver) buildSaveName(file *multipart.FileHeader) string { + name := file.Filename + ext := strings.ToLower(path.Ext(name)) + date := time.Now().Format("20060201") + return path.Join(date, util.ToolsUtil.MakeUuid()+ext) +} + +// checkFile 文件验证 +func (sd storageDriver) checkFile(file *multipart.FileHeader, fileType int) (e error) { + fileName := file.Filename + fileExt := strings.ToLower(strings.Replace(path.Ext(fileName), ".", "", 1)) + fileSize := file.Size + if fileType == 10 { + // 图片文件 + if !util.ToolsUtil.Contains(config.Config.UploadImageExt, fileExt) { + return response.Failed.Make("不被支持的图片扩展: " + fileExt) + } + if fileSize > config.Config.UploadImageSize { + return response.Failed.Make("上传图片不能超出限制: " + strconv.FormatInt(config.Config.UploadImageSize/1024/1024, 10) + "M") + } + } else if fileType == 20 { + // 视频文件 + if !util.ToolsUtil.Contains(config.Config.UploadVideoExt, fileExt) { + return response.Failed.Make("不被支持的视频扩展: " + fileExt) + } + if fileSize > config.Config.UploadVideoSize { + return response.Failed.Make("上传视频不能超出限制: " + strconv.FormatInt(config.Config.UploadVideoSize/1024/1024, 10) + "M") + } + } else { + core.Logger.Errorf("storageDriver.checkFile fileType err: err=[unsupported fileType]") + return response.Failed.Make("上传文件类型错误") + } + return nil +} diff --git a/server/routers/enter.go b/server/routers/enter.go new file mode 100644 index 0000000..53798e8 --- /dev/null +++ b/server/routers/enter.go @@ -0,0 +1,13 @@ +package routers + +import ( + "x_admin/admin" + "x_admin/generator" + + "github.com/gin-gonic/gin" +) + +func RegisterGroup(rg *gin.RouterGroup) { + admin.RegisterGroup(rg) + generator.RegisterGroup(rg) +} diff --git a/server/static/backend_avatar.png b/server/static/backend_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..20517192047e025b4267e7c5e10a7f31a949f560 GIT binary patch literal 158102 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 @ZT{Dm`6 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
  • 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 QRsaA107*qoM6N<$f_Ngs(EtDd literal 0 HcmV?d00001 diff --git a/server/static/backend_backdrop.png b/server/static/backend_backdrop.png new file mode 100644 index 0000000000000000000000000000000000000000..a3020117a07f47adac5f004dc50ec5b2aa5b815f GIT binary patch literal 85612 zcmdqIRZ!ed&^AiQ;sF*<(8Ythy9Afu?k>Syv$(sv6WlFWf-V-E;4Z=4?QHUY-*a&; z&)xS?MN#}}rl-57r>AG0XTm=#NTMR+Bg4SJph`=LE5pFNiTnGD2oL@8wVQJk`Ul`F zDy@nL{qaFG4TFIJ!AOgXsCwuh=^@5rAQ;+|WaFdqBR1#s%Bg?Z;2cDlW z7a9YcZ&YX4K)YYPLf`bWfoPFwMKpWrdB#G9JWHHU${$~5r`rWOiORjb%)QL@S7P6m zR_Nd9&pxgS$*OLDKf>S9qL@_A7A@UKQ8`~*HNK7LMgag|Vc&p%9Eb@I=U!YI6uKNn zUwJ+`{5l8}8`T7XfIvh_6|-$j9pK!TNP^9cQA1nK*1mVJKl$~TF=T~c*3LF z|3*@c{CX8&lhkm9`CPdO-{%Zf?5nUasFoKaPTwQisfuC}L4EJ4zY^}R%3p=^v;k?t zc5lG^E&rd!jNKCV)KPn570wUFbN?gcGXw0@PL0Zq`eUt!!vEN%&IB7EtbV!}nf^~R zuqP=9(NzB|JoMiHKMp<#10e@`-Ym}l)L>=;0KlUtg6FkRoj^d%PDDgltxg*zbH;xr z?*@Mb#d-duCdP$&3;fDL4w(Juj zx%gYZgok0&pzuAF)5095as6BTi>@Ol>tCIxCI$svgYL>jx+HY>w@m(7Ud^^39k&?w zRe3C-yASe={aLy7$w#?9BvnJlk6Q)>FN1E%9y9~w50(B}g=GPTa=RfP(5w{_rFy?t>C;G)kC+3(66e-!T1w_4@yQ!UV9ohpwG=&~0;OyH2se-W!;p%qWV?l8{E#@e!n_i?q z+t!no&K%wgYR^~B3;!1a_N>?2F#^a_zPqx!vzSph`RfbGnutmFlYsnqsBrywij%9k z>ja*VsLgjiWUNJHpwvlL_ca#&eXqeDrePHl#S#hD$)k|ibAUMR_O#xV1azKgp01}o z1%OhdRv{R)62z6|4~wOiontb*RZ?B&&oh}M+mLZ}GVu0|niMUqB(W?dcsnMuIR4cG zo#@xf3|@qA>ly+v<=UQIK1S6c#fc8_U#AiuHm(=yTEiMiZ?bVsE&8y2lpuZwDYY-E zb{+>=Fmlu5EI-2BOHl7h^jMtI;I={rOjhqA-;8l4UkjLa-N9aHGEgH%a&2mKgrn^W zYDkR*K5qL9igsl`e#8{L@}1+>i$*>y?JlTWHF0hLY$L$zt~NL_q~~70bJ~*?^BEua zcNfL4NDRxIfhRlauQg&ADrLaIY-V1W*op-`J=&;)?Nw;ct|uz~6p9bS*>N264`23dsrF z51hV`My%aw@v75n%vI=%N7wjMHtoWC?vYqsAPAL)2gA3_nCn??(I@AavLI1(*Z2^` zq{w&2xv0t2Pl#HhbgCCT2mj5CJ)7;e+T*YDqE+?|@B?D4kq%Gk*>6QWvPaGNZLrAL~fT$x$|0YMhZ}%myweL^L znKVA!x&2dt&%6RYqy$3#j6 zpu9VCvg(SHt;Cf!>;m-IHIaDmx$<9@ZT}iP$P_9u68C;YG4dFihIno*?RtqNJKZxh zq3uMC+>h_(RyrdU#kr?37gzwXn?9wC*yZ_VK|N;DRB%e)NO~D$G!Y~4JupD=WGL(C z(ph>oK)7|q-Zy5h7i%O7g_Yn!$cc@JPW{7q%<06g&$R}}r*dm)5dVw4f6m;_psr=~ z*KukBh8(5kQe0Q1Hc#vQ3QU676qc$#vDP?p3P1?0rfHQ5ePj5ZQ0D1_79H${W}J?Y z>|y3bz<8Rt-Q9a48f*dmh^rV>Wgp`R%;4RZ-rVu3I}NFa%`1Xf+tSbZdj^jE%fk`c zoW6FU0zcv+Y56%t%52-mCB7P*WHmLaeIX130jmrGS{3P_q1s5+gnTlcfNz?Q7_`BF z8~sZeXe|1G>}igp;*XctKTiZtzHTvPB@ zT~M2L(6R;cFFLa|SFSekMz1p-PF^Q0Ngv^{MD21Hn(bdv<*`T1`ulEsED{m!%jppT z^qMF^OP;6HD2c$=fdt6(IJu;=$-Z#UliBxEk&8Wx=CRe@`=)9Sv^K>xQBI)lq^{1w zbu-WFGR-(y{%zA6}6BhU(C#r`cupk)F~JP3G>`#=8(tNryEGUs{Rzv=^835EOey*dVYm=MEk$KV;tG(k6=Yg$y1DoXnAGY+mvXVp(B?#zel?WOJCnB-sN!r zDQ9ioa~Egw4+=uTm9HLY0oqHtm5+?DXk9SH?x&?6#|uj%_K` z#g-az&h`7*0J;8?h@Eqz^nJ=rc4h4ksc%JU)FYZwrEYt6m1!1|GB0L+$D~J3xa-!^)drIbdzTwGP7K=ChcE(o=G|@l#f(%PjAFy^0 zTh;x{#U9^XW^n0bt-bUqW!xt^q>=IEP+vrTFIyx=(I*)GUd+}G^t_8|IwaU_hpLt1 z&cfky>u*W%*y506+A%t5?8|>mSTD3ivpvHL-*sBCRygT&+r4jnq5Y-kaq-qF>hyWQ z!fHj}wJ3eHd*DlMiQG zjUSEY+6^gh!FBJo;brGKfBn*EQG;Pa?fRPeQ!jy}%G(c}@}_`+0YqlP%!0laKe@ur z!H@dZ9R@Gl*H4Em$WI5185@stHKdn(uZfGR*GLCjuh0HMc?_pd+(i2%MSXlVg>%oL zA0JZvt$Tl%Q|=$;mRzqr8{n@rXZI|x?g>fR)DC?*Z$V<vCX5p90*CUTq7dqlQ= z+^?~Ecb6^xgYQi@&>@h}YLj0po z!52dyLK!x{aOaEKjO_$Q^99y#0ra?6tkdEXV-xNP*-55lnciXt%{8$S1_Fq6KmMh* z&OHf=^bhs5sOuZf1f(L{GdP;?`+@t%%AhO*XwK@`RJQi|J@^Nr8ja4XJ?GxGN{%T0 z7JRnfR*@~|b9l)_s@R??C-j07Z9yX7kY?=k)7fShjYuK))Q`L=*A;)^+!%fSOOgL| zGB3<6wiF}j4Ft%Lz9Eu1p%;!@?1y?h<>^Fk z8lNI2XV^gr2cIp*n;ySI=f;=U7r8|L7e2Ts_yoUefyJj6#p%gFN!CnR1cifKFQKZR z67N5@+;?8cSTA?vR4#NaYD2>OM-@*>KHu0|WGloBS;?#y3Ng+e35muVJd-xW<9+`n zm|aQYkABU6_wil?(~3$*3eC#a$q9yF1@eB8pv08F?Ahft0WWSZz*z% zz0Z-}jPLBVOW3PBBiNAbXt61_r~Ad^oMkuWap1756ZLe|TS(e>xU$1>*o)PFqqp%y zAUBU(5@A@@<;RfMj&oW5j6@(-YtYS}6ubW&!PwD9C*V&B`jrPQZK16~Q^dP30?Aq2 z@8uldF5P~>So z7nz{Aj%0I3KbNe8Q-3;Fe8{wFERo@8}CDeeJKv6)g^sJ22?v%pPNHxMaQ*AvZ~kqQ_Ibo zTN{<=CieJ^M}q?S8eaq=Ln|0-juB{~-Bja)bv&-t{T1-8rZp?W?wKXpjH^#{%kL(5 z`)HrSx!8F#(V;9h1qpCCeZAOX!FhYHo5~+ecbicUY-24) zQJ(&pGJ(SX7Nzk#rrpw*Z_%3t@p_pJ;@La+#}YHm=h3-w!{1+QOPg!D-A}Z%i(ngq zfS%Io|HQ$&GyHp6(9b|~vHjKPVk>X+Ex5G~-i`qkx#KXX}? zJ0bP5oC7^BbnW0H5 zHG=yO0u6j3Ic+H8maFrS5Bg|S1+od=l|OtULCl^vw7bWMHk~Ef5e(ACfOH#8-zfqY z)*U1k*X1E^jg6Cq>sX%7@Yrweer?|5QO%Ps+x5)x-v%Vb0g%Rd7`pH7w~Yw;42-C0 zI4r2*GFK(^es{)tjTj|9XBWqda(+~2^2{$ETD1t6=~sT2n`H11uu1(Anv(}y3YNL{ z-~Y6|8Hf<(_TKtO;%;BUF<0JPAT8a^y-uFfB#5PRPkshBp!}e{Wx6j|k@QiPsnndB zLUZ0bD)$Bd`gB=VN$?xH2jr~S9xv6KAcac;9ifeSGf@N?S5KPEhzFF+j91nL~0{cd$Ez2}5t)K`O7JM-O)Nh}x?z&Tr z&}~qR#$9SpH4?fevhsws6{mKVZQ^QX!2mo(a-Eh4|&iTHm<3FA8 zm1TYbr3!`O`}uOon{heg7Hbjxq1D7duSQQH`nsY*Yrbbm16Ik z`a7=#!F#g<69HZVtJmPMG|HUJyo2*z!`I{7oX_aE8C+Np3;TkmWS?(B4{*`u#{~D| zzT5BzcgRO#9W)mY{*V5woLDP_@-IW3b;!kO!vMGJk_zyeqTeTzHqP89^?5LC!mkYR zfbCe{bok*96%Bxk!S2M<{_(;Pi!4byZWqAs>$v1uPf*3AEE7cwF03anVwf723JA4I zvpyPWZ4l<@Q#nKFyjqyB;4LctI%+n$nfJNAKy#qzUY5d*om81N;^LKEG)(ATk`qrQ!yU$4!H;B51}Y9b>(L(1ox5N|lB z=P#JL@ zktR(QWFz-nhM#)aBj1?~l~V=PF%lEnl2OiTX~7x|{diLbLtAP^MRX$^u#yi(LREl= zuL4};))X{zt%!#%NEx8Xat?@%HEo1;7fl)iE~fC5-*#Uz`Ji$9{I!uAz;LSYZDF^f zC%|-h^cU6I<67IPM;S}QFtb(=zWobg71+hrRIwG&ySHCzz`x=Yk&paNEXi2+t%wXu zioG90Q}h@K!Gj{HbCW?!e3P`?~rS{?doLeFeHR)_LUc%R{%z48|48$ee zRfJC8VkU}q>#lPN-pU=Gxp6VLX^6y#=&jh;_H+Td1uU3I`ZfEN=X|4K<7SRTO%Zga z=`7;Dc6SqNNgb!`42_>lj5vC4l;>SZ@8^rOa?Lc5H0sib*EK<$7r!gtap6FN@Vblk&SGD&zZkS8oa=K?yO_;iB1K z3V;Pc_fsg0kQ+{}rT*y%`o0JAiPN5fVCi&N8sxFIBpP?u^_)00WyMoj@tnPeL6xc; z!!X<2nU#wLNNDgnV(33u4S;Tj$%qP@(?VX<0YV^gU^=nUMJ7fRHZi zAmiF&`6cLO1;C;3R+Xzv=qb6R{`Lin1)=s6Howq0xBLLs7Px3~th^-mc`baejfkqn zVC_?)e<UUT#jf}o+|R$I0t!a& znxv{3sgZ*_a5J$t9qH%qLKyjT2|;TKArC^!Vr(ylj%zPm24V~}wh;FfSvG?Q#H#k) zY?p6D#3qLrm%UqE@AaVuM>+U$cL`3cm2MnpPr>)pksLXVeyJt;bC_FzYO9%(!;^pU z_!Me+{JJc?rET&xEz9XQ@%Zi23vot>l<)FPW z7%50CN}IDo7YCPQ)Xqm|04bPh{>3)x4Vq%PsrNf;syJC`_uX;dxbIp!{V^!?JL^Q* z0#n)i_^qeI{WHmJ?hVxB9V8<%`cLopa2@!QQrc=tya8Zrtz%u-Av;)RRs60CB<*ox zy0Eg(;h;zEb{t%+R1^%v*JvTR#ul`b_W0;S$N(T9by0nvCUlljs5M*SGI~7O%gAhS zh~$qNcY1(_Pw5x3N4|~lL;og+qx;rmP>DeUSR8n+P!uGgbe+ry2U3rb<&wZy2&_6D`g z5_T)mO~!W^#-#<$^ifaWyqCy6Eb1D#qM*+-kFw3#^x!kX4SJ`kjQUXgir8|>IG-q| z&f3P!!L=<#Klv?myTS>@ZUusL$V?NYeV#JMK z|F=Yd4J6p1w=%#mc-W!U9F(9xpD^imlLXZYP3 zNeN8*`6{9gOjIwSA?`Hh)u3*V`T!QKZ5SmziSYw7VoM!H&i3A`a+uOe?VTTv#>r%5B~9~IhV4+_}Mv1+z%IQd}~e_XXLTu_;s%&>&JqPL5|}u4{SiH zZ%%mr3>N^&@)E(&dDA@$X`A3o*~gUgBin6TrLP(%iXYtFPb5O|S7c_T)5He;Sqtr3+d4U+FCS~ro$Z^7}HwU1HSbCnj%17C}<+pmDkIzP6 zW3zpj@x-AH5DROnp2loY*#-wU_q(I@8bGlM!!|2l8;CgAnnF0;! zfr~cu3EsZ@tBa6~{*bjYzHUXGuh*n;vXd$fH-1z=DSc#P+yM+!nFBLo4fqQF z@i(NqJ3+f)yf&T$Gw~hH(s|d*^Gd&7{co2947Y~p8b1OeLoRy}kakQ(q;o6?7!A0P zD7yRl_-*R}eOk#cDDX(|Uhtsp11BoOIlirG@ZO-d8+EXtVDt=1h^??u7ap#+UpC5H zi#8Wh^Lddj)WX-^rJ>jC+?-0W>Lg+A?6;e`+6(en#Ow#*aa>2Q9vmFqPfiyXR(JJt4>GNCN2x#8Pu1gj#8_yY}{m zUkn>e7$G zG`LI5RvG{Sx28|2YXuCp2(Y-)MV-=7KYFW4_W40P9OOBc>pWp_WvZ~Acuu}7Z*cHY z_VfbT#KmY}H}-&;o8V(g{v>j%ofZuwFf+}D@4^*>RF+naxS#*a6M6>t_^gN`od6j8 zTCk^-sE&gRYZjfQmiPYUY+#xkRjKr|5sriuQ0fCLcyg-F3~Pb=lQ=1fgMu|gY0}5* zam7Gkwa3?km!SK(< zJx^w`fpdcyrEF2tH0Vl&Hj^^og~aN}py-%o@#mShYi3rC$1(QY^X zGhC)Eh?*&mm zJHGcc+4j32&n5X$qD~LT&uPSGA=fWyFoPArw$k%kFr%FX_boU&SW81gJs%9xmFnB0 zOIgiQ6NL0{d)+xACl6!wapM0Xx+(2WBq3H(2bKm7Vb7OOA+)>=bRmD`qCVM5+V9^T zy{$c9{{482ysd1!99cG7d*9f*ygM6#Vk`gt%&Yp0Le#T3;NrVd`l z>~6S7JFzu-xHWbK7MWswxgKd#60tD=8CNtyH_EkDF|HxLPpolRSL`;rP> z`a4bx;#U7$<{(-u15Ihe5%FLfg%qIt*BbLLmWrvNHY)uOxS)rH;x@Q%Oecf?YaRYqSa=2P zF2z6M1MV9r8W#yu|3~y+>q_yz9E(0R9B0gb9E-@WP)$F}H6#S9ID zQQv+L%t>Atk5Ojhrwq!3qJcQqF5?y7A)hxET zwV(u=-T(}a?j{gcBgIVPMIB6cWB{!gl=flf5#A05>lzHx8Yo&)G-eUW$!k)Q$7YUp z2J?2VmCsmiUcl(Ek--c*K}xS`ari?NG*B8+jHxPs;55N6`0gQ#x-1RouK-sHmeS7| z*hBW=?E!O|VkQvI6R9*Z(d;Huh}A)D*;UKsz)EZX0h zwUh1-`Y%K`{|2<918yfG0GIGhv!`4yL1bRNb;M!`UWeG^&vHp8Z)qqe^DRa_oI33 zbu=H*BSI!-v;t6KPj2c?CEEA$Upl);fl~ z`B54%kaZ&ok?V&iBWDNaTe*TUtZb$nC}Sxy&!bBjx{g#M=4m^HihFY`vh5rtGX{l0 z`)bHy3swX^q=~mRd|pp`l_b$ujUiH@Qr(U8AD%H1o!t!@&@jVZm!nM_Yv`zoafVj; zj(UVpyGrdpNVAVA7E>Y?9bJSGSVuvZCH~v*%9*k<(qfQZd$(W$>MK<~*bNXD-2LDJ ze=RU%r(YLcq4dP-LaKpB&N?1zT@6;|Elvyb`1Y5hw9kg#%>-+V%QL5<^i~WZ;xVh)wFHCS^ zX|3T>Q03_P%72$y269{U2HA>8$I>#2fYiQH5vTtz>8lkVu!&t4R205j#AvO7t;J=N zp>dVKVkFBYr&IP5oyKBeK}#6sVIUN(QBkkaOdQ;9r(|0@ohfNLO0+(QGi$G(s4e#UujSf;A z>YurM8iFH|)o|HggsQeB?A~Ttu~D8>Oac|TE)yqe4p2>C=pAk3|I$;i-fQ@gThYKF zQOsM$wwAubrvwI1Nfh?4QIdiY?CnNz&`^|g0%HB~mhWJA{<2)_c^N875~5AzPtT41>0$95G04&7 zyU(h6rfE4Y!Y3(S#0C@~IXbGK{-xQ7F>5%f_-IQ! zVigzQHEESc_(cPV8Tuhk7T;Sw;X-I#mChV&T$XUJtoj&cDwSdCJ+CmPLe=^_hjpe* zpKssx7~TYSo{P4kg7L6#T5d1&-VGQll&<01^}7?Uux+6Tw75}CQqllQ33MV=n9xJF z@j>2k?-X4VzWmsqJUBT@>5ZC{HBryxi+NljI;7yFBrST0f@&%Vo>#C}DH%I3>{oeH z1i@mPGdmrh>1hy7h+B4nLEO8Ron5Uz?t@)#Vy%`fGW`})lo*r|W!+c1Pfwy;xDdz* zmflt$hh`$}=Kt^{prYG107_9>hI`xmWnyUOwIVMsuX#U4IZDeKHUjpEO{|+|AmK+%g`Gjb=7L+T znwusTqG;ARzh5gW-|*2RHFR6^33KKABm#1623_+K-t-_Z`Y@cF@go5eqz8J-zfKbR za|u`Nh}(JfKNlsR%?*E?yQ)`nygzcfOcG%&Dk_!{jwMsJCW<@%`sE>E8es=>{^A=!Gm)*d z)>zrZ1E)V-0*it{tLMkbqv~(^VW7DBn&Q^{fxq+?mb{TF9$#j22YaEZg4n)yFV37% zz1i&Q3Ofa6G53IgBua`8l7Ff+TH>dT3dBY8dwr3Qmn$ZKVSr`k+YCzN_74=BfbM-| zcEX5B2WB)faDHcBGLkrZ|8YHnHG{^FkLfZ(d1j(&%YmcqydI{W#YL5YB0jYHj@X=c zfwmc^OSApe9bVPC?-dW?qa1@=@K;uXkSii)F=A(6|8B*?j_J+d83M2Itx#<_HVm6Z zTVW?hX{4+sH?q~muaMJ@XIbU}-8Nl8?S}7+RWd00tL2%$@5}oD43nf^oT@OdQAGubJbrx&4v)zzwXv$WA_j?O zpBme2-2Dq#!VrA`?+0|0ZpqPwRq5Ed)>^#fhmE8u^qN~=D_s-odzD%Ck&ue0=&10^ zV4xb~d~HgwOJ3()^m)zsh5fF@%2v0dtoUfRXlvbJ>q>o=Ke=Ai)1P)`XqY&UZD79qO zV~1f`3JrMDHt#2P`&eaSt_|B_Fq%5u+U`bd6YjCqk~Z8EIv?_YyrV(y(<_y9A8N+|~+L zjD=OPD&@dfo)SoOO6F=#^}>KImM1n0)D#hD;b`sq$$>V-6rc?1u68!?50nAv{8q5g zEppfihe=nZdNVeJT|pXGsU2AyU-%aJIISu6N8)W!WP`Yt+9Tpq&F3|1Zfr?$@1TTW zyI-Ce#Tex2Tj~otEwpw*$`B?yKZf;6$rbcw*E}-PAx;zCom$F@WL_sQ2B2PBXty}C z1r%4@+r{X$D{p}Y#{Ph_Hn@upNY=1=OHf4#B@eoZk`Egp4XIxrw#Hiw91W>Ry;4Tp%03X(&`0E|j&mef zEl(Tm$*4w5sZY_HyP}w3vkS7Pp{Nw;n~2WG3<{6fUUx{rF;{fh0mclkN@@adWJWCp z2oO_xOfisgkSNjzt1VfJr=2Hl_5S@98dO06io_jF2yNuHC@_pP`?KOZtL!@3_NW^* zTz5vvzemJDwTg|jCQQU;V;UnlO?hc&RaxmJQNX6%pW^YZE!zxaT5Ki)ZFl2@Wp%Ql zlP-tH6-gJsNjI}+mNfc%%rRrll`DBbFgyG8)Ngx!g6;e`A-SLg(4ah{c1SKIW{UXBb*tzW1Y2!F2gN&U zj6w;80+Wc}J$6*w3Mif+`nLE+s5v%oSE`4UOTn46VuvbvCP5e<3#%luYuZQqI-$dMfW8^;d6W-dAvX*(rz zeSk0XS5UZVk0kadk8JD5Igi$zY&t?E%O$tqn`_#;(;o4@b8IR>GL;Gw(4(0BSbw!U+%cRgJnH>l-i|8=sv}8QU;I zrG@1-_>^(c>TS5OKF-Iz!9cyTxQ zv(2Zr@3;i$lWRTX&_mw_OZ6c!G-!7L+Ps}!C*n<*Qq6k5!f~QRt8l({2EIk&C>VHV zMv_;cyNZ>>J|GyCVhdJPlcQj;3%C6|{En1T=F|n~i=$y<28RQbo`NQ_&?)|C+itU2 zcl=QO%O&eiAc-P^*6+t(Zx^C_<*kaM(nV*KD3E^f(L~^j!zCOhS8L~k zs->3_x1Vj}=GK&6uzN&k_O;Falo=IGp<!^*QsAb z)1(6zVK}|71L!q>Lm4nDvz%MiWrZ+&OinRLvUy9xfs*2~9xgk(Xcb z*nM0i{pJ>P3|p!GeeJ2|5pV1BFm_5JdywUgBV)zLn-ofw!9!D&8EsqusWt?TjHc#S z#c>3VeU&=kg8lZ}R@I94cV}lF+8<`GT}JrCIZD!gsfPjQ+0~^s6^~t-FkybUM9>I} zMDz4@{gx~|;{{Tmd0SSWr%DM(P_wC{MfT>E4*<|QKJM(P&<~9QzbwU*CK%s0MM31p znOpyfku73TaOTaAOXtJX8b#ijC4)HTQg9k zY=EHtE+ZRbyw7LZ<1+e>c1gc77@fB4L+f)1?Q(ruPz)O6YQhBh-ATi$J{&Jcui#V& zMKo2Q+#u-TN{mdpM^IVjM;b>X_3;e%7kO_V5YC^w#?fzrr$z}<%DV0`CQ~mtC%$?T zZ_CTJXd^C|C<7r<0x^=E4S^_wQV0f4mUSR<7)4(@uv z$dX#pWvHA~9d`Jr6N$2fFR7#SO8{CsS4Q+z{YldmeoJZSoPf0r9n9qA9=;IeoP1W_5Bj$^Bq2 zGU_`z%46~`Sq3BJDr(xH7`(ZLTrLr6Z3?#U)7*{58BrmTAv-fI^!l>EF=waIa(`@ zjO@dP3hOGex8}A=RpOkqbKjzub=A4P)u`a|Bz+&}OIn?*^wQTlG8K4jyE0Ca*@v^b z!l%bJDUhQ2=xT^C)az?1t+hG!o#92ns$#sd<@Xl{vo?2WJ#q#z*R~M#{Zr_!yx(I{ zT9qseL@0<%6SdRn*^p$ctnd1aQq@D-Xlwn1h)oCS5;=!m@ET#@_-*mJN6s2`+@HvQ zp}*xSZ4KH4@Gh|t7ky?`o6D=I)s}6B%bwwl34rp=ekQ3aUx^>wxRyUe3{6{8Z_S}d zTVIh)5GLTgvS60<-8@RCgXwhKdV`a8rd)%#{xE)U-q%UZmZ2+=B`77_Ncr{E=G$^R zsUOqdTQ9X2b4yBKNLj-4-{(|rGz-V6#TcB8&WpD)jHV}fU8L#6zO03F#zQ3&NV5U; z-}UiIqf@OACu0c1Akd0wCusEha{*?-c)7>ZN6X|&1hIA@0pr#9hil$XJr1hyV6h7t zi^MKpR2tSwgAE`>EVVRJK>DS^VFX%(rDoy@a}M7MuJxrB<^VEAjj5}(yS-d4r~DGx zn676f`TF}Zy^)FvO6dM=)2W#8g%Y5Q1TC^aTJ^G^v^eqw9={^Y76ZSW259){soOX{ zNxc;RLf0nZ3oCj94wLxi4Il4s22-|Wa&)5usMKmofwc%~P5X6VBXEsVVCRNhZ$J+ zEv6<-&??74qO&=ObRwg3QROXdRBVj@-{wJ~3yLyYBS;_4K<({M5;+hU>nMnFR`MW`uU#@x^CzGDArF zLo-a?J?!8Qqxx~e6p3)#ZvvIeP;TFkcZIo(eMy(={PB~|GH11Rji>p_-faV;&(&%= zjBjFJN)uMz=rD=df7HGh`j`~G+wAqq8U&o%sIXF6zlj{(wuZ7%@BcWfr=T8_Zy^hS z=i>{XJ%~NOBYS#(AdP3|W#efcXsfgX$p{unZm>sx;-Ym0L28O+$Wfsm!Wqo{7`pkb zSJNM^wbMImXgercQswppRGQLFnS6Cq7awZ(!f5g<_BDOenIxMvHo?7SuCb`V;RCW2q?hd6V=f!= z`g-jV#`qzMX#hpMp9`)r$yNe5OxM3JsrF;cS3Rq*g#n&Q7dFwQ=sY*2uQSDQC1*K2 zOoi3H3>0w|KTKiqnvUQKRvUX4esfzfl6TP`d1tSEx4x{E>_|x>-Hg%peUMZ4ava0@ zyEOqE+Jw3?5QBb4?2Qoc*uU7C=8BtoQPzEfGVw(JTmVv&R}<8Sj6a`0K2 zC;6UkXa`O$OXj7f8K={+_7}UrSuNen?CC)bOraiud)V|vas&}7@WRpOd()mmqb7Co z8SOWHN`%*+3`wNPXiU$av}uR(4+=kta){4ZaM9enhrJp8uAp&=7BXbvMdta)s}-(M z*~41Nm;J6Z+grH>wb1-EMBtavb3jzzkGFw$(0~6D*A;FXW?Z{IGtOeKZ56aP&WUChJFA^MFL|e> zKp?~)V(FGNBk=AKF)IaGKkK;VO$lt~r-CxgtOsF=H({*BMI^J+k$J7DL~l|gMop_c z{i;4#^nK@Z@Q%%TXB~WW_vE6N31o8mDSiLb*3ZQBGO=1jMYNoNPfAqzitWaMtyIJA z-BL-E%yZP2A;A}X7kb1Zco5?rRSFiE*|U~Q4TeDA<|&bp3iBr9qJRv(l&ogkn2_5q zNTtBRuS%u}g9DX!MmtO65G=`dPEK9cWKNzl_FkibU<G zrqaLTK0K!Ku|lVz;aSSPZ<_Bslaq&8|AQfn#@;d6RvU8x!H*c8RGxxZ`}rMw7x=4U zlyQxEVUAWVB+T^2(2k?23H;jFeb;N1ca`wdItf(J<0aD3_4K|IDUd2^-;m1FxGg(o zI;IhXL}ow5`=@z$CAS;@=w{@(R<(zwhL)vK(gax`Vm`hTfz`SyYHX)3nWM4&%X@NI zj6$afv|bKdqGkf9grma{k% zU4v6ePWpm9aerBMJvex1TQ?+#vB|E+x7D%dU3pCn$^m_E5Zz3Cnb3JN&WHyaPJX@t9Ie+TAJM`;2ifB+kvL4LYS6Z)+mHfgkMTI>w5s~WdtP-$ zoEQ8gsIeDOF&9D~$T6fif^)`_We#+e=gkW*SCSdx^leky;)2m36#Z;d0!f<)()m47L5I5 zkW7IXAi&MYkvbxP%Hqv_3G>B^X(D4Z2XMcRlH2uNHgR5|f}M&q9PL0M&YtO6$? z3?Y8gr*5n-7SWjs$ClV^(s&kIR!|P4ayD1qcbqy{2G6WOdsQ>YQ{Ksql&<=Sh=oK! z0W5e0Ln|@Wz(r&)a~>e# zk|32Z@iZhuXNY+4*6pXQb?8RM9#5cYcxA>#5B$%ma9m6!O5~?rj@i<6*W|Gqo$ynp z!PujK_-7>#TO4H@vtnF=P02+9jBGT~jm4v0L`~^hZJRki-``>nnQWdPzqb%B*;IPeNIr#bM4?EnHThMO5}|rh$%9ebvwGjl_m45o?Iq6) zJ$%q9Dx=)~IxC|)3k4R7@MqK~*hav@^Q{7`*=6@iNZ?uxbqjJ%%}#($h-e_h3a6JR z`wPXFiSOK>U278}DHFJJgmO4@e52Soe{wf0opy;uXk)Nsa{4K}HZTq;M2);{Qb#_x zCyj$hF_&OU4^_t<<7xR7el*=_082G4N-|o%ch%orS@7J?=~V8(JhyXO4~f>1?%tQ< zu(3ZeL;X{zljDG%=FnFI*y``%N{lhsB4fN+PZ9BlZs0%37`B0jF~ZEC)o)fX@aRcz zlh$)b0IclkN|aWVz^+(I)atdLc#^rX0YUYvI!8B4$7ZZ$wwLR5=VzMP{g@aR)apsa zY2mi`(qD4t8G0pp?0y9A^>Gq%g%y1uHWO*}xc((>i5XluT-NkiQ-ib2%r&!gG=k{9 zDWY4zYa94XCO2`K?44ax?QGk&-Bgop^X%`O^ZN(h>s{Bg zo`rke>wdyBQ?bG6O9AoojX%r-qK!Z~P^~lLPY%4KX=<^5ID!YqY-fA;l(9@hp~Bz0 zuwGi?&%9(&U6h5@;1={m(9qACR~DiHR~Bva+87XKvdYEn1~b+?_JWyhQ34`!&OF52 z(5EYry+B&s$$9eUTZQD@62vR~NHBH0#J5Ub-{|LOGhK@v8DyKNox4EUqU)_v@sNrP z6t@0#Zx2t$nimJ1eE6{{e2RU>H0Uh`K0%9)s}Rt*>wdC&g6|lrRkziers@6*A{@Zc zLjb4t30z@Pzgp*M$$L%K{^OH~J^ulmkkuMu$I=pUU7TAFR{2Y_p`hO7f1`m%90t~| zB+wDfnJJ89DUODFXoK+RY~$hrR|zB3s(-Mxr-}6RfWU6+X@s�Y%S{(*brRksnx7 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 literal 0 HcmV?d00001 diff --git a/server/static/backend_favicon.ico b/server/static/backend_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7c002195bf343880dac50604a25b64e12d571d21 GIT binary patch literal 5253 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 OoAK>?232}avHt@%Vv+X% literal 0 HcmV?d00001 diff --git a/server/static/backend_logo.png b/server/static/backend_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2f6d5dbc0614986adbb30ff00f3fdd4d901d39 GIT binary patch literal 8604 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 0 { + chain.Where("name = ?", names[0]) + } + var configs []system.SystemConfig + err = chain.Find(&configs).Error + if err != nil { + return nil, err + } + data = make(map[string]string) + for i := 0; i < len(configs); i++ { + data[configs[i].Name] = configs[i].Value + } + return data, nil +} + +// GetVal 根据类型和名称获取配置值 +func (cu configUtil) GetVal(db *gorm.DB, cnfType string, name string, defaultVal string) (data string, err error) { + config, err := cu.Get(db, cnfType, name) + if err != nil { + return data, err + } + data, ok := config[name] + if !ok { + data = defaultVal + } + return data, nil +} + +// GetMap 根据类型和名称获取配置值(Json字符串转dict) +func (cu configUtil) GetMap(db *gorm.DB, cnfType string, name string) (data map[string]string, err error) { + val, err := cu.GetVal(db, cnfType, name, "") + if err != nil { + return data, err + } + if val == "" { + return map[string]string{}, nil + } + err = ToolsUtil.JsonToObj(val, &data) + return data, err +} + +// Set 设置配置的值 +func (cu configUtil) Set(db *gorm.DB, cnfType string, name string, val string) (err error) { + var config system.SystemConfig + err = db.Where("type = ? AND name = ?", cnfType, name).First(&config).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + if err = db.Create(&config).Error; err != nil { + return err + } + return nil + } else if err != nil { + return err + } + if err = db.Model(&config).Update("value", val).Error; err != nil { + return err + } + return nil +} diff --git a/server/util/convert.go b/server/util/convert.go new file mode 100644 index 0000000..4256395 --- /dev/null +++ b/server/util/convert.go @@ -0,0 +1,27 @@ +package util + +import ( + "x_admin/core" + + "github.com/fatih/structs" + "github.com/jinzhu/copier" +) + +var ConvertUtil = convertUtil{} + +// convertUtil 转换工具 +type convertUtil struct{} + +// StructsToMaps 将结构体转换成Map列表 +func (cu convertUtil) StructsToMaps(objs interface{}) (data []map[string]interface{}) { + var objList []interface{} + err := copier.Copy(&objList, objs) + if err != nil { + core.Logger.Errorf("convertUtil.StructsToMaps err: err=[%+v]", err) + return nil + } + for _, v := range objList { + data = append(data, structs.Map(v)) + } + return data +} diff --git a/server/util/ip.go b/server/util/ip.go new file mode 100644 index 0000000..502ac15 --- /dev/null +++ b/server/util/ip.go @@ -0,0 +1,23 @@ +package util + +import ( + "net" + "x_admin/core" +) + +var IpUtil = ipUtil{} + +// serverUtil IP工具类 +type ipUtil struct{} + +// GetHostIp 获取本地主机名 +func (su ipUtil) GetHostIp() (ip string) { + conn, err := net.Dial("udp", "114.114.114.114:80") + if err != nil { + core.Logger.Errorf("GetHostIp Dial err: err=[%+v]", err) + return + } + defer conn.Close() + localAddr := conn.LocalAddr().(*net.UDPAddr) + return localAddr.IP.String() +} diff --git a/server/util/redis.go b/server/util/redis.go new file mode 100644 index 0000000..0708baf --- /dev/null +++ b/server/util/redis.go @@ -0,0 +1,214 @@ +package util + +import ( + "bufio" + "context" + "strings" + "time" + "x_admin/config" + "x_admin/core" + + "github.com/go-redis/redis/v9" +) + +var RedisUtil = redisUtil{redis: core.Redis} + +// redisUtil Redis操作工具类 +type redisUtil struct { + redis *redis.Client +} + +// stringToLines string拆分多行 +func stringToLines(s string) (lines []string, err error) { + scanner := bufio.NewScanner(strings.NewReader(s)) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + err = scanner.Err() + return +} + +// stringToKV string拆分key和val +func stringToKV(s string) (string, string) { + ss := strings.Split(s, ":") + if len(ss) < 2 { + return s, "" + } + return ss[0], ss[1] +} + +// Info Redis服务信息 +func (ru redisUtil) Info(sections ...string) (res map[string]string) { + infoStr, err := ru.redis.Info(context.Background(), sections...).Result() + res = map[string]string{} + if err != nil { + core.Logger.Errorf("redisUtil.Info err: err=[%+v]", err) + return res + } + // string拆分多行 + lines, err := stringToLines(infoStr) + if err != nil { + core.Logger.Errorf("stringToLines err: err=[%+v]", err) + return res + } + // 解析成Map + for i := 0; i < len(lines); i++ { + if lines[i] == "" || strings.HasPrefix(lines[i], "# ") { + continue + } + k, v := stringToKV(lines[i]) + res[k] = v + } + return res +} + +// DBSize 当前数据库key数量 +func (ru redisUtil) DBSize() int64 { + size, err := ru.redis.DBSize(context.Background()).Result() + if err != nil { + core.Logger.Errorf("redisUtil.DBSize err: err=[%+v]", err) + return 0 + } + return size +} + +// Set 设置键值对 +func (ru redisUtil) Set(key string, value interface{}, timeSec int) bool { + err := ru.redis.Set(context.Background(), + config.Config.RedisPrefix+key, value, time.Duration(timeSec)*time.Second).Err() + if err != nil { + core.Logger.Errorf("redisUtil.Set err: err=[%+v]", err) + return false + } + return true +} + +// Get 获取key的值 +func (ru redisUtil) Get(key string) string { + res, err := ru.redis.Get(context.Background(), config.Config.RedisPrefix+key).Result() + if err != nil { + core.Logger.Errorf("redisUtil.Get err: err=[%+v]", err) + return "" + } + return res +} + +// SSet 将数据放入set缓存 +func (ru redisUtil) SSet(key string, values ...interface{}) bool { + err := ru.redis.SAdd(context.Background(), config.Config.RedisPrefix+key, values...).Err() + if err != nil { + core.Logger.Errorf("redisUtil.SSet err: err=[%+v]", err) + return false + } + return true +} + +// SGet 根据key获取Set中的所有值 +func (ru redisUtil) SGet(key string) []string { + res, err := ru.redis.SMembers(context.Background(), config.Config.RedisPrefix+key).Result() + if err != nil { + core.Logger.Errorf("redisUtil.SGet err: err=[%+v]", err) + return []string{} + } + return res +} + +// HMSet 设置key, 通过字典的方式设置多个field, value对 +func (ru redisUtil) HMSet(key string, mapping map[string]string, timeSec int) bool { + err := ru.redis.HSet(context.Background(), config.Config.RedisPrefix+key, mapping).Err() + if err != nil { + core.Logger.Errorf("redisUtil.HMSet err: err=[%+v]", err) + return false + } + if timeSec > 0 { + if !ru.Expire(key, timeSec) { + return false + } + } + return true +} + +// HSet 向hash表中放入数据,如果不存在将创建 +func (ru redisUtil) HSet(key string, field string, value string, timeSec int) bool { + return ru.HMSet(key, map[string]string{field: value}, timeSec) +} + +// HGet 获取key中field域的值 +func (ru redisUtil) HGet(key string, field string) string { + res, err := ru.redis.HGet(context.Background(), config.Config.RedisPrefix+key, field).Result() + if err != nil { + core.Logger.Errorf("redisUtil.HGet err: err=[%+v]", err) + return "" + } + return res +} + +// HExists 判断key中有没有field域名 +func (ru redisUtil) HExists(key string, field string) bool { + res, err := ru.redis.HExists(context.Background(), config.Config.RedisPrefix+key, field).Result() + if err != nil { + core.Logger.Errorf("redisUtil.HExists err: err=[%+v]", err) + return false + } + return res +} + +// HDel 删除hash表中的值 +func (ru redisUtil) HDel(key string, fields ...string) bool { + err := ru.redis.HDel(context.Background(), config.Config.RedisPrefix+key, fields...).Err() + if err != nil { + core.Logger.Errorf("redisUtil.HDel err: err=[%+v]", err) + return false + } + return true +} + +// Exists 判断多项key是否存在 +func (ru redisUtil) Exists(keys ...string) int64 { + fullKeys := ru.toFullKeys(keys) + cnt, err := ru.redis.Exists(context.Background(), fullKeys...).Result() + if err != nil { + core.Logger.Errorf("redisUtil.Exists err: err=[%+v]", err) + return -1 + } + return cnt +} + +// Expire 指定缓存失效时间 +func (ru redisUtil) Expire(key string, timeSec int) bool { + err := ru.redis.Expire(context.Background(), config.Config.RedisPrefix+key, time.Duration(timeSec)*time.Second).Err() + if err != nil { + core.Logger.Errorf("redisUtil.Expire err: err=[%+v]", err) + return false + } + return true +} + +// TTL 根据key获取过期时间 +func (ru redisUtil) TTL(key string) int { + td, err := ru.redis.TTL(context.Background(), config.Config.RedisPrefix+key).Result() + if err != nil { + core.Logger.Errorf("redisUtil.TTL err: err=[%+v]", err) + return 0 + } + return int(td / time.Second) +} + +// Del 删除一个或多个键 +func (ru redisUtil) Del(keys ...string) bool { + fullKeys := ru.toFullKeys(keys) + err := ru.redis.Del(context.Background(), fullKeys...).Err() + if err != nil { + core.Logger.Errorf("redisUtil.Del err: err=[%+v]", err) + return false + } + return true +} + +// toFullKeys 为keys批量增加前缀 +func (ru redisUtil) toFullKeys(keys []string) (fullKeys []string) { + for _, k := range keys { + fullKeys = append(fullKeys, config.Config.RedisPrefix+k) + } + return +} diff --git a/server/util/server.go b/server/util/server.go new file mode 100644 index 0000000..a330646 --- /dev/null +++ b/server/util/server.go @@ -0,0 +1,171 @@ +package util + +import ( + "fmt" + "math" + "os" + "runtime" + "strconv" + "strings" + "time" + "x_admin/core" + + "github.com/shirou/gopsutil/cpu" + "github.com/shirou/gopsutil/disk" + "github.com/shirou/gopsutil/host" + "github.com/shirou/gopsutil/mem" + "github.com/shirou/gopsutil/process" +) + +var ServerUtil = serverUtil{} + +// serverUtil 服务器信息获取工具 +type serverUtil struct{} + +// GetFmtSize 按照正确的格式缩放字节 +func (su serverUtil) GetFmtSize(data uint64) string { + var factor float64 = 1024 + res := float64(data) + for _, unit := range []string{"", "K", "M", "G", "T", "P"} { + if res < factor { + return fmt.Sprintf("%.2f%sB", res, unit) + } + res /= factor + } + return fmt.Sprintf("%.2f%sB", res, "P") +} + +// GetFmtTime 格式化显示时间 (毫秒) +func (su serverUtil) GetFmtTime(ms int64) (res string) { + rem := ms / 1000 + days, rem := rem/86400, rem%86400 + hours, rem := rem/3600, rem%3600 + minutes := rem / 60 + res = strconv.FormatInt(minutes, 10) + "分钟" + if hours > 0 { + res = strconv.FormatInt(hours, 10) + "小时" + res + } + if days > 0 { + res = strconv.FormatInt(days, 10) + "天" + res + } + return res +} + +// GetCpuInfo 获取CPU信息 +func (su serverUtil) GetCpuInfo() (data map[string]interface{}) { + cnt, err := cpu.Counts(true) + if err != nil { + core.Logger.Errorf("GetCpuInfo Counts err: err=[%+v]", err) + return data + } + tss, err := cpu.Times(false) + if err != nil { + core.Logger.Errorf("GetCpuInfo Times err: err=[%+v]", err) + return data + } + ts := tss[0] + return map[string]interface{}{ + "cpu_num": cnt, + "total": ToolsUtil.Round(ts.Total(), 2), + "sys": ToolsUtil.Round(ts.System/ts.Total(), 2), + "used": ToolsUtil.Round(ts.User/ts.Total(), 2), + "wait": ToolsUtil.Round(ts.Iowait/ts.Total(), 2), + "free": ToolsUtil.Round(ts.Idle/ts.Total(), 2), + } +} + +// GetMemInfo 获取内存信息 +func (su serverUtil) GetMemInfo() (data map[string]interface{}) { + number := math.Pow(1024, 3) + vm, err := mem.VirtualMemory() + if err != nil { + core.Logger.Errorf("GetMemInfo VirtualMemory err: err=[%+v]", err) + return data + } + return map[string]interface{}{ + "total": ToolsUtil.Round(float64(vm.Total)/number, 2), + "used": ToolsUtil.Round(float64(vm.Used)/number, 2), + "free": ToolsUtil.Round(float64(vm.Available)/number, 2), + "usage": ToolsUtil.Round(vm.UsedPercent, 2), + } +} + +// GetSysInfo 获取服务器信息 +func (su serverUtil) GetSysInfo() (data map[string]interface{}) { + infoStat, err := host.Info() + if err != nil { + core.Logger.Errorf("GetSysInfo Info err: err=[%+v]", err) + return data + } + pwd, err := os.Getwd() + if err != nil { + core.Logger.Errorf("GetSysInfo Getwd err: err=[%+v]", err) + return data + } + return map[string]interface{}{ + "computerName": infoStat.Hostname, + "computerIp": IpUtil.GetHostIp(), + "userDir": pwd, + "osName": infoStat.OS, + "osArch": infoStat.KernelArch, + } +} + +// GetDiskInfo 获取磁盘信息 +func (su serverUtil) GetDiskInfo() (data []map[string]interface{}) { + partStats, err := disk.Partitions(false) + if err != nil { + core.Logger.Errorf("GetDiskInfo Partitions err: err=[%+v]", err) + return data + } + for i := 0; i < len(partStats); i++ { + part := partStats[i] + usage, uErr := disk.Usage(part.Mountpoint) + if uErr != nil { + core.Logger.Errorf("GetDiskInfo Usage err: err=[%+v]", err) + continue + } + data = append(data, map[string]interface{}{ + "dirName": part.Mountpoint, + "sysTypeName": part.Fstype, + "typeName": part.Device, + "total": su.GetFmtSize(usage.Total), + "free": su.GetFmtSize(usage.Free), + "used": su.GetFmtSize(usage.Used), + "usage": ToolsUtil.Round(usage.UsedPercent, 2), + }) + } + return data +} + +// GetGoInfo 获取Go环境及服务信息 +func (su serverUtil) GetGoInfo() (data map[string]interface{}) { + number := math.Pow(1024, 2) + curProc, err := process.NewProcess(int32(os.Getpid())) + if err != nil { + core.Logger.Errorf("GetGoInfo NewProcess err: err=[%+v]", err) + return data + } + memInfo, err := curProc.MemoryInfo() + if err != nil { + core.Logger.Errorf("GetGoInfo MemoryInfo err: err=[%+v]", err) + return data + } + startTime, err := curProc.CreateTime() + if err != nil { + core.Logger.Errorf("GetGoInfo CreateTime err: err=[%+v]", err) + return data + } + return map[string]interface{}{ + "name": "Go", + "version": runtime.Version(), + "home": os.Args[0], + "inputArgs": fmt.Sprintf("[%s]", strings.Join(os.Args[1:], ", ")), + "total": ToolsUtil.Round(float64(memInfo.VMS)/number, 2), + "max": ToolsUtil.Round(float64(memInfo.VMS)/number, 2), + "free": ToolsUtil.Round((float64(memInfo.VMS-memInfo.RSS))/number, 2), + "usage": ToolsUtil.Round(float64(memInfo.RSS)/number, 2), + "runTime": su.GetFmtTime(time.Now().UnixMilli() - startTime), + "startTime": time.UnixMilli(startTime).Format(core.TimeFormat), + } +} diff --git a/server/util/string.go b/server/util/string.go new file mode 100644 index 0000000..208acc8 --- /dev/null +++ b/server/util/string.go @@ -0,0 +1,34 @@ +package util + +import ( + "bytes" + "strings" + "unicode" +) + +var StringUtil = stringUtil{} + +//arrayUtil 数组工具类 +type stringUtil struct{} + +func (su stringUtil) ToSnakeCase(s string) string { + buf := bytes.Buffer{} + for i, r := range s { + if unicode.IsUpper(r) { + if i > 0 { + buf.WriteRune('_') + } + buf.WriteRune(unicode.ToLower(r)) + } else { + buf.WriteRune(r) + } + } + return buf.String() +} +func (su stringUtil) ToCamelCase(s string) string { + words := strings.Split(s, "_") + for i := 1; i < len(words); i++ { + words[i] = strings.Title(words[i]) + } + return strings.Join(words, "") +} diff --git a/server/util/tools.go b/server/util/tools.go new file mode 100644 index 0000000..b57611f --- /dev/null +++ b/server/util/tools.go @@ -0,0 +1,97 @@ +package util + +import ( + "crypto/md5" + "encoding/hex" + "encoding/json" + "math" + "math/rand" + "os" + "reflect" + "strconv" + "strings" + "time" + "x_admin/config" + + "github.com/google/uuid" +) + +var ( + ToolsUtil = toolsUtil{} + allRandomStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +) + +// toolsUtil 常用工具集合类 +type toolsUtil struct{} + +// RandomString 返回随机字符串 +func (tu toolsUtil) RandomString(length int) string { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + byteList := make([]byte, length) + for i := 0; i < length; i++ { + byteList[i] = allRandomStr[r.Intn(62)] + } + return string(byteList) +} + +// MakeUuid 制作UUID +func (tu toolsUtil) MakeUuid() string { + return strings.ReplaceAll(uuid.New().String(), "-", "") +} + +// MakeMd5 制作MD5 +func (tu toolsUtil) MakeMd5(data string) string { + sum := md5.Sum([]byte(data)) + return hex.EncodeToString(sum[:]) +} + +// MakeToken 生成唯一Token +func (tu toolsUtil) MakeToken() string { + ms := time.Now().UnixMilli() + token := tu.MakeMd5(tu.MakeUuid() + strconv.FormatInt(ms, 10) + tu.RandomString(8)) + tokenSecret := token + config.Config.Secret + return tu.MakeMd5(tokenSecret) + tu.RandomString(6) +} + +// Contains 判断src是否包含elem元素 +func (tu toolsUtil) Contains(src interface{}, elem interface{}) bool { + srcArr := reflect.ValueOf(src) + if srcArr.Kind() == reflect.Ptr { + srcArr = srcArr.Elem() + } + if srcArr.Kind() == reflect.Slice { + for i := 0; i < srcArr.Len(); i++ { + if srcArr.Index(i).Interface() == elem { + return true + } + } + } + return false +} + +// Round float四舍五入 +func (tu toolsUtil) Round(val float64, n int) float64 { + base := math.Pow(10, float64(n)) + return math.Round(base*val) / base +} + +// JsonToObj JSON转Obj +func (tu toolsUtil) JsonToObj(jsonStr string, toVal interface{}) (err error) { + return json.Unmarshal([]byte(jsonStr), &toVal) +} + +// ObjToJson Obj转JSON +func (tu toolsUtil) ObjToJson(data interface{}) (res string, err error) { + b, err := json.Marshal(data) + if err != nil { + return res, err + } + res = string(b) + return res, nil +} + +// IsFileExist 判断文件或目录是否存在 +func (tu toolsUtil) IsFileExist(path string) bool { + _, err := os.Stat(path) + return err == nil || os.IsExist(err) +} diff --git a/server/util/url.go b/server/util/url.go new file mode 100644 index 0000000..7727cde --- /dev/null +++ b/server/util/url.go @@ -0,0 +1,63 @@ +package util + +import ( + "net/url" + "path" + "strings" + "x_admin/config" + "x_admin/core" +) + +var ( + UrlUtil = urlUtil{} + publicUrl = config.Config.PublicUrl + publicPrefix = config.Config.PublicPrefix +) + +// urlUtil 文件路径处理工具 +type urlUtil struct{} + +// ToAbsoluteUrl 转绝对路径 +func (uu urlUtil) ToAbsoluteUrl(u string) string { + // TODO: engine默认local + if u == "" { + return "" + } + up, err := url.Parse(publicUrl) + if err != nil { + core.Logger.Errorf("ToAbsoluteUrl Parse err: err=[%+v]", err) + return u + } + if strings.HasPrefix(u, "/api/static/") { + up.Path = path.Join(up.Path, u) + return up.String() + } + engine := "local" + if engine == "local" { + up.Path = path.Join(up.Path, publicPrefix, u) + return up.String() + } + // TODO: 其他engine + return u +} + +func (uu urlUtil) ToRelativeUrl(u string) string { + // TODO: engine默认local + if u == "" { + return "" + } + up, err := url.Parse(u) + if err != nil { + core.Logger.Errorf("ToRelativeUrl Parse err: err=[%+v]", err) + return u + } + engine := "local" + if engine == "local" { + lu := up.String() + return strings.Replace( + strings.Replace(lu, publicUrl, "", 1), + publicPrefix, "", 1) + } + // TODO: 其他engine + return u +} diff --git a/server/util/verify.go b/server/util/verify.go new file mode 100644 index 0000000..9b98eb3 --- /dev/null +++ b/server/util/verify.go @@ -0,0 +1,71 @@ +package util + +import ( + "encoding/json" + "io" + "mime/multipart" + "x_admin/core/response" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" +) + +var VerifyUtil = verifyUtil{} + +// verifyUtil 参数验证工具类 +type verifyUtil struct{} + +func (vu verifyUtil) VerifyJSON(c *gin.Context, obj any) (e error) { + if err := c.ShouldBindBodyWith(obj, binding.JSON); err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} + +func (vu verifyUtil) VerifyJSONArray(c *gin.Context, obj any) (e error) { + body, err := io.ReadAll(c.Request.Body) + if err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + err = json.Unmarshal(body, &obj) + if err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} + +func (vu verifyUtil) VerifyBody(c *gin.Context, obj any) (e error) { + if err := c.ShouldBind(obj); err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} + +func (vu verifyUtil) VerifyHeader(c *gin.Context, obj any) (e error) { + if err := c.ShouldBindHeader(obj); err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} + +func (vu verifyUtil) VerifyQuery(c *gin.Context, obj any) (e error) { + if err := c.ShouldBindQuery(obj); err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} + +func (vu verifyUtil) VerifyFile(c *gin.Context, name string) (file *multipart.FileHeader, e error) { + file, err := c.FormFile(name) + if err != nil { + e = response.ParamsValidError.MakeData(err.Error()) + return + } + return +} diff --git a/sql/x_admin.sql b/sql/x_admin.sql new file mode 100644 index 0000000..946aeab --- /dev/null +++ b/sql/x_admin.sql @@ -0,0 +1,826 @@ +/* + Navicat Premium Data Transfer + + Source Server : likeadmin + Source Server Type : MySQL + Source Server Version : 50726 (5.7.26-log) + Source Host : localhost:3306 + Source Schema : likeadmin + + Target Server Type : MySQL + Target Server Version : 50726 (5.7.26-log) + File Encoding : 65001 + + Date: 21/11/2023 10:12:07 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for x_album +-- ---------------------------- +DROP TABLE IF EXISTS `x_album`; +CREATE TABLE `x_album` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `cid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '类目ID', + `aid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '管理员ID', + `uid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID', + `type` tinyint(2) UNSIGNED NOT NULL DEFAULT 10 COMMENT '文件类型: [10=图片, 20=视频]', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件名称', + `uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件路径', + `ext` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件扩展', + `size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件大小', + `is_delete` int(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_cid`(`cid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '相册管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_album +-- ---------------------------- +INSERT INTO `x_album` VALUES (1, 0, 1, 0, 10, 'Alx_gp73pq.png', 'image/20230911/34a557325c004f498b1da01bb068f919.png', 'png', 7138309, 0, 1699499781, 1699499781, 0); +INSERT INTO `x_album` VALUES (2, 0, 1, 0, 20, '素材中心 和另外 1 个页面 - 个人 - Microsoft​ Edge 2023-11-20 15-37-39.mp4', 'video/20232011/e5f53b824e314ab7992ef4b6e7595b86.mp4', 'mp4', 4053956, 0, 1700465870, 1700465870, 0); + +-- ---------------------------- +-- Table structure for x_album_cate +-- ---------------------------- +DROP TABLE IF EXISTS `x_album_cate`; +CREATE TABLE `x_album_cate` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID', + `type` tinyint(2) UNSIGNED NOT NULL DEFAULT 10 COMMENT '类型: [10=图片, 20=视频]', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: [0=否, 1=是]', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '相册分类表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_album_cate +-- ---------------------------- +INSERT INTO `x_album_cate` VALUES (1, 0, 10, '1', 0, 1699519913, 1699519913, 0); + +-- ---------------------------- +-- Table structure for x_article +-- ---------------------------- +DROP TABLE IF EXISTS `x_article`; +CREATE TABLE `x_article` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `cid` int(10) UNSIGNED NOT NULL COMMENT '分类', + `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题', + `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简介', + `summary` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '摘要', + `image` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '封面', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', + `author` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作者', + `visit` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '浏览', + `sort` int(10) UNSIGNED NOT NULL DEFAULT 50 COMMENT '排序', + `is_show` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否显示: 0=否, 1=是', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `cid_idx`(`cid`) USING BTREE COMMENT '分类索引' +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章资讯表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_article +-- ---------------------------- +INSERT INTO `x_article` VALUES (1, 1, '让生活更精致!五款居家好物推荐,实用性超高', '##好物推荐🔥', '随着当代生活节奏的忙碌,很多人在闲暇之余都想好好的享受生活。随着科技的发展,也出现了越来越多可以帮助我们提升幸福感,让生活变得更精致的产品,下面周周就给大家盘点五款居家必备的好物,都是实用性很高的产品,周周可以保证大家买了肯定会喜欢。', '/api/static/article01.png', '

    \"\"

    拥有一台投影仪,闲暇时可以在家里直接看影院级别的大片,光是想想都觉得超级爽。市面上很多投影仪大几千,其实周周觉得没必要,选泰捷这款一千多的足够了,性价比非常高。

    泰捷的专业度很高,在电视TV领域研发已经十年,有诸多专利和技术创新,荣获国内外多项技术奖项,拿下了腾讯创新工场投资,打造的泰捷视频TV端和泰捷电视盒子都获得了极高评价。

    这款投影仪的分辨率在3000元内无敌,做到了真1080P高分辨率,也就是跟市场售价三千DLP投影仪一样的分辨率,真正做到了分毫毕现,像桌布的花纹、天空的云彩等,这些细节都清晰可见。

    亮度方面,泰捷达到了850ANSI流明,同价位一般是200ANSI。这是因为泰捷为了提升亮度和LCD技术透射率低的问题,首创高功率LED灯源,让其亮度做到同价位最好。专业媒体也进行了多次对比,效果与3000元价位投影仪相当。

    操作系统周周也很喜欢,完全不卡。泰捷作为资深音视频品牌,在系统优化方面有十年的研发经验,打造出的“零极”系统是业内公认效率最高、速度最快的系统,用户也评价它流畅度能一台顶三台,而且为了解决行业广告多这一痛点,系统内不植入任何广告。

    ', '红花', 9, 0, 1, 0, 1663317759, 1663322726, 0); +INSERT INTO `x_article` VALUES (2, 1, '埋葬UI设计师的坟墓不是内卷,而是免费模式', '', '本文从另外一个角度,聊聊作者对UI设计师职业发展前景的担忧,欢迎从事UI设计的同学来参与讨论,会有赠书哦', '/api/static/article02.jpeg', '


    一个职业,卷,根本就没什么大不了的,尤其是成熟且收入高的职业,不卷才不符合事物发展的规律。何况 UI 设计师的人力市场到今天也和 5 年前一样,还是停留在大型菜鸡互啄的场面。远不能和医疗、证券、教师或者演艺练习生相提并论。

    国内互联网市场的发展,是一部浩瀚的 “免费经济” 发展史。虽然今天免费已经是深入国内民众骨髓的认知,但最早的中文互联网也是需要付费的,网游也都是要花钱的。

    只是自有国情在此,付费确实阻碍了互联网行业的扩张和普及,一批创业家就开始通过免费的模式为用户提供服务,从而扩大了自己的产品覆盖面和普及程度。

    印象最深的就是免费急先锋周鸿祎,和现在鲜少出现在公众视野不同,一零年前他是当之无愧的互联网教主,因为他开发出了符合中国国情的互联网产品 “打法”,让 360 的发展如日中天。

    就是他在自传中提到:

    只要是在互联网上每个人都需要的服务,我们就认为它是基础服务,基础服务一定是免费的,这样的话不会形成价值歧视。就是说,只要这种服务是每个人都一定要用的,我一定免费提供,而且是无条件免费。增值服务不是所有人都需要的,这个比例可能会相当低,它只是百分之几甚至更少比例的人需要,所以这种服务一定要收费……

    这就是互联网的游戏规则,它决定了要想建立一个有效的商业模式,就一定要有海量的用户基数……

    ', '一一', 23, 0, 1, 0, 1663320938, 1663322854, 0); +INSERT INTO `x_article` VALUES (3, 2, '金山电池公布“沪广深市民绿色生活方式”调查结果', '', '60%以上受访者认为高质量的10分钟足以完成“自我充电”', '/api/static/article03.png', '

    深圳,2021年10月22日)生活在一线城市的沪广深市民一向以效率见称,工作繁忙和快节奏的生活容易缺乏充足的休息。近日,一项针对沪广深市民绿色生活方式而展开的网络问卷调查引起了大家的注意。问卷的问题设定集中于市民对休息时间的看法,以及从对循环充电电池的使用方面了解其对绿色生活方式的态度。该调查采用随机抽样的模式,并对最终收集的1,500份有效问卷进行专业分析后发现,超过60%的受访者表示,在每天的工作时段能拥有10分钟高质量的休息时间,就可以高效“自我充电”。该调查结果反映出,在快节奏时代下,人们需要高质量的休息时间,也要学会利用高效率的休息方式和工具来应对快节奏的生活,以时刻保持“满电”状态。

      60%以上受访者认为高质量的10分钟足以完成“自我充电”

      这次调查超过1,500人,主要聚焦18至85岁的沪广深市民,了解他们对于休息时间的观念及使用充电电池的习惯,结果发现:

      · 90%以上有工作受访者每天工作时间在7小时以上,平均工作时间为8小时,其中43%以上的受访者工作时间超过9小时

      · 70%受访者认为在工作期间拥有10分钟“自我充电”时间不是一件困难的事情

      · 60%受访者认为在工作期间有10分钟休息时间足以为自己快速充电

      临床心理学家黄咏诗女士在发布会上分享为自己快速充电的实用技巧,她表示:“事实上,只要选择正确的休息方法,10分钟也足以为自己充电。以喝咖啡为例,我们可以使用心灵休息法 ── 静观呼吸,慢慢感受咖啡的温度和气味,如果能配合着聆听流水或海洋的声音,能够有效放松大脑及心灵。”

      这次调查结果反映出沪广深市民的希望在繁忙的工作中适时停下来,抽出10分钟喝杯咖啡、聆听音乐或小睡片刻,为自己充电。金山电池全新推出的“绿再十分充”超快速充电器仅需10分钟就能充好电,喝一杯咖啡的时间既能完成“自我充电”,也满足设备使用的用电需求,为提升工作效率和放松身心注入新能量。

      金山电池推出10分钟超快电池充电器*绿再十分充,以创新科技为市场带来革新体验

      该问卷同时从沪广深市民对循环充电电池的使用方面进行了调查,以了解其对绿色生活方式的态度:

      · 87%受访者目前没有使用充电电池,其中61%表示会考虑使用充电电池

      · 58%受访者过往曾使用过充电电池,却只有20%左右市民仍在使用

      · 60%左右受访者认为充电电池尚未被广泛使用,主要障碍来自于充电时间过长、缺乏相关教育

      · 90%以上受访者认为充电电池充满电需要1小时或更长的时间

      金山电池一直致力于为大众提供安全可靠的充电电池,并与消费者的需求和生活方式一起演变及进步。今天,金山电池宣布推出10分钟超快电池充电器*绿再十分充,只需10分钟*即可将4粒绿再十分充充电电池充好电,充电速度比其他品牌提升3倍**。充电器的LED灯可以显示每粒电池的充电状态和模式,并提示用户是否错误插入已损坏电池或一次性电池。尽管其体型小巧,却具备多项创新科技 ,如拥有独特的充电算法以优化充电电流,并能根据各个电池类型、状况和温度用最短的时间为充电电池充好电;绿再十分充内置横流扇,有效防止电池温度过热和提供低噪音的充电环境等。

    ', '中网资讯科技', 3, 0, 1, 0, 1663322665, 1663322665, 0); + +-- ---------------------------- +-- Table structure for x_article_category +-- ---------------------------- +DROP TABLE IF EXISTS `x_article_category`; +CREATE TABLE `x_article_category` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 50 COMMENT '排序', + `is_show` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示: 0=否, 1=是', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章分类表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_article_category +-- ---------------------------- +INSERT INTO `x_article_category` VALUES (1, '文章资讯', 0, 1, 0, 1663317280, 1663317282, 0); +INSERT INTO `x_article_category` VALUES (2, '社会热点', 0, 1, 0, 1663321464, 1663321494, 0); + +-- ---------------------------- +-- Table structure for x_article_collect +-- ---------------------------- +DROP TABLE IF EXISTS `x_article_collect`; +CREATE TABLE `x_article_collect` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID', + `article_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '文章ID', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文章收藏表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_article_collect +-- ---------------------------- +INSERT INTO `x_article_collect` VALUES (1, 0, 0, 1, 0, 0, 0); +INSERT INTO `x_article_collect` VALUES (5, 1, 1, 1, 0, 0, 0); + +-- ---------------------------- +-- Table structure for x_decorate_page +-- ---------------------------- +DROP TABLE IF EXISTS `x_decorate_page`; +CREATE TABLE `x_decorate_page` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `page_type` tinyint(2) UNSIGNED NOT NULL DEFAULT 10 COMMENT '页面类型', + `page_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面名称', + `page_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '页面数据', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '页面装修表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_decorate_page +-- ---------------------------- +INSERT INTO `x_decorate_page` VALUES (1, 1, '商城首页', '[{\"title\":\"搜索\",\"name\":\"search\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"首页轮播图\",\"name\":\"banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/api/static/banner01.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/index/index\",\"name\":\"商城首页\",\"type\":\"shop\"}},{\"image\":\"/api/static/banner02.png\",\"name\":\"\",\"link\":{}}]},\"styles\":{}},{\"title\":\"导航菜单\",\"name\":\"nav\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/api/static/nav01.png\",\"name\":\"资讯中心\",\"link\":{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\"}},{\"image\":\"/api/static/nav02.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"}},{\"image\":\"/api/static/nav03.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"}},{\"image\":\"/api/static/nav04.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"}},{\"image\":\"/api/static/nav05.png\",\"name\":\"关于我们\",\"link\":{\"path\":\"/pages/as_us/as_us\",\"name\":\"关于我们\",\"type\":\"shop\"}}]},\"styles\":{}},{\"id\":\"l84almsk2uhyf\",\"title\":\"资讯\",\"name\":\"news\",\"disabled\":1,\"content\":{},\"styles\":{}}]', 1661757188, 1663321380); +INSERT INTO `x_decorate_page` VALUES (2, 2, '个人中心', '[{\"title\":\"用户信息\",\"name\":\"user-info\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"我的服务\",\"name\":\"my-service\",\"content\":{\"style\":2,\"title\":\"服务中心\",\"data\":[{\"image\":\"/api/static/user_collect.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"}},{\"image\":\"/api/static/user_setting.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"}},{\"image\":\"/api/static/user_kefu.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"}}]},\"styles\":{}},{\"title\":\"个人中心广告图\",\"name\":\"user-banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/api/static/ad01.jpg\",\"name\":\"\",\"link\":{}}]},\"styles\":{}}]', 1661757188, 1663320728); +INSERT INTO `x_decorate_page` VALUES (3, 3, '客服设置', '[{\"title\":\"客服设置\",\"name\":\"customer-service\",\"content\":{\"title\":\"添加客服二维码\",\"time\":\"早上 9:00 - 22:00\",\"mobile\":\"13800138000\",\"qrcode\":\"\"},\"styles\":{}}]', 1661757188, 1662689155); + +-- ---------------------------- +-- Table structure for x_decorate_tabbar +-- ---------------------------- +DROP TABLE IF EXISTS `x_decorate_tabbar`; +CREATE TABLE `x_decorate_tabbar` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '导航名称', + `selected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '未选图标', + `unselected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '已选图标', + `link` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '链接地址', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '底部装修表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_decorate_tabbar +-- ---------------------------- +INSERT INTO `x_decorate_tabbar` VALUES (13, '首页', '/api/static/tabbar_home_sel.png', '/api/static/tabbar_home.png', '{\"path\":\"/pages/index/index\",\"name\":\"商城首页\",\"type\":\"shop\"}', 1662688157, 1662688157); +INSERT INTO `x_decorate_tabbar` VALUES (14, '资讯', '/api/static/tabbar_text_sel.png', '/api/static/tabbar_text.png', '{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\"}', 1662688157, 1662688157); +INSERT INTO `x_decorate_tabbar` VALUES (15, '我的', '/api/static/tabbar_me_sel.png', '/api/static/tabbar_me.png', '{\"path\":\"/pages/user/user\",\"name\":\"个人中心\",\"type\":\"shop\"}', 1662688157, 1662688157); + +-- ---------------------------- +-- Table structure for x_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `x_dict_data`; +CREATE TABLE `x_dict_data` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `type_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '类型', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '键名', + `value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数值', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '备注', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序', + `status` tinyint(1) NOT NULL COMMENT '状态: 0=停用, 1=正常', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_dict_data +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `x_dict_type`; +CREATE TABLE `x_dict_type` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `dict_remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '字典备注', + `dict_status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '字典状态: 0=停用, 1=正常', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_dict_type +-- ---------------------------- +INSERT INTO `x_dict_type` VALUES (1, 'a', 'a', 'a', 1, 0, 1699343341, 1699343341, 0); + +-- ---------------------------- +-- Table structure for x_gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `x_gen_table`; +CREATE TABLE `x_gen_table` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关联表名称', + `sub_table_fk` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关联表外键', + `author_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作者的名称', + `entity_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '实体的名称', + `module_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '生成模块名', + `function_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '生成功能名', + `tree_primary` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '树主键字段', + `tree_parent` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '树父级字段', + `tree_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '树显示字段', + `gen_tpl` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'crud' COMMENT '生成模板方式: [crud=单表, tree=树表]', + `gen_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '生成代码方式: [0=zip压缩包, 1=自定义路径]', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '/' COMMENT '生成代码路径: [不填默认项目路径]', + `remarks` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注信息', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_gen_table +-- ---------------------------- +INSERT INTO `x_gen_table` VALUES (10, 'x_article_collect', '文章收藏表', '', '', '', 'articleCollect', 'article_collect', '文章收藏', '', '', '', 'crud', 0, '/', '', 1700321456, 1700449469); + +-- ---------------------------- +-- Table structure for x_gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `x_gen_table_column`; +CREATE TABLE `x_gen_table_column` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '列主键', + `table_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '表外键', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '列名称', + `column_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '列描述', + `column_length` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '列长度', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '列类型 ', + `go_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT 'JAVA类型', + `go_field` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'JAVA字段', + `is_pk` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否主键: [1=是, 0=否]', + `is_increment` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否自增: [1=是, 0=否]', + `is_required` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否必填: [1=是, 0=否]', + `is_insert` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否插入字段: [1=是, 0=否]', + `is_edit` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否编辑字段: [1=是, 0=否]', + `is_list` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否列表字段: [1=是, 0=否]', + `is_query` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否查询字段: [1=是, 0=否]', + `query_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'EQ' COMMENT '查询方式: [等于、不等于、大于、小于、范围]', + `html_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '显示类型: [文本框、文本域、下拉框、复选框、单选框、日期控件]', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序编号', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 91 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成字段表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_gen_table_column +-- ---------------------------- +INSERT INTO `x_gen_table_column` VALUES (84, 10, 'id', '主键', '10', 'int', 'int', 'id', 1, 1, 0, 0, 0, 0, 0, '=', 'input', '', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (85, 10, 'user_id', '用户ID', '10', 'int', 'int', 'user_id', 0, 0, 1, 1, 1, 1, 1, '=', 'select', 'a', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (86, 10, 'article_id', '文章ID', '10', 'int', 'int', 'article_id', 0, 0, 1, 1, 1, 1, 1, '=', 'input', '', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (87, 10, 'is_delete', '是否删除', '1', 'tinyint', 'int', 'is_delete', 0, 0, 0, 0, 0, 0, 0, '=', 'input', '', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (88, 10, 'create_time', '创建时间', '10', 'int', 'core.TsTime', 'create_time', 0, 0, 0, 0, 0, 1, 0, '=', 'datetime', '', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (89, 10, 'update_time', '更新时间', '10', 'int', 'core.TsTime', 'update_time', 0, 0, 0, 0, 0, 1, 0, '=', 'datetime', '', 0, 0, 1700449469); +INSERT INTO `x_gen_table_column` VALUES (90, 10, 'delete_time', '是否删除', '10', 'int', 'core.TsTime', 'delete_time', 0, 0, 0, 0, 0, 0, 0, '=', 'datetime', '', 0, 0, 1700449469); + +-- ---------------------------- +-- Table structure for x_hot_search +-- ---------------------------- +DROP TABLE IF EXISTS `x_hot_search`; +CREATE TABLE `x_hot_search` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关键词', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '热门搜索配置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_hot_search +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_notice_setting +-- ---------------------------- +DROP TABLE IF EXISTS `x_notice_setting`; +CREATE TABLE `x_notice_setting` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `scene` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '场景编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '场景名称', + `remarks` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '场景描述', + `recipient` tinyint(1) NOT NULL DEFAULT 1 COMMENT '接收人员: [1=用户, 2=平台]', + `type` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '通知类型: [1=业务, 2=验证]', + `system_notice` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '系统的通知设置', + `sms_notice` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '短信的通知设置', + `oa_notice` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '公众号通知设置', + `mnp_notice` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '小程序通知设置', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息通知设置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_notice_setting +-- ---------------------------- +INSERT INTO `x_notice_setting` VALUES (1, 101, '登录验证码', '用户手机号码登录时发送', 1, 2, '{}', '{\"type\":\"sms\",\"templateId\":\"SMS_222458159\",\"content\":\"您正在登录,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"tips\":[\"可选变量 验证码:code\",\"示例:您正在登录,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"生效条件:1、管理后台完成短信设置。2、第三方短信平台申请模板。\"],\"status\":\"1\"}', '{}', '{}', 0, 1648696695, 1648696695, 0); +INSERT INTO `x_notice_setting` VALUES (2, 102, '绑定手机验证码', '用户绑定手机号码时发送', 1, 2, '{}', '{\"type\":\"sms\",\"templateId\":\"SMS_175615069\",\"content\":\"您正在绑定手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"tips\":[\"可选变量 验证码:code\",\"示例:您正在绑定手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"生效条件:1、管理后台完成短信设置。2、第三方短信平台申请模板。\"],\"status\":\"1\"}', '{}', '{}', 0, 1648696695, 1648696695, 0); +INSERT INTO `x_notice_setting` VALUES (3, 103, '变更手机验证码', '用户变更手机号码时发送', 1, 2, '{}', '{\"type\":\"sms\",\"templateId\":\"SMS_207952628\",\"content\":\"您正在变更手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"tips\":[\"可选变量 验证码:code\",\"示例:您正在变更手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"生效条件:1、管理后台完成短信设置。2、第三方短信平台申请模板。\"],\"status\":\"1\"}', '{}', '{}', 0, 1648696695, 1648696695, 0); +INSERT INTO `x_notice_setting` VALUES (4, 104, '找回登录密码验证码', '用户找回登录密码号码时发送', 1, 2, '{}', '{\"type\":\"sms\",\"templateId\":\"SMS_175615069\",\"content\":\"您正在找回登录密码,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"tips\":[\"可选变量 验证码:code\",\"示例:您正在找回登录密码,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"条验证码有效期5分钟。\"],\"status\":\"1\"}', '{}', '{}', 0, 1648696695, 1648696695, 0); + +-- ---------------------------- +-- Table structure for x_official_reply +-- ---------------------------- +DROP TABLE IF EXISTS `x_official_reply`; +CREATE TABLE `x_official_reply` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '规则名', + `keyword` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关键词', + `reply_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复类型: [1=关注回复 2=关键字回复, 3=默认回复]', + `matching_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '匹配方式: [1=全匹配, 2=模糊匹配]', + `content_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '内容类型: [1=文本]', + `status` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '启动状态: [1=启动, 0=关闭]', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '回复内容', + `sort` int(11) UNSIGNED NOT NULL DEFAULT 50 COMMENT '排序编号', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除', + `create_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '公众号的回复表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_official_reply +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_product +-- ---------------------------- +DROP TABLE IF EXISTS `x_product`; +CREATE TABLE `x_product` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '产品名称', + `category` int(11) UNSIGNED NOT NULL COMMENT '产品分类', + `pics` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + PRIMARY KEY (`id`) USING BTREE, + FULLTEXT INDEX `name`(`name`) +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of x_product +-- ---------------------------- +INSERT INTO `x_product` VALUES (1, 'aaa', 2, '11'); +INSERT INTO `x_product` VALUES (2, 'a', 0, '3'); + +-- ---------------------------- +-- Table structure for x_system_auth_admin +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_admin`; +CREATE TABLE `x_system_auth_admin` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `dept_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID', + `post_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '岗位ID', + `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号', + `nickname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码', + `avatar` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像', + `role` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '角色主键', + `salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '加密盐巴', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序编号', + `is_multipoint` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '多端登录: 0=否, 1=是', + `is_disable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否禁用: 0=否, 1=是', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `last_login_ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最后登录IP', + `last_login_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后登录', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统管理成员表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_admin +-- ---------------------------- +INSERT INTO `x_system_auth_admin` VALUES (1, 1, 0, 'admin', 'admin', '7fac2474740becfaf1ecbdd6cc8fb076', '/api/static/backend_avatar.png', '0', '5Xar0', 0, 1, 0, 0, '127.0.0.1', 1700462131, 1642321599, 1700462131, 0); + +-- ---------------------------- +-- Table structure for x_system_auth_dept +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_dept`; +CREATE TABLE `x_system_auth_dept` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级主键', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '部门名称', + `duty` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '负责人名', + `mobile` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '联系电话', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序编号', + `is_stop` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否禁用: 0=否, 1=是', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统部门管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_dept +-- ---------------------------- +INSERT INTO `x_system_auth_dept` VALUES (1, 0, '默认部门', '康明', '18327647788', 10, 0, 0, 1649841995, 1660190949, 0); + +-- ---------------------------- +-- Table structure for x_system_auth_menu +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_menu`; +CREATE TABLE `x_system_auth_menu` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级菜单', + `menu_type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限类型: M=目录,C=菜单,A=按钮', + `menu_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '菜单名称', + `menu_icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '菜单图标', + `menu_sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '菜单排序', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限标识', + `paths` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '前端组件', + `selected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '选中路径', + `params` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '路由参数', + `is_cache` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否缓存: 0=否, 1=是', + `is_show` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示: 0=否, 1=是', + `is_disable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否禁用: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 778 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统菜单管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_menu +-- ---------------------------- +INSERT INTO `x_system_auth_menu` VALUES (1, 0, 'C', '工作台', 'el-icon-Monitor', 50, 'common:index:console', 'workbench', 'workbench/index', '', '', 1, 1, 0, 1650341765, 1668672757); +INSERT INTO `x_system_auth_menu` VALUES (100, 0, 'M', '权限管理', 'el-icon-Lock', 44, '', 'permission', '', '', '', 0, 1, 0, 1650341765, 1662626201); +INSERT INTO `x_system_auth_menu` VALUES (101, 100, 'C', '管理员', 'local-icon-wode', 0, 'system:admin:list', 'admin', 'permission/admin/index', '', '', 1, 1, 0, 1650341765, 1663301404); +INSERT INTO `x_system_auth_menu` VALUES (102, 101, 'A', '管理员详情', '', 0, 'system:admin:detail', '', '', '', '', 0, 1, 0, 1650341765, 1660201785); +INSERT INTO `x_system_auth_menu` VALUES (103, 101, 'A', '管理员新增', '', 0, 'system:admin:add', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (104, 101, 'A', '管理员编辑', '', 0, 'system:admin:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (105, 101, 'A', '管理员删除', '', 0, 'system:admin:del', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (106, 101, 'A', '管理员状态', '', 0, 'system:admin:disable', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (110, 100, 'C', '角色管理', 'el-icon-Female', 0, 'system:role:list', 'role', 'permission/role/index', '', '', 1, 1, 0, 1650341765, 1663301451); +INSERT INTO `x_system_auth_menu` VALUES (111, 110, 'A', '角色详情', '', 0, 'system:role:detail', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (112, 110, 'A', '角色新增', '', 0, 'system:role:add', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (113, 110, 'A', '角色编辑', '', 0, 'system:role:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (114, 110, 'A', '角色删除', '', 0, 'system:role:del', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (120, 100, 'C', '菜单管理', 'el-icon-Operation', 0, 'system:menu:list', 'menu', 'permission/menu/index', '', '', 1, 1, 0, 1650341765, 1663301388); +INSERT INTO `x_system_auth_menu` VALUES (121, 120, 'A', '菜单详情', '', 0, 'system:menu:detail', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (122, 120, 'A', '菜单新增', '', 0, 'system:menu:add', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (123, 120, 'A', '菜单编辑', '', 0, 'system:menu:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (124, 120, 'A', '菜单删除', '', 0, 'system:menu:del', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (130, 0, 'M', '组织管理', 'el-icon-OfficeBuilding', 45, '', 'organization', '', '', '', 0, 1, 0, 1650341765, 1664416715); +INSERT INTO `x_system_auth_menu` VALUES (131, 130, 'C', '部门管理', 'el-icon-Coordinate', 0, 'system:dept:list', 'department', 'organization/department/index', '', '', 1, 1, 0, 1650341765, 1660201994); +INSERT INTO `x_system_auth_menu` VALUES (132, 131, 'A', '部门详情', '', 0, 'system:dept:detail', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (133, 131, 'A', '部门新增', '', 0, 'system:dept:add', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (134, 131, 'A', '部门编辑', '', 0, 'system:dept:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (135, 131, 'A', '部门删除', '', 0, 'system:dept:del', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (140, 130, 'C', '岗位管理', 'el-icon-PriceTag', 0, 'system:post:list', 'post', 'organization/post/index', '', '', 1, 1, 0, 1650341765, 1660202057); +INSERT INTO `x_system_auth_menu` VALUES (141, 140, 'A', '岗位详情', '', 0, 'system:post:detail', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (142, 140, 'A', '岗位新增', '', 0, 'system:post:add', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (143, 140, 'A', '岗位编辑', '', 0, 'system:post:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (144, 140, 'A', '岗位删除', '', 0, 'system:post:del', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (200, 0, 'M', '其它管理', '', 0, '', '', '', '', '', 0, 0, 0, 1650341765, 1660636870); +INSERT INTO `x_system_auth_menu` VALUES (201, 200, 'M', '图库管理', '', 0, '', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (202, 201, 'A', '文件列表', '', 0, 'albums:albumList', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (203, 201, 'A', '文件命名', '', 0, 'albums:albumRename', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (204, 201, 'A', '文件移动', '', 0, 'albums:albumMove', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (205, 201, 'A', '文件删除', '', 0, 'albums:albumDel', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (206, 201, 'A', '分类列表', '', 0, 'albums:cateList', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (207, 201, 'A', '分类新增', '', 0, 'albums:cateAdd', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (208, 201, 'A', '分类命名', '', 0, 'albums:cateRename', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (209, 201, 'A', '分类删除', '', 0, 'albums:cateDel', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (215, 200, 'M', '上传管理', '', 0, '', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (216, 215, 'A', '上传图片', '', 0, 'upload:image', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (217, 215, 'A', '上传视频', '', 0, 'upload:video', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (500, 0, 'M', '系统设置', 'el-icon-Setting', 0, '', 'setting', '', '', '', 0, 1, 0, 1650341765, 1662626322); +INSERT INTO `x_system_auth_menu` VALUES (501, 500, 'M', '网站设置', 'el-icon-Basketball', 10, '', 'website', '', '', '', 0, 1, 0, 1650341765, 1663233572); +INSERT INTO `x_system_auth_menu` VALUES (502, 501, 'C', '网站信息', '', 0, 'setting:website:detail', 'information', 'setting/website/information', '', '', 0, 1, 0, 1650341765, 1660202218); +INSERT INTO `x_system_auth_menu` VALUES (503, 502, 'A', '保存配置', '', 0, 'setting:website:save', '', '', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (505, 501, 'C', '网站备案', '', 0, 'setting:copyright:detail', 'filing', 'setting/website/filing', '', '', 0, 1, 0, 1650341765, 1660202294); +INSERT INTO `x_system_auth_menu` VALUES (506, 505, 'A', '备案保存', '', 0, 'setting:copyright:save', '', 'setting/website/protocol', '', '', 0, 0, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (510, 501, 'C', '政策协议', '', 0, 'setting:protocol:detail', 'protocol', 'setting/website/protocol', '', '', 0, 1, 0, 1660027606, 1660202312); +INSERT INTO `x_system_auth_menu` VALUES (511, 510, 'A', '协议保存', '', 0, 'setting:protocol:save', '', '', '', '', 0, 0, 0, 1660027606, 1663670865); +INSERT INTO `x_system_auth_menu` VALUES (515, 600, 'C', '字典管理', 'el-icon-Box', 0, 'setting:dict:type:list', 'dict', 'setting/dict/type/index', '', '', 0, 1, 0, 1660035436, 1663226087); +INSERT INTO `x_system_auth_menu` VALUES (516, 515, 'A', '字典类型新增', '', 0, 'setting:dict:type:add', '', '', '', '', 0, 1, 0, 1660202761, 1660202761); +INSERT INTO `x_system_auth_menu` VALUES (517, 515, 'A', '字典类型编辑', '', 0, 'setting:dict:type:edit', '', '', '', '', 0, 1, 0, 1660202842, 1660202842); +INSERT INTO `x_system_auth_menu` VALUES (518, 515, 'A', '字典类型删除', '', 0, 'setting:dict:type:del', '', '', '', '', 0, 1, 0, 1660202903, 1660202903); +INSERT INTO `x_system_auth_menu` VALUES (519, 600, 'C', '字典数据管理', '', 0, 'setting:dict:data:list', 'dict/data', 'setting/dict/data/index', '/dev_tools/dict', '', 0, 0, 0, 1660202948, 1663309252); +INSERT INTO `x_system_auth_menu` VALUES (520, 515, 'A', '字典数据新增', '', 0, 'setting:dict:data:add', '', '', '', '', 0, 1, 0, 1660203117, 1660203117); +INSERT INTO `x_system_auth_menu` VALUES (521, 515, 'A', '字典数据编辑', '', 0, 'setting:dict:data:edit', '', '', '', '', 0, 1, 0, 1660203142, 1660203142); +INSERT INTO `x_system_auth_menu` VALUES (522, 515, 'A', '字典数据删除', '', 0, 'setting:dict:data:del', '', '', '', '', 0, 1, 0, 1660203159, 1660203159); +INSERT INTO `x_system_auth_menu` VALUES (550, 500, 'M', '系统维护', 'el-icon-SetUp', 0, '', 'system', '', '', '', 0, 1, 0, 1650341765, 1660202466); +INSERT INTO `x_system_auth_menu` VALUES (551, 550, 'C', '系统环境', '', 0, 'monitor:server', 'environment', 'setting/system/environment', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (552, 550, 'C', '系统缓存', '', 0, 'monitor:cache', 'cache', 'setting/system/cache', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (553, 550, 'C', '系统日志', '', 0, 'system:log:operate', 'journal', 'setting/system/journal', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (555, 500, 'C', '存储设置', 'el-icon-FolderOpened', 6, 'setting:storage:list', 'storage', 'setting/storage/index', '', '', 0, 1, 0, 1650341765, 1663312996); +INSERT INTO `x_system_auth_menu` VALUES (556, 555, 'A', '保存配置', '', 0, 'setting:storage:edit', '', '', '', '', 0, 1, 0, 1650341765, 1650341765); +INSERT INTO `x_system_auth_menu` VALUES (600, 0, 'M', '开发工具', 'el-icon-EditPen', 0, '', 'dev_tools', '', '', '', 0, 1, 0, 1660027606, 1664335701); +INSERT INTO `x_system_auth_menu` VALUES (610, 600, 'C', '代码生成器', 'el-icon-DocumentAdd', 0, 'gen:list', 'code', 'dev_tools/code/index', '', '', 0, 1, 0, 1660028954, 1660532510); +INSERT INTO `x_system_auth_menu` VALUES (611, 610, 'A', '导入数据表', '', 0, 'gen:importTable', '', '', '', '', 0, 1, 0, 1660532389, 1660532389); +INSERT INTO `x_system_auth_menu` VALUES (612, 610, 'A', '生成代码', '', 0, 'gen:genCode', '', '', '', '', 0, 1, 0, 1660532421, 1660532421); +INSERT INTO `x_system_auth_menu` VALUES (613, 610, 'A', '下载代码', '', 0, 'gen:downloadCode', '', '', '', '', 0, 1, 0, 1660532437, 1660532437); +INSERT INTO `x_system_auth_menu` VALUES (614, 610, 'A', '预览代码', '', 0, 'gen:previewCode', '', '', '', '', 0, 1, 0, 1660532549, 1660532549); +INSERT INTO `x_system_auth_menu` VALUES (616, 610, 'A', '同步表结构', '', 0, 'gen:syncTable', '', '', '', '', 0, 1, 0, 1660532781, 1660532781); +INSERT INTO `x_system_auth_menu` VALUES (617, 610, 'A', '删除数据表', '', 0, 'gen:delTable', '', '', '', '', 0, 1, 0, 1660532800, 1660532800); +INSERT INTO `x_system_auth_menu` VALUES (618, 610, 'A', '数据表详情', '', 0, 'gen:detail', '', '', '', '', 0, 1, 0, 1660532964, 1660532977); +INSERT INTO `x_system_auth_menu` VALUES (700, 0, 'M', '素材管理', 'el-icon-Picture', 43, '', 'material', '', '', '', 0, 1, 0, 1660203293, 1663300847); +INSERT INTO `x_system_auth_menu` VALUES (701, 700, 'C', '素材中心', 'el-icon-PictureRounded', 0, '', 'index', 'material/index', '', '', 0, 1, 0, 1660203402, 1663301493); +INSERT INTO `x_system_auth_menu` VALUES (775, 600, 'C', '代码生成器编辑', 'el-icon-EditPen', 0, 'gen:editTable', 'dev_tools/code/edit', 'dev_tools/code/edit', '', '', 0, 0, 0, 1699344389, 1699344389); +INSERT INTO `x_system_auth_menu` VALUES (776, 0, 'C', '产品', 'el-icon-Aim', 0, '', 'product/index', 'product/index', '', '', 1, 1, 0, 1699719599, 1699719599); +INSERT INTO `x_system_auth_menu` VALUES (777, 0, 'C', 'article_collect', '', 0, 'article_collect:list', 'article_collect/index', 'article_collect/index', '', '', 1, 1, 0, 1700329092, 1700329092); + +-- ---------------------------- +-- Table structure for x_system_auth_perm +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_perm`; +CREATE TABLE `x_system_auth_perm` ( + `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '主键', + `role_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '角色ID', + `menu_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '菜单ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统角色菜单表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_perm +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_system_auth_post +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_post`; +CREATE TABLE `x_system_auth_post` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '岗位编码', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '岗位名称', + `remarks` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '岗位备注', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '岗位排序', + `is_stop` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否停用: 0=否, 1=是', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统岗位管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_post +-- ---------------------------- +INSERT INTO `x_system_auth_post` VALUES (1, 'a', '啊', 'aa', 0, 0, 1, 1699718138, 1699718141, 0); + +-- ---------------------------- +-- Table structure for x_system_auth_role +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_auth_role`; +CREATE TABLE `x_system_auth_role` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '角色名称', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注信息', + `sort` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '角色排序', + `is_disable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否禁用: 0=否, 1=是', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统角色管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_auth_role +-- ---------------------------- +INSERT INTO `x_system_auth_role` VALUES (1, '审核员', '审核数据', 0, 0, 1668679451, 1699458583); + +-- ---------------------------- +-- Table structure for x_system_config +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_config`; +CREATE TABLE `x_system_config` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '类型', + `name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '键', + `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '值', + `create_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 81 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统全局配置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_config +-- ---------------------------- +INSERT INTO `x_system_config` VALUES (1, 'storage', 'default', 'local', 1660620367, 1662620927); +INSERT INTO `x_system_config` VALUES (2, 'storage', 'local', '{\"name\":\"本地存储\"}', 1660620367, 1662620927); +INSERT INTO `x_system_config` VALUES (3, 'storage', 'qiniu', '{\"name\":\"七牛云存储\",\"bucket\":\"\",\"secretKey\":\"\",\"accessKey\":\"\",\"domain\":\"\"}', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (4, 'storage', 'aliyun', '{\"name\":\"阿里云存储\",\"bucket\":\"\",\"secretKey\":\"\",\"accessKey\":\"\",\"domain\":\"\"}', 1660620367, 1662620071); +INSERT INTO `x_system_config` VALUES (5, 'storage', 'qcloud', '{\"name\":\"腾讯云存储\",\"bucket\":\"\",\"secretKey\":\"\",\"accessKey\":\"\",\"domain\":\"\",\"region\":\"\"}', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (6, 'sms', 'default', 'aliyun', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (7, 'sms', 'aliyun', '{\"name\":\"阿里云短信\",\"alias\":\"aliyun\",\"sign\":\"\",\"appKey\":\"\",\"secretKey\":\"\"}', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (8, 'sms', 'tencent', '{\"name\":\"腾讯云短信\",\"alias\":\"tencent\",\"sign\":\"\",\"appId\":\"\",\"secretId\":\"\",\"secretKey\":\"\"}', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (9, 'sms', 'huawei', '{\"name\":\"华为云短信\",\"alias\":\"huawei\"}', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (10, 'website', 'name', 'Admin开源后台', 1660620367, 1699524151); +INSERT INTO `x_system_config` VALUES (11, 'website', 'logo', '/api/static/backend_logo.png', 1660620367, 1699524151); +INSERT INTO `x_system_config` VALUES (12, 'website', 'favicon', '/api/static/backend_favicon.ico', 1660620367, 1699524151); +INSERT INTO `x_system_config` VALUES (13, 'website', 'backdrop', '/api/static/backend_backdrop.png', 1660620367, 1699524151); +INSERT INTO `x_system_config` VALUES (14, 'website', 'copyright', '[{\"name\":\"LikeAdmin开源系统\",\"link\":\"http://www.beian.gov.cn\"}]', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (15, 'website', 'shopName', 'Admin开源系统', 1631255140, 1699524151); +INSERT INTO `x_system_config` VALUES (16, 'website', 'shopLogo', '/api/static/shop_logo.png', 1631255140, 1699524151); +INSERT INTO `x_system_config` VALUES (17, 'protocol', 'service', '{\"name\":\"服务协议\",\"content\":\"\\u003cp\\u003e服务协议\\u003c/p\\u003e\"}', 1660620367, 1699496132); +INSERT INTO `x_system_config` VALUES (18, 'protocol', 'privacy', '{\"name\":\"隐私协议\",\"content\":\"\\u003cp\\u003e隐私协议\\u003c/p\\u003e\"}', 1660620367, 1699496132); +INSERT INTO `x_system_config` VALUES (19, 'tabbar', 'style', '{\"defaultColor\":\"#4A5DFF\",\"selectedColor\":\"#EA5455\"}', 1660620367, 1662544900); +INSERT INTO `x_system_config` VALUES (20, 'search', 'isHotSearch', '0', 1660620367, 1662546997); +INSERT INTO `x_system_config` VALUES (30, 'h5_channel', 'status', '1', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (31, 'h5_channel', 'close', '0', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (32, 'h5_channel', 'url', '', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (40, 'mp_channel', 'name', '', 1660620367, 1662551403); +INSERT INTO `x_system_config` VALUES (41, 'mp_channel', 'primaryId', '', 1660620367, 1662551403); +INSERT INTO `x_system_config` VALUES (42, 'mp_channel', 'appId', '', 1660620367, 1662551403); +INSERT INTO `x_system_config` VALUES (43, 'mp_channel', 'appSecret', '', 1660620367, 1662551403); +INSERT INTO `x_system_config` VALUES (44, 'mp_channel', 'qrCode', '', 1660620367, 1662551403); +INSERT INTO `x_system_config` VALUES (50, 'wx_channel', 'appId', '', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (51, 'wx_channel', 'appSecret', '', 1660620367, 1660620367); +INSERT INTO `x_system_config` VALUES (55, 'oa_channel', 'name', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (56, 'oa_channel', 'primaryId', ' ', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (57, 'oa_channel', 'qrCode', '', 1662551337, 1662551337); +INSERT INTO `x_system_config` VALUES (58, 'oa_channel', 'appId', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (59, 'oa_channel', 'appSecret', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (60, 'oa_channel', 'url', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (61, 'oa_channel', 'token', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (62, 'oa_channel', 'encodingAesKey', '', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (63, 'oa_channel', 'encryptionType', '1', 1660620367, 1662551337); +INSERT INTO `x_system_config` VALUES (64, 'oa_channel', 'menus', '[]', 1631255140, 1663118712); +INSERT INTO `x_system_config` VALUES (70, 'login', 'loginWay', '1,2', 1660620367, 1662538771); +INSERT INTO `x_system_config` VALUES (71, 'login', 'forceBindMobile', '0', 1660620367, 1662538771); +INSERT INTO `x_system_config` VALUES (72, 'login', 'openAgreement', '1', 1660620367, 1662538771); +INSERT INTO `x_system_config` VALUES (73, 'login', 'openOtherAuth', '1', 1660620367, 1662538771); +INSERT INTO `x_system_config` VALUES (74, 'login', 'autoLoginAuth', '1,2', 1660620367, 1662538771); +INSERT INTO `x_system_config` VALUES (80, 'user', 'defaultAvatar', '/api/static/default_avatar.png', 1660620367, 1662535156); + +-- ---------------------------- +-- Table structure for x_system_log_login +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_log_login`; +CREATE TABLE `x_system_log_login` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '注解', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '管理员ID', + `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '登录账号', + `ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录地址', + `os` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作系统', + `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器', + `status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '操作状态: 1=成功, 2=失败', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统登录日志表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_log_login +-- ---------------------------- +INSERT INTO `x_system_log_login` VALUES (1, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699342613); +INSERT INTO `x_system_log_login` VALUES (2, 0, 'admin', '127.0.0.1', 'Windows', 'Edge', 0, 1699343960); +INSERT INTO `x_system_log_login` VALUES (3, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 0, 1699343975); +INSERT INTO `x_system_log_login` VALUES (4, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699343985); +INSERT INTO `x_system_log_login` VALUES (5, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699454100); +INSERT INTO `x_system_log_login` VALUES (6, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699454113); +INSERT INTO `x_system_log_login` VALUES (7, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699456315); +INSERT INTO `x_system_log_login` VALUES (8, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699493828); +INSERT INTO `x_system_log_login` VALUES (9, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699507466); +INSERT INTO `x_system_log_login` VALUES (10, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699547693); +INSERT INTO `x_system_log_login` VALUES (11, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699705884); +INSERT INTO `x_system_log_login` VALUES (12, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699706435); +INSERT INTO `x_system_log_login` VALUES (13, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699707397); +INSERT INTO `x_system_log_login` VALUES (14, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699715636); +INSERT INTO `x_system_log_login` VALUES (15, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1699803153); +INSERT INTO `x_system_log_login` VALUES (16, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700142837); +INSERT INTO `x_system_log_login` VALUES (17, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700150134); +INSERT INTO `x_system_log_login` VALUES (18, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700298162); +INSERT INTO `x_system_log_login` VALUES (19, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700381343); +INSERT INTO `x_system_log_login` VALUES (20, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700402870); +INSERT INTO `x_system_log_login` VALUES (21, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700449387); +INSERT INTO `x_system_log_login` VALUES (22, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700462131); +INSERT INTO `x_system_log_login` VALUES (23, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700493100); +INSERT INTO `x_system_log_login` VALUES (24, 1, 'admin', '127.0.0.1', 'Windows', 'Edge', 1, 1700493528); + +-- ---------------------------- +-- Table structure for x_system_log_operate +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_log_operate`; +CREATE TABLE `x_system_log_operate` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人ID', + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '请求类型: GET/POST/PUT', + `title` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作标题', + `ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '请求IP', + `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '请求接口', + `method` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '请求方法', + `args` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数', + `error` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误信息', + `status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '执行状态: 1=成功, 2=失败', + `start_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '开始时间', + `end_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '结束时间', + `task_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '执行耗时', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 197 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统操作日志表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_log_operate +-- ---------------------------- +INSERT INTO `x_system_log_operate` VALUES (1, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/routers/system.roleHandler.list-fm', 'pageNo=1&pageSize=15', '', 1, 1699343137, 1699343138, 4, 1699343138); +INSERT INTO `x_system_log_operate` VALUES (187, 1, 'POST', '上传图片', '127.0.0.1', '/api/common/upload/image', 'likeadmin/admin/common/upload.uploadHandler.uploadImage-fm', '5c8950e543e8046320.mp3', 'Error #01: 300:不被支持的图片扩展: mp3\n', 2, 1700465126, 1700465126, 161, 1700465126); +INSERT INTO `x_system_log_operate` VALUES (188, 1, 'POST', '上传图片', '127.0.0.1', '/api/common/upload/image', 'likeadmin/admin/common/upload.uploadHandler.uploadImage-fm', 'hrxz.com-30nsh0dvpby60530.mp3', 'Error #01: 300:不被支持的图片扩展: mp3\n', 2, 1700465176, 1700465176, 1, 1700465176); +INSERT INTO `x_system_log_operate` VALUES (189, 1, 'POST', '上传图片', '127.0.0.1', '/api/common/upload/image', 'likeadmin/admin/common/upload.uploadHandler.uploadImage-fm', 'yiji.mp3', 'Error #01: 300:不被支持的图片扩展: mp3\n', 2, 1700465204, 1700465204, 10, 1700465204); +INSERT INTO `x_system_log_operate` VALUES (190, 1, 'POST', '上传视频', '127.0.0.1', '/api/common/upload/video', 'likeadmin/admin/common/upload.uploadHandler.uploadVideo-fm', '素材中心 和另外 1 个页面 - 个人 - Microsoft​ Edge 2023-11-20 15-37-39.mp4', '', 1, 1700465870, 1700465870, 85, 1700465870); +INSERT INTO `x_system_log_operate` VALUES (191, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700466101, 1700466101, 26, 1700466101); +INSERT INTO `x_system_log_operate` VALUES (192, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700466116, 1700466116, 3, 1700466116); +INSERT INTO `x_system_log_operate` VALUES (193, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700493553, 1700493553, 1, 1700493553); +INSERT INTO `x_system_log_operate` VALUES (194, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700494088, 1700494088, 2, 1700494088); +INSERT INTO `x_system_log_operate` VALUES (195, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700494182, 1700494182, 7, 1700494182); +INSERT INTO `x_system_log_operate` VALUES (196, 1, 'GET', '角色列表', '127.0.0.1', '/api/system/role/list', 'likeadmin/admin/system/role.RoleHandler.List-fm', 'pageNo=1&pageSize=15', '', 1, 1700497573, 1700497573, 2, 1700497573); + +-- ---------------------------- +-- Table structure for x_system_log_sms +-- ---------------------------- +DROP TABLE IF EXISTS `x_system_log_sms`; +CREATE TABLE `x_system_log_sms` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id', + `scene` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '场景编号', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号码', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '发送内容', + `status` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送状态:[0=发送中, 1=发送成功, 2=发送失败]', + `results` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '短信结果', + `send_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送时间', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统短信日志表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_system_log_sms +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_user +-- ---------------------------- +DROP TABLE IF EXISTS `x_user`; +CREATE TABLE `x_user` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `sn` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '编号', + `avatar` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像', + `real_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '真实姓名', + `nickname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号', + `password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码', + `mobile` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户电话', + `salt` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '加密盐巴', + `sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户性别: [1=男, 2=女]', + `channel` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '注册渠道: [1=微信小程序, 2=微信公众号, 3=手机H5, 4=电脑PC, 5=苹果APP, 6=安卓APP]', + `is_disable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否禁用: [0=否, 1=是]', + `is_delete` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除: [0=否, 1=是]', + `last_login_ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最后登录IP', + `last_login_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后登录时间', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_user +-- ---------------------------- + +-- ---------------------------- +-- Table structure for x_user_auth +-- ---------------------------- +DROP TABLE IF EXISTS `x_user_auth`; +CREATE TABLE `x_user_auth` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID', + `openid` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Openid', + `unionid` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Unionid', + `client` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '客户端类型: [1=微信小程序, 2=微信公众号, 3=手机H5, 4=电脑PC, 5=苹果APP, 6=安卓APP]', + `create_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `openid`(`openid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户授权表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of x_user_auth +-- ---------------------------- + +SET FOREIGN_KEY_CHECKS = 1;

    真正会让我对 UI 设计师发展前景觉得悲观的事情就只有一件 —— 国内的互联网产品免费机制。这也是一个我一直以来想讨论的话题,就在这次写一写。