首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10012篇文章
优秀的个人博客,低调大师

快速入门 TinyVue 组件库一键换肤!get“多主题适配”技能

本文由体验技术团队 TinyVue 项目成员岑灌铭创作,欢迎大家实操体验,本实操内容通过实现 TinyVue 中 Button 组件和 Alert 的类 element 主题适配,让开发者感受到 TinyVue 跨设计规范的亮点特性,同时对 TinyVue 组件库多主题的实现原理有个初步的了解。 知识背景 1. TinyVue 组件库简介 OpenTiny 是一套企业级前端开发解决方案,其中包含了组件库、低代码、中后台模板、CLI 命令行等丰富的效率提升工具。其中 TinyVue 是其中一款支持跨端、跨框架以及跨设计规范的组件库。 本次实操内容通过实现 TinyVue 中 Button 组件和 Alert 的类 element 主题适配,让开发者感受到 TinyVue 跨设计规范的亮点特性,同时对 TinyVue 组件库多主题的实现原理有个初步的了解。 代码托管 GitHub:https://github.com/opentiny/tiny-vue (欢迎大家 Star 和 提Issue、PR 进行反馈) TinyVue 官网:https://opentiny.design/tiny-vue/zh-CN/smb-theme/overview 2.环境基本要求 node.js v16+ npm v8+ 代码编辑器 VsCode 以及 Chrome/Edge 浏览器 代码实战 1.使用Vite创建一个Vue3项目 1.1 打开 VSCode 软件,使用 Ctrl+~快捷键打开终端。执行以下命令安装Vite npm install -g vite 1.2 使用 Vite 创建一个 Vue3 工程 npm create vite[@latest](https://my.oschina.net/u/4418429) tinyvue-multi-theme -- --template vue 命令行提示是否安装 create-vite@latest,输入y后回车,安装并创建 cd tinyvue-multi-theme npm install npm run dev 创建工程完毕后,依次输入以上命名 进入工程文件夹 安装依赖 执行命令启动项目 出现以下界面,则说明项目启动成功,Ctrl+鼠标左边单击 http://127.0.0.1:5173/ 从浏览器启动项目 浏览器打开会出现以上界面,说明一切正常,到此为止,Vue3项目已经完成创建。 2.安装 TinyVue,使用 button 以及 alert 组件 安装@opentiny/vue,在 vscode 终端下执行以下命名,安装 TinyVue 组件库 npm install @opentiny/vue@3.16.0 打开 OpenTiny 官网 https://opentiny.design/tiny-vue/zh-CN/overview 找到 Button 组件和 Alert 组件,可以参考官网 demo 的写法新增本次实验所需代码。 在 components 文件夹下,新建ButtonDemo.vue文件, 使用 Button 组件,新增6个类型的朴素按钮。 <template> <tiny-button plain> 朴素按钮 </tiny-button> <tiny-button type="primary" plain> 主要按钮 </tiny-button> <tiny-button type="success" plain> 成功按钮 </tiny-button> <tiny-button type="info" plain> 信息按钮 </tiny-button> <tiny-button type="warning" plain> 警告按钮 </tiny-button> <tiny-button type="danger" plain> 危险按钮 </tiny-button> </template> <script> import { Button } from "@opentiny/vue"; export default { components: { TinyButton: Button, }, }; </script> 在 components 文件夹下,新建AlertDemo.vue文件, 使用 Alert 组件,新增4个类型 alert。 <template> <div> <tiny-alert type="success" description="type 为 success"></tiny-alert> <tiny-alert type="simple" description="type 为默认值 info"></tiny-alert> <tiny-alert type="warning" description="type 为 warning"></tiny-alert> <tiny-alert type="error" description="type 为 error"></tiny-alert> </div> </template> <script> import { Alert } from "@opentiny/vue"; export default { components: { TinyAlert: Alert, }, }; </script> 删除无关文件HelloWorld.vue ,修改App.vue文件,引入ButtonDemo.vue和AlertDemo.vue组件。 import ButtonDemo from "./components/ButtonDemo.vue"; import AlertDemo from "./components/AlertDemo.vue"; 修改模板代码,删除 vite 初始 demo 代码,使用引入的 Button 和 Alert。 <template> <div class="theme-app"> <div class="container"> <button-demo></button-demo> </div> <div class="container"> <alert-demo></alert-demo> </div> </div> </template> 删除原本 vite 初始 demo 代码样式代码,新增本次实验所需的样式代码,使其看起来更美观一些。 <style scoped> .container { width: 650px; padding: 20px 24px; border-radius: 5px; border: 1px solid #ddd; margin-top: 24px; } </style> 完成以上步骤,就已经掌握了 TinyVue 组件的基本用法了,打开页面查看,如果显示以下页面,那么准备工作就完毕了~ 3.实现样式切换 下面来准备第三步,实现样式上的切换,开始实现之前,首先简单介绍一下 TinyVue 主题适配的原理。 原理: 在页面打开控制台,查看 button 的样式,可以看到样式属性值都是使用的 css var 变量。这些变量都以 ti-button 开头,这些可以称之为组件级变量。 通常情况下,相同类型(成功类型)的背景色、文本色等在不同组件中属性值相同,因此组件库定义了这部分常用到公共变量。而绝大多数组件级变量也都是使用的公共变量。 本次实验中 Button 和 Alert 的组件级变量的背景色正是使用的同一个公共变量ti-common-color-success-bg 主题适配的原理就是覆盖这些 css var 变量的值,去达到改变样式的效果。了解了原理后,就可以开始实现样式切换了。 实战: 在 components 文件夹下,新建ChangeTheme.vue文件, 编写切换样式逻辑。 这里使用 TinyVue 内置的 theme-tool 切换主题工具,只需要定义好相应主题变量的值即可,工具就会自动完成覆盖变量值的操作。 然后引入 Radio 组件,选中不同值时切换不同的主题,引入 theme-tool 工具,尝试修改上文提到的公共变量ti-common-color-success-bg,这里先设置为测试值 green 查看效果。 <script setup> import { Radio as TinyRadio, RadioGroup as TinyRadioGroup, } from "@opentiny/vue"; import TinyThemeTool from "@opentiny/vue-theme/theme-tool"; import { ref } from "vue"; const theme = ref("tiny-vue"); const themeTool = new TinyThemeTool(); const elementTheme = { id: "element-theme", name: "elementTheme", cnName: "饿了么主题", data: { "ti-common-color-success-bg": "green", }, }; const emit = defineEmits(["change-theme"]); const changeTheme = (theme) => { themeTool.changeTheme(theme === "element" ? elementTheme : null); emit("change-theme", theme); }; </script> <template> <tiny-radio-group v-model="theme" @change="changeTheme"> <tiny-radio label="tiny-vue"></tiny-radio> <tiny-radio label="element"></tiny-radio> </tiny-radio-group> </template> 在App.vue中引入并使用ChangeTheme组件 // script下新增 import ChangeTheme from "./components/ChangeTheme.vue"; // template下新增 <change-theme></change-theme> 接着打开页面查看效果,切换主题时,成功按钮和成功类型的 alert 背景颜色都变为 green 了~ 然后可以对比 element 组件样式差异:https://element-plus.org/zh-CN/component/button.html 将背景色、文字色等 css 属性修改为与 element 一致,当然也可以自己发挥,DIY 自己的主题。以下是一份参考配置: const elementTheme = { id: "element-theme", name: "elementTheme", cnName: "饿了么主题", data: { // 设置公共变量 "ti-common-color-primary-bg": "#409eff", "ti-common-color-primary-normal": "#409eff", "ti-common-color-success-bg": "#f0f9eb", "ti-common-color-success-normal": "#67c23a", "ti-common-color-info-bg": "#f4f4f5", "ti-common-color-info-normal": "#909399", "ti-common-color-warn-bg": "#fdf6ec", "ti-common-color-warn-normal": "#e6a23c", "ti-common-color-danger-bg": "#fef0f0", "ti-common-color-danger-normal": "#f56c6c", // 设置button相关样式属性 "ti-button-size-normal-height": "32px", "ti-button-border-radius": "4px", "ti-button-font-size": "14px", // 设置alert相关样式属性 "ti-alert-border-radius": "6px", "ti-alert-close-font-size": "14px", "ti-alert-description-font-size": "14px", "ti-alert-success-close-icon-color": "#a8abb2", "ti-alert-simple-close-icon-color": "#a8abb2", "ti-alert-error-close-icon-color": "#a8abb2", "ti-alert-warning-close-icon-color": "#a8abb2", "ti-alert-success-title-text-color": "#67c23a", "ti-alert-simple-title-text-color": "#909399", "ti-alert-warning-title-text-color": "#e6a23c", "ti-alert-error-title-text-color": "#f56c6c", "ti-alert-border-weight": "0px", }, }; 4.图标的适配 完成以上三步,此时 css 样式部分已经适配完毕。但是和 element 主题还是会有差别,仔细对比发现,element 主题是没有图标的。 而对于图标的隐藏,其实也可以通过 css var 变量的方式去实现,但是只能控制图标的显示和隐藏,无法实现不同主题下展示不同的图标,因此对于图标的适配,组件库采用配置的方式去实现。 以下是组件库代码截图,组件库对于图标,预留了配置项,组件库提供 ConfigProvider 组件来实现适配不同设计规范之间的图标和逻辑。 在App.vue文件下,引入 ConfigProvider,定义 designConfig,因为 element 是没有图标,因此配置为返回 null。定义切换方法 changeDesign,在切换样式的同时切换主题配置。 import { ConfigProvider } from "@opentiny/vue"; import { ref } from "vue"; const elementConfig = { name: "elementConfig", // 自定义规范名称 components: { Alert: { icons: { warning: () => null, success: () => null, error: () => null, }, }, }, }; const designConfig = ref({}); const changeDesign = (val) => { console.log(val === "element"); designConfig.value = val === "element" ? elementConfig : {}; }; 在模板中使用 ConfigProvider,传入主题配置。因为主题配置为非响应式更新,因此需要配置一下 key,切换配置后重新加载一下。 <template> <change-theme @change-theme="changeDesign"></change-theme> <config-provider :design="designConfig" :key="designConfig.name"> <div class="theme-app"> <div class="container"> <button-demo></button-demo> </div> <div class="container"> <alert-demo></alert-demo> </div> </div> </config-provider> </template> 配置完 designConfig 后,图标问题也解决了~ 5.交互的适配 完成以上4点,已经完成了 Button 组件和 Alert 组件的类 element 主题适配了,第5点属于拓展内容,试想一下,如果 element 主题在关闭 alert 前,需要弹出确认框确认,应该如何适配? 得益于 TinyVue 的 renderless 架构,可以很轻易地实现逻辑的替换,从而适配不同交互规范。对原理感兴趣的话,可以查看往期文章《手把手教你实现 miniTinyVue 版组件库》 这里直接贴实现方式,在 elementConfig 中新增替换 handleClose 的配置。 const elementConfig = { name: "elementConfig", // 自定义规范名称 components: { Alert: { icons: { warning: () => null, success: () => null, error: () => null, }, // 可以通过renderless重写某个方法,自定义交互逻辑 renderless: (props, hooks, { emit }, api) => { const state = api.state; return { handleClose() { const isClose = confirm("是否确认关闭?"); if (isClose) { state.show = false; } }, }; }, }, }, }; 打开页面,尝试关闭其中一个 alert,发现关闭前会弹出确认框。至此,样式、图标以及交互的适配都完成了~ 总结 至此,本次实操体验已全部完成。相信通过本次实操体验,你已经对 TinyVue 跨设计规范的原理以及相关工具有一个初步了解了~ 如果你感兴趣,完全通过theme-tool和config-provider打造一套属于自己的主题 ~ 关于OpenTiny OpenTiny 是一套企业级 Web 前端开发解决方案,提供跨端、跨框架、跨版本的 TinyVue 组件库,包含基于 Angular+TypeScript 的 TinyNG 组件库,拥有灵活扩展的低代码引擎 TinyEngine,具备主题配置系统TinyTheme / 中后台模板 TinyPro/ TinyCLI 命令行等丰富的效率提升工具,可帮助开发者高效开发 Web 应用。 欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~ OpenTiny 官网:https://opentiny.design/ OpenTiny 代码仓库:https://github.com/opentiny/ TinyVue 源码:https://github.com/opentiny/tiny-vue TinyEngine 源码: https://github.com/opentiny/tiny-engine 欢迎进入代码仓库 Star?*TinyEngine、TinyVue、TinyNG、TinyCLI~ 如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

优秀的个人博客,低调大师

干货分享 | HZERO系列组件之数据分发组件(一),广播表快速入门

企业的信息化系统,通常会存在业务系统服务和HZERO系统服务相互独立,表数据也进行分库存储的情况,然而在众多业务系统服务中,存在很多场景需要用到HZERO平台的Iam_user(用户)表,因此我们需要将用户表分发到其他数据库里。 普通的解决方式是通过定时调度任务或者在代码中埋点,编写同步代码的方式让两个系统两个数据库实例的用户数据保持一致。 但设想一下,如果我们需要同步的不仅仅是用户,还有角色、用户权限、员工、组织、部门等等数据呢?编写代码的方式不仅会增加开发量,还可能会有数据延迟、程序BUG等影响。 所以这里要引入数据分发组件,在保障同步性能的同时,能大大降低数据分发的工作量。 数据分发组件概述 基于CloudCanal社区版,HZERO提供了一个集成组件,进行API和操作流程的封装,主要功能是实现全局表的数据分发功能,灵活设置可按服务分DB,该组件主要的使用场景包括需要用到全局表的情况,例如用户表等。 当然,不使用HZERO的操作入口,从CloudCanal官方提供的管理界面进行配置也能达到效果,不过在这我们还是建议使用HZERO进行统一的管理。 组件坐标 管理端组件在Hzero-Admin服务中依赖使用。 <dependency> <groupId>org.hzero.plugin</groupId> <artifactId>admin-datasync</artifactId></dependency> 组件配置说明 在Hzero-Admin服务中添加好依赖后,还需配置以下信息才能正常使用。 hzero: admin: cloudCanal: # 服务地址, 安装CloudCanal组件后,CloudCanal的访问地址 serverUrl: ${HZERO_CLOUDCANAL_SERVER_URL:http://cloudcanal.hzero.com} # 应用KEY,从CloudCanal的管理员用户账号信息中获取,与appSecret相对应,具体获取方式可参考`CloudCanal`的官方文档 appKey: ${HZERO_CLOUDCANAL_APP_KEY:ak**********************************} # 应用秘钥,从CloudCanal的管理员用户账号信息中获取,与appKey相对应,具体获取方式可参考`CloudCanal`的官方文档 appSecret: ${HZERO_CLOUDCANAL_APP_SECRET:sk*********************************} # 管理帐户,CloudCanal的管理员账户 account: ${HZERO_CLOUDCANAL_ACCOUNT:test@clougence.com} # 管理密码,CloudCanal的管理员账户的密码 password: ${HZERO_CLOUDCANAL_PASSWORD:********************} # 登录认证Cookie域,需要保证CloudCanal的访问地址要与hzero的界面前端在同一个域里,否则不能以无登录的方式直接跳转到CloudCanal的管理界面 domainUrl: ${HZERO_CLOUDCANAL_DOMAIN_URL:.hzero.com} 组件安装 安装教程 详细教程可参考以下路径:https://www.clougence.com/cc-doc/quick/quick_start/ 修改默认验证码 CloudCanal社区版为了体验便利,默认设置了777777验证码,但是我们希望提高数据安全性,降低数据泄露风险。CloudCanal也提供修改默认验证码的功能,我们按照以下步骤配置即可。 操作步骤: 1、进入CloudCanal社区版解压目录 /console_data/cloudcanal/console/conf; 2、编辑Business-output.properties文件和以下参数Console.config.product.trial.verify_code=777777; 3、重启Console容器。 准备数据库账号 CloudCanal在做MySQL源端或对端的数据迁移同步时,需要提供的账号有一些赋权,基于数据安全和规范的考虑,我们建议新建数据库账号,不要使用权限最大的账号。 MySQL源端 全量迁移:迁移库表的SELECT权限,Information_schema SELECT权限 增量同步:SELECT,REPLICATION SLAVE,REPLICATION CLIENT权限,Information_schema SELECT权限 MySQL对端 全量迁移/增量同步:迁移库表的 INSERT/UPDATE/DELETE/DDL权限,Information_schema SELECT权限 系统自动心跳(可选) 默认心跳语句:CREATE DATABASE权限 组件基础配置 新建MYSQL数据源 路径:平台层菜单平台治理>数据分发>CloudCanal 通过以上路径进入CloudCanal管理界面。 目前HZERO系统能方便管理的只有MySql类型,若要分发其他类型数据库,请参照官方文档直接在CloudCanal系统中配置 : 1、可以使用阿里云账号,也可以使用自建账号密码模式(一般习惯用账号密码模式,权限分配比较简单); 2、网络地址最好填写内网,避免网络延迟; 3、按步骤填写后点击测试链接。 创建来源表 路径:平台层菜单平台治理>数据分发>广播表通过以上路径进入广播表管理界面 点击广播表操作栏上的【新建】按钮进入来源表创建页面。依次选择集群,网关类型为公网,数据源为我的数据源,库为Hzero_platform,表为Iam_user,点击【确定】后完成来源表的创建。 创建目标表 选中刚创建的来源表,点击目标表操作栏上的 新建按钮进入目标表创建页面。依次选择网关类型为公网,数据源为我的数据源,库为Order_sys,表不做更改, 默认与来源表保持一致,为Iam_user,点击确定后完成目标表的创建。 重复以上操作,只是这次库选择Payment_sys。 等待片刻,分别进入数据库的Order_sys与Payment_sysDB,可以看到Iam_user数据已经同步过来,而且后续的其他操作也会同步到其他两个DB中的对应表里。 通过以上几步简单的配置,就能完成两个数据库实例间的数据同步,不仅避免定时任务同步、代码埋点同步带来的一系列问题,而且CloudCanal是通过监听MySQL的增量日志实现的增量同步,在不影响应用服务器性能的情况下,正常情况下延迟不会超过1秒。 下篇我们将讲述数据分发组件之ElasticSearch同步方案,敬请期待。 联系我们 产品试用请登录开放平台。请在 PC 端打开: https://open.hand-china.com/market-home/trial-center/ 产品详情请登录开放平台: https://open.hand-china.com/document-center/ 如有疑问登录开放平台提单反馈: https://open.hand-china.com/ ▲ 更多精彩内容,扫码关注“四海汉得”公众号​​​​​​​

优秀的个人博客,低调大师

五分钟快速入门 实战 Docker,工作这些命令就够用了

现在很多公司项目部署都是采用K8S docker容器方式,出门面试被问的概率极大,如果被面试官问docker相关知识点直接懵逼,那么基本就是被pass了,除非其他方面技术过硬。所以这种相对前沿的技术,就算达不到精通的程度,起码还是要了解基础理论和操作 一.安装docker Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 uname -an查看当前系统版本 yum -y install docker下载安装docker service docker start启动docker服务 docker version检查docker是否安装成功 当看到下图的信息,就是表示本机docker已经安装成功,很简单 在这里插入图片描述 二.镜像操作 创建容器要以镜像为基础,所以先讲下docker镜像的操作 搜索镜像 docker images ll查看下本机的是否已经有了镜像 目前机器里还没有镜像,去Docker Hub下载(镜像还可自定义,这里就不细说了) docker search java,还能指定具体的版本进行下载, 例如:docker search Ubuntu:1.2.5.4,可以进行搜docker Hub 会列出很多镜像 在这里插入图片描述 下载镜像 docker pull docker.io/nginx进行下载 下载到本地的镜像要比docker Hub上搜索出来的要大,因为下载过程中自动解压了,在查看镜像列表就有了刚才下载的镜像 列表包含了仓库名,版本标签,镜像ID,创建时间以及所占用的空间 在这里插入图片描述 删除镜像 删除没用的镜像docker rmi 镜像id 在这里插入图片描述 三.容器的操作 前边我们已经下载好了Nginx的镜像,接下来我们就创建一个只有Nginx应用的容器 docker run -i -t/bin/bash -i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本 dockerrun-idt--namecontainer_nginx-p8080:80docker.io/nginx 启动一个使用镜像docker.io/nginx,名字container_nginx的容器,-p 8080:80表示将容器的80端口映射到主机的8080端口,这样我们只要访问主机的8080端口就可以访问到容器的服务了。 注意:name前面是两个-, 端口前面有-p,docker.io/nginx是镜像名,8080是主机的端口,80是Nginx应用的端口 主机上的一个端口只能映射一个容器端口,不可以多个容器端口对应一个主机端口(如果容器安装的centos类的系统,那么容器端口随便设定,但如果容器内只是单纯的应用,那么容器端口要是应用自身的端口) 在这里插入图片描述 这样我们就创建并启动了一个容器! exit退出容器 docker ps查看运行中的容器 docker ps -a查看运行中和非运行中的所有容器 docker exec -it container_nginx /bin/bash进入容器 如果容器还未启动 执行docker start container_nginx 进入容器后启动Nginx whereis nginx 找Nginx的启动目录 [root@iz2zehzeir87zi8q99krk1z~]#dockerstartcontainer_nginx container_nginx [root@iz2zehzeir87zi8q99krk1z~]#dockerexec-itcontainer_nginx/bin/bash root@84683e425116:/#whereisnginx nginx:/usr/sbin/nginx/usr/lib/nginx/etc/nginx/usr/share/nginx root@84683e425116:/#/usr/sbin/nginx 此时在浏览器访问 http://51.110.218.9:8080/ 就可以直接访问容器内的Nginx 在这里插入图片描述 如果访问不成功,可能是主机端口的防火墙开着,执行下边的命令关闭 /sbin/iptables-IINPUT-ptcp--dport8080-jACCEPT 由于我用的阿里云服务器,所以需要在阿里云把8080端口开放 在这里插入图片描述 删除容器 容器删除之前先将容器停止 docker stop container_nginx或者是容器的id docker rm -f container_nginx容器删除 docker start 与 docker run 的区别 docker start name启动一个已经创建的容器 docker run创建并启动一个容器 docker run命令其实是docker create和docker start的命令组合,先执行docker create创建一个容器 再接着docker start启动 主机和容器文件相互复制 从主机复制到容器sudodockercphost_pathcontainerID:container_path 从容器复制到主机sudodockercpcontainerID:container_pathhost_path 请注意,以上这两个命令都是在主机中执行的,不能再容器中执行 dockercpcontainer_nginx:/usr/local/xin.txt/usr/local/software/容器向主机复制文件 dockercp/usr/local/xinzhifu.txtcontainer_nginx:/usr/local/主机向容器复制文件 这样一个基础的docker容器就创建完了 。。。。。。。。。。。。 反过来大家再看一看docker的容器与镜像的区别https://www.cnblogs.com/linjiaxin/p/7381421.html 那么其实镜像与容器的本质区别并不大,那么镜像可以生成容器 ,容器是否可以做成镜像呢? docketcommitcontainer_nginximage_nginx:v1 在这里插入图片描述 container_nginx容器名 image_nginx:v1自己起一个镜像的名字:版本号 这样做有什么好处呢? 例如:A、B两台机器都想安装redis,A机器上创建容器并在容器中做好redis的一切配置,让后将这个容器docker commit 成镜像image_redis,B机器也想要安装redis,直接用镜像image_redis创建容器就行了,docker就是做这样一劳永逸的事情。 而且传统方式得在每台机器上安装配置redis非常麻烦 四.镜像的导入与导出 镜像压缩打包 (主机上进行操作),有两种方式docker save与docker load和docker export 与 docker import dockersavenginx|gzip>nginx_xin_image.tar.gz将现有的镜像压缩打包 dockerload-inginx_xin_image.tar.gz压缩的镜像解压 dockerimages进行查看 docker save是直接将镜像进行打包docker save <镜像名>或<镜像id> dockerexportcontainer_nginx>nginx_image.tar catnginx_image.tar|sudodockerimport-nginx_image:import docker export是直接将容器进行打包docker export <容器名>或<容器id> 需要注意两种方法配套的,切不可混用。虽然导入导出时没问题,但是在创建容器时候会报错 如果使用import导入save产生的文件,虽然导入不提示错误,但是启动容器时会提示失败, 会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。 类似,使用load载入export产生的文件,也会出现问题。 先写到这,文章略显粗糙,希望对您有一点用,学无止境加油! 整理了几百本各类技术电子书,有需要的同学公号[程序员内点事]内回复[666]自取。技术群快满了,想进的同学可以加我好友,和大佬们一起吹吹技术。

优秀的个人博客,低调大师

[python作业AI毕业设计博客]selenium工具python快速入门1简介

概述 Selenium是一个开源自动化测试套件,适用于跨浏览器和平台的Web应用程序。 它是一组软件工具,每种工具都有不同的方法来支持测试自动化。 Selenium3.*的组件如下: Selenium IDE(集成开发环境 Integrated Development Environment) Selenium WebDriver Selenium Grid Selenium3.停止直接使用Selenium RC。 Selenium Core已从最新版本的Selenium 3.中完全删除。 官网:http://www.seleniumhq.org/ Selenium开源,基于Apache 2.0 License。github: https://github.com/SeleniumHQ/selenium Selenium IDE Se

优秀的个人博客,低调大师

[官版翻译ing]OpenStack云计算快速入门之三:OpenStack镜像管理

第三部分OpenStack镜像管理 一、简介 很多源都有为OpenStack已经编译好的各种镜像了,您可以直接下载并通过使用这些镜像来熟悉OpenStack。 不过如果是为生产环境进行部署的话,您一定需要构建含有定制软件或配置的镜像文件。不要着急,本章将引领您完成几种较为流行的Linux发行版镜像,最后也将制作一份Windows的镜像。 由不同的Linux发行版制作镜像时,过程几乎一样,仅有微小的差别而已。由于含有cloud-ini软件包,人们用Ubuntu系统制作镜像文件变得非常容易。Cloud-init软件在实例运行时能够自动维护实例配置,也将为无密码登陆完成密匙导入以及完成设置主机名等任务。每个实例都将通过169.254.169.254的元数据接口,从nova运算中读取特定的配置。 如果您制作发行版不含有诸如cloud-init此类的软件包,您就需要自行完成密匙导入等操作了。说来也简单,只需向rc.local文件中添加相关命令即可。 如前所述,创建Linux不同发行版的过程除了几细微之处外,其余完全一致。不同点将在后文阐述。 本文所有的例子,都是在KVM基础上完成的。正像前两章说道的那样,现在我正在使用client1。 接下来的操作将制作很多镜像,这些镜像代表一个没有分区的硬盘。 二、创建Linux镜像 第一部,首先是在Client1上创建一块空镜像,这块镜像用作虚拟机的硬盘,所以请保证留出你所需的空间的大小: kvm-imgcreate-fqcow2server.img5G (一)安装准备 下载你所需的Linux发行版iso原镜像文件,比如您想安装Ubuntu,您可以使用wget或浏览器从网站“http://releases.ubuntu.com”获得iso文件。 将下载的iso文件置入虚拟机的CD-ROM后,启动KVM一个虚拟机实例。您将看到安装过程的开始。键入如下命令,它将在端口0开放VNC服务: sudokvm-m256-cdromubuntu-12.04-server-amd64.iso-drivefile=server.img,if=virtio,index=0-bootd-netnic-netuser-nographic-vnc:0 使用0这个展示端口连入虚拟机的VNC,并完成安装。 举例如下,client1的IP地址是10.10.10.4,则通过下列命令访问vnc: vncviewer10.10.10.4:0 注意,在制作Linux镜像过程中,请创建一个单独的ext4格式分区并将其挂在swap分区下。 安装结束后,通过执行下列命令重新载入虚拟机: sudokvm-m256-drivefile=server.img,if=virtio,index=0-bootc-netnic-netuser-nographic-vnc:0 此时,您可以在这个系统上安装定制的软件包,进行系统更新,添加用户或更改配置了。 (二)Ubuntu 执行以下命令: sudoapt-getupdate sudoapt-getupgrade sudoapt-getinstallopenssh-servercloud-init 清除/etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。 sudorm-rf/etc/udev/rules.d/70-persistent-net.rules (三)Fefora 运行如下命令: yumupdate yuminstallopenssh-server chkconfigsshdon 然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件如下所示: DEVICE="eth0" BOOTPROTO=dhcp NM_CONTROLLED="yes" ONBOOT="yes" 清除/etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。 sudorm-rf/etc/udev/rules.d/70-persistent-net.rules 关闭虚拟机。 由于Fedora没有cloud-init或类似软件,您需要亲自进行几步配置使实例可以得到诸如sshkey这样的元数据。 编辑/etc/rc.local文件并且把以下内容粘贴到“touch/var/lock/subsys/local”行前: depmod-a modprobeacpiphp #simpleattempttogettheusersshkeyusingthemeta-dataservice mkdir-p/root/.ssh echo>>/root/.ssh/authorized_keys curl-m10-shttp://169.254.169.254/latest/meta-data/public-keys/0/openssh-key|grep'ssh-rsa'>>/root/.ssh/authorized_keys echo"AUTHORIZED_KEYS:" echo"************************" cat/root/.ssh/authorized_keys echo"************************" (四)OpenSUSE 选择ssh服务,curl以及其他需要的包。 安装ssh服务器: zypperinstallopenssh 安装crul: zypperinstallcurl 使用如下步骤将SshKey注入实例中: 首先,创建文件/etc/init.d/sshkey并且写入下列内容: echo>>/root/.ssh/authorized_keys curl-m10-shttp://169.254.169.254/latest/meta-data/public-keys/0/openssh-key|grep'ssh-rsa'>>/root/.ssh/authorized_keys echo"AUTHORIZED_KEYS:" echo"************************" cat/root/.ssh/authorized_keys echo"************************" 然后,为该文件设置权限: chmod755/etc/init.d/sshkey 将sshkey服务设置为开机自动启动: chkconfigsshkeyon 使用下列命令设置防火墙(而非iptables),令其允许ssh服务: yast2 最后同样地,清除/etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。 sudorm-rf/etc/udev/rules.d/70-persistent-net.rules (五)Debian 安装时选择SSH服务器,Curl及相关软件。 然后进行必要的设置,为key注入而编辑/etc/rc.local文件并增加如下内容: echo>>/root/.ssh/authorized_keys curl-m10-shttp://169.254.169.254/latest/meta-data/public-keys/0/openssh-key|grep'ssh-rsa'>>/root/.ssh/authorized_keys echo"AUTHORIZED_KEYS:" echo"************************" cat/root/.ssh/authorized_keys echo"************************" 同样地,清除/etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。 sudorm-rf/etc/udev/rules.d/70-persistent-net.rules (六)CentOS6及RHEL6 安装时选择SSH服务器,Curl及相关软件。 然后进行必要的设置,为key注入而编辑/etc/rc.local文件并增加如下内容: echo>>/root/.ssh/authorized_keys curl-m10-shttp://169.254.169.254/latest/meta-data/public-keys/0/openssh-key|grep'ssh-rsa'>>/root/.ssh/authorized_keys echo"AUTHORIZED_KEYS:" echo"************************" cat/root/.ssh/authorized_keys echo"************************" 编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件如下所示: DEVICE="eth0" BOOTPROTO=dhcp NM_CONTROLLED="yes" ONBOOT="yes" 同样地,清除/etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。 sudorm-rf/etc/udev/rules.d/70-persistent-net.rules (七)上传Linux镜像 使用如下命令上传镜像: glanceaddname=""is_public=truecontainer_format=ovfdisk_format=qcow2.img 三、创建Windows镜像 第一步,仍然是在Client1上创建一块空镜像,这块镜像用作虚拟机的硬盘,所以请保证留出你所需的空间的大小: kvm-imgcreate-fqcow2windowsserver.img20G (一)安装操作系统 当实例运行时,OpenStack利用virtio接口来使用镜像,于是镜像中的操作系统需要装有virtio驱动。不巧的是,默认WindowsServer2008是没有virtio驱动的。您可以在如下网址:http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin下载装有该驱动的iso镜像并使用该镜像进行安装。 译者注1:Virtio是半虚拟化hypervisor中位于设备之上的抽象层。virtio由RustyRussell开发,virtio是对半虚拟化hypervisor中的一组通用模拟设备的抽象。该设置还允许hypervisor导出一组通用的模拟设备,并通过一个通用的应用编程接口(API)让它们变得可用。[来源:开源中国http://www.oschina.net/p/virtio] 译者注2:该链接的virtio-win是0.1-22版,不能用。下载用1.1.16新版即可。 执行此命令开始安装: sudokvm-m1024-cdromwindows2008.iso-drivefile=windowsserver1.img,if=virtio-bootd-drivefile=virtio-win-0.1-22.iso,index=3,media=cdrom-devicevirtio-net-pci-netnic-netuser-nographic-vnc:5 当安装提示您选择一块硬盘设备步骤时,您并不能看到当前有可用设备。点击左下方的“载入设备(Loaddrivers)”按钮,选择第二CDROM后,含有virtio驱动的硬盘便被加载了。 在安装结束之前,您需要重启系统一次,此时您可以安装其它您所需的软件或执行任何需要的配置更改。除此之外,请务必开放实例中的远程桌面,因为远程桌面将是您连接并使用该实例的唯一途径。同时,Windows防火墙应该相应地设置为对ICMP和RDP开放。 (二)上传Windows镜像 关闭虚拟机并将该镜像使用如下命令上传至OpenStack中: glanceaddname="windows"is_public=truecontainer_format=ovfdisk_format=qcow2 ************************ 第三章,完结[2012-07-12 20:43:00]********************* 五岳之巅原创,如有转载,必须注明出处,否则追究。

优秀的个人博客,低调大师

java B2B2C源码电子商城系统-Kafka快速入门

大家对Kafka有了一些基本了解之后,下面我们来尝试构建一个Kafka服务端,并体验一下基于Kafka的消息生产与消费。环境安装首先,我们需要从官网上下载安装介质。需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 壹零叁八柒柒四六二六在解压Kafka的安装包之后,可以看到其目录结构如下: kafka +-bin +-windows +-config +-libs +-logs +-site-docs 由于Kafka的设计中依赖了ZooKeeper,所以我们可以在bin和config目录中除了看到Kafka相关的内容之外,还有ZooKeeper相关的内容。其中bin目录存放了Kafka和ZooKeeper的命令行工具,bin根目录下是适用于Linux/Unix的shell,而bin/windows下的则是适用于windows下的bat。我们可以根据实际的系统来设置环境变量,以方便后续的使用和操作。而在config目录中,则是用来存放了关于Kafka与ZooKeeper的配置信息。 启动测试下面我们来尝试启动ZooKeeper和Kafka来进行消息的生产和消费。示例中所有的命令均已配置了Kafka的环境变量为例。 启动ZooKeeper,执行命令:zookeeper-server-start config/zookeeper.properties,该命令需要指定zookeeper的配置文件位置才能正确启动,kafka的压缩包中包含了其默认配置,开发与测试环境不需要修改。 [2016-09-28 08:05:34,849] INFO Reading configuration from: config\zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2016-09-28 08:05:34,850] INFO autopurge.snapRetainCount set to 3 (org.apache.zookeeper.server.DatadirCleanupManager) [2016-09-28 08:05:34,851] INFO autopurge.purgeInterval set to 0 (org.apache.zookeeper.server.DatadirCleanupManager) [2016-09-28 08:05:34,851] INFO Purge task is not scheduled. (org.apache.zookeeper.server.DatadirCleanupManager) ... [2016-09-28 08:05:34,940] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory) 从控制台信息中,我们可以看到ZooKeeper从指定的config/zookeeper.properties配置文件中读取信息并绑定2181端口启动服务。有时候启动失败,可查看一下端口是否被占用,可以杀掉占用进程或通过修改config/zookeeper.properties配置文件中的clientPort内容以绑定其他端口号来启动ZooKeeper。 启动Kafka,执行命令:kafka-server-start config/server.properties,该命令也需要指定Kafka配置文件的正确位置,如上命令中指向了解压目录包含的默认配置。若在测试时,使用外部集中环境的ZooKeeper的话,我们可以在该配置文件中通过zookeeper.connect参数来设置ZooKeeper的地址和端口,它默认会连接本地2181端口的ZooKeeper;如果需要设置多个ZooKeeper节点,可以为这个参数配置多个ZooKeeper地址,并用逗号分割。比如:zookeeper.connect=127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002。 创建Topic,执行命令:kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test,通过该命令,创建一个名为“test”的Topic,该Topic包含一个分区一个Replica。在创建完成后,可以使用kafka-topics --list --zookeeper localhost:2181命令来查看当前的Topic。 另外,如果我们不使用kafka-topics命令来手工创建,直接进行下面的内容进行消息创建时也会自动创建Topics来使用。 创建消息生产者,执行命令:kafka-console-producer --broker-list localhost:9092 --topic test。kafka-console-producer命令可以启动Kafka基于命令行的消息生产客户端,启动后可以直接在控制台中输入消息来发送,控制台中的每一行数据都会被视为一条消息来发送。我们可以尝试输入几行消息,由于此时并没有消费者,所以这些输入的消息都会被阻塞在名为test的Topics中,直到有消费者将其消费掉位置。 创建消息消费者,执行命令:kafka-console-consumer --zookeeper localhost:2181 --topic test --from-beginning。kafka-console-consumer命令启动的是Kafka基于命令行的消息消费客户端,在启动之后,我们马上可以在控制台中看到输出了之前我们在消息生产客户端中发送的消息。我们可以再次打开之前的消息生产客户端来发送消息,并观察消费者这边对消息的输出来体验Kafka对消息的基础处理。 整合Spring Cloud Bus在上一篇使用Rabbit实现消息总线的案例中,我们已经通过引入spring-cloud-starter-bus-amqp模块,完成了使用RabbitMQ来实现的消息总线。若我们要使用Kafka来实现消息总线时,只需要把spring-cloud-starter-bus-amqp替换成spring-cloud-starter-bus-kafka模块,在pom.xml的dependenies节点中进行修改,具体如下: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-kafka</artifactId> </dependency> 如果我们在启动Kafka时均采用了默认配置,那么我们不需要再做任何其他配置就能在本地实现从RabbitMQ到Kafka的切换。我们可以尝试把刚刚搭建的ZooKeeper、Kafka启动起来,并将修改为spring-cloud-starter-bus-kafka模块的config-server和config-client启动起来。 在config-server启动时,我们可以在控制台中看到如下输出: 2016-09-28 22:11:29.627 INFO 15144 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder : Using kafka topic for outbound: springCloudBus 2016-09-28 22:11:29.642 INFO 15144 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Starting ZkClient event thread. ... 016-09-28 22:11:30.290 INFO 15144 --- [ main] o.s.i.kafka.support.ProducerFactoryBean : Using producer properties => {bootstrap.servers=localhost:9092, linger.ms=0, acks=1, compression.type=none, batch.size=16384} 2016-09-28 22:11:30.298 INFO 15144 --- [ main] o.a.k.clients.producer.ProducerConfig : ProducerConfig values: ... 2016-09-28 22:11:30.322 INFO 15144 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$1 : Adding {message-handler:outbound.springCloudBus} as a subscriber to the 'springCloudBusOutput' channel 2016-09-28 22:11:31.467 INFO 15144 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$7 : Adding {message-handler:inbound.springCloudBus.anonymous.8b9e6c7b-6a50-48c5-b981-8282a0d5a30b} as a subscriber to the 'bridge.springCloudBus' channel 2016-09-28 22:11:31.467 INFO 15144 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$7 : started inbound.springCloudBus.anonymous.8b9e6c7b-6a50-48c5-b981-8282a0d5a30b 从控制台的输出内容,我们可以看到config-server连接到了Kafka中,并使用了名为springCloudBus的Topic。 此时,我们可以使用kafka-topics --list --zookeeper localhost:2181命令来查看当前Kafka中的Topic,若已成功启动了config-server并配置正确,我们就可以在Kafka中看到已经多了一个名为springCloudBus的Topic。 我们再启动配置了spring-cloud-starter-bus-kafka模块的config-client,可以看到控制台中输出如下内容: 2016-09-28 22:43:55.067 INFO 6136 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder : Using kafka topic for outbound: springCloudBus 2016-09-28 22:43:55.078 INFO 6136 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Starting ZkClient event thread. ... 2016-09-28 22:50:38.584 INFO 828 --- [ main] o.s.i.kafka.support.ProducerFactoryBean : Using producer properties => {bootstrap.servers=localhost:9092, linger.ms=0, acks=1, compression.type=none, batch.size=16384} 2016-09-28 22:50:38.592 INFO 828 --- [ main] o.a.k.clients.producer.ProducerConfig : ProducerConfig values: ... 2016-09-28 22:50:38.615 INFO 828 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$1 : Adding {message-handler:outbound.springCloudBus} as a subscriber to the 'springCloudBusOutput' channel 2016-09-28 22:50:38.616 INFO 828 --- [ main] o.s.integration.channel.DirectChannel : Channel 'didispace:7002.springCloudBusOutput' has 1 subscriber(s). 2016-09-28 22:50:38.616 INFO 828 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$1 : started outbound.springCloudBus ... 2016-09-28 22:50:39.162 INFO 828 --- [ main] s.i.k.i.KafkaMessageDrivenChannelAdapter : started org.springframework.integration.kafka.inbound.KafkaMessageDrivenChannelAdapter@60cf855e 2016-09-28 22:50:39.162 INFO 828 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$7 : Adding {message-handler:inbound.springCloudBus.anonymous.f8fc9c0c-ccd3-46dd-9537-07198f4ee216} as a subscriber to the 'bridge.springCloudBus' channel 2016-09-28 22:50:39.163 INFO 828 --- [ main] o.s.c.s.b.k.KafkaMessageChannelBinder$7 : started inbound.springCloudBus.anonymous.f8fc9c0c-ccd3-46dd-9537-07198f4ee216 可以看到,config-client启动时输出了类似的内容,他们都订阅了名为springCloudBus的Topic。 在启动了config-server和config-client之后,为了更明显地观察消息总线刷新配置的效果,我们可以在本地启动多个不同端口的config-client。此时,我们的config-server以及多个config-client都已经连接到了由Kafka实现的消息总线上。我们可以先访问各个config-client上的/from请求,查看他获取到的配置内容。然后,修改Git中对应的参数内容,再访问各个config-client上的/from请求,可以看到配置内容并没有改变。最后,我们向config-server发送POST请求:/bus/refresh,此时我们再去访问各个config-client上的/from请求,就能获得到最新的配置信息,各客户端上的配置都已经加载为最新的Git配置内容。 从config-client的控制台中,我们可以看到如下内容: 2016-09-29 08:20:34.361 INFO 21256 --- [ kafka-binder-1] o.s.cloud.bus.event.RefreshListener : Received remote refresh request. Keys refreshed [from] RefreshListener监听类记录了收到远程刷新请求,并刷新了from属性的日志。在上面的例子中,由于Kafka、ZooKeeper均运行于本地,所以我们没有在测试程序中通过配置信息来指定Kafka和ZooKeeper的配置信息,就完成了本地消息总线的试验。但是我们实际应用中,Kafka和ZooKeeper一般都会独立部署,所以在应用中都需要来为Kafka和ZooKeeper配置一些连接信息等。Kafka的整合与RabbitMQ不同,在Spring Boot 1.3.7中并没有直接提供的Starter模块,而是采用了Spring Cloud Stream的Kafka模块,所以对于Kafka的配置均采用了spring.cloud.stream.kafka的前缀。java B2B2C springmvc mybatis多租户电子商城系统

优秀的个人博客,低调大师

云服务器 ECS 快速入门:Linux 格式化和挂载数据盘

Linux 格式化和挂载数据盘 如果您已经为 ECS 实例配了数据盘,您需要先格式化数据盘并挂载文件系统后才能正常使用数据盘。 注意: 磁盘分区和格式化是高风险行为,请慎重操作。本文档描述如何处理一个新买的数据盘,如果您的数据盘上有数据,请务必对数据盘创建快照以避免可能的数据丢失。 云服务器 ECS 仅支持对 数据盘 进行分区,而不支持对 系统盘 进行分区。如果您强行使用第三方工具对系统盘进行分区操作,可能引发未知风险,如系统崩溃、数据丢失等。 本文描述如何用一个新的数据盘创建一个单分区数据盘并挂载文件系统。 您还可以根据业务需要,对数据盘进行多分区配置。建议使用系统自带的工具进行分区操作。 操作须知 单独 购买的数据盘 需要先 挂载数据盘,然后才能格式化。 随实例时一起购买的数据盘,无需挂载,直接格式化。 您需要知道挂载到实例的数据盘的设备名:您可

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册