首页 文章 精选 留言 我的

精选列表

搜索[后台会话],共10000篇文章
优秀的个人博客,低调大师

Simple Admin - Go 语言分布式后台管理系统 v0.2.7 发布,重大更新

Simple Admin Core v0.2.7发布 主要更新: 1. pkg 大部分包移至 simple admin common 并适配代码 2. 新增定时任务模块接口 3. 优化了用户更新逻辑及鉴权中间件 Simple Admin Tool v0.2.7 发布 主要更新: 1. 优化ent代码生成模板,依赖由simple admin core 变更为 simple admin common 2. 优化i18n代码生成,目前i18n的lang已改为从ctx中获取,查看core的handler 和 logic 的变化 3. api proto代码生成新增 json_style选项,用来控制生成的json tag 的格式,默认为小驼峰 4. 优化了部分测试用例 5. 合并go zero最新代码 6. statuserr 移至 errorx 7.修复ent代码生成部分bug Simple Admin Job v0.2.7 发布 主要更新: 1. 新增基于asynq 的在线定时任务模块 Simple Admin Backend UI v0.2.7 发布 主要更新; 1. 新增定时任务页面 定时任务文档地址https://doc.ryansu.pro/zh/guide/official-comp/cron.html

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

Simple Admin 分布式后台管理系统 v0.2.2 发布,支持 proto 文件拆分

simple admin tools v0.1.8更新 主要更新: 1. proto文件拆分 2. 优化ent代码生成拆分文件 3. 合并go zero最新代码 4. 优化代码生成逻辑 5. 迁移gorm支持至simple utils 注意:新版本支持拆分和不拆分两种模式,如果rpc项目根目录有desc文件夹,则在gen-rpc时先合并desc内的proto文件至根目录下的proto文件再生成,有desc文件夹则根目录下的proto文件无需编辑 simple admin core v0.2.2更新 主要更新: rpc服务适配proto文件拆分 simple admin backend ui v0.2.2 更新 主要更新: 1. 优化submit方法,简化代码 example 项目更新: example项目都已拆分proto文件 example地址: https://github.com/suyuan32/simple-admin-example-rpc 文档更新: rpc微服务文档更新,新增proto拆分参数,详情查看文档 RPC微服务生成文档

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

接口工具 APIAuto 3.0.0 发布,自动补全•快捷键•后台测试•自动生成代码等

APIAuto-机器学习 HTTP 接口工具 更新内容: 机器学习零代码测试: 新增执行脚本,包括 请求|账号|全局、前置|后置; 新增支持在 Node 环境下以 Headless 无 UI 模式执行; 随机与顺序测试: 新增总体数据统计,可按颜色筛选; 添加配置弹窗新增 发布简单接口 按钮,对应 apijson-router 映射请求; 自动静态检查: 支持 apijson-router 映射请求; 完善对 APIJSON 各种关键词的支持; 自动生成代码: 新增自动智能补全,可筛选选项列表; 新增一键生成 APIJSON 单表增删改查的请求 URL 和 JSON; 新增对非开放请求生成 APIJSON 的 URL 和 JSON; 新增支持 Access 表中配置的表增删改查角色权限; 新增点远程函数示例生成示例; 新增点字段名生成查询字段值; 快捷键 新增 Ctrl + I 或 Command + I 格式化 JSON,清除所有注释和无效空格、换行等; 新增 Ctrl + / 或 Command + / 对选中行 新增行注释 或 取消行注释; 新增 Ctrl + D 或 Command + D 删除 选中行; 新增 Ctrl + S 或 Command + S 保存当前请求; 新增支持粘贴 Chrome 和 Charles 格式的抓包信息到 URL 输入框,自动转换和填充 JSON, Header 输入框; 新增对回车、删除、Tab 的自动适配; 其它 新增被 腾讯 TEG 工具开发组、微信支付、腾讯 IEG 游戏平台部、CDG 金融支付组 等邀请分享的部分 PPT 内容和 GIF 图; 分享演讲新增 QECon 全球软件质量&效能大会 的零代码开发和测试; 视频新增 质效无双线上技术访谈,推荐新增 别再生成测试代码了; 分享:新增支持分享 APIAuto 链接,方便开发协作和完善文档的 APIAuto 链接; APIAuto 简介 敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释。 提供集 文档、测试、Mock、调试、管理 于一体的一站式体验,还有一键 格式化、注释/取消注释 等高效易用的快捷键。 在常用功能上远超 Postman, Swagger, YApi, Rap 等其它各种 开源、商业 的 API 文档/测试 工具。 支持 HTTP GET/POST API,智能显示和切换;支持一键导入 Swagger, Rap, YApi 的用例和文档。 不仅适用于 RESTful、类 RESTful、GRPC 的 API,还是腾讯APIJSON官方建议的文档与测试工具。 腾讯内部用户包括 IEG 互动娱乐事业群、TEG 技术工程事业群、CSIG 云与智慧事业群 等, 外部用户包含 工商银行某地分行、500强上市公司传音、跨境电商龙头 SHEIN、行业领头羊社保科技 等。 现场录播回放视频:QECon大会-零代码开发和测试(APIJSON和APIAuto) https://www.bilibili.com/video/BV1yv411p7Y4 创作不易,右上角点 ⭐Star 支持下本项目吧,谢谢^_^ https://gitee.com/TommyLemon/APIAuto

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

JFinal 参数校验插件扩展,让后台参数校验像js一样方式好用

一、插件实现 插件的功能就是加载校验规则,实现代码如下 package com.nmtx.plugins.validation; import java.util.Properties; import com.jfinal.core.Const; import com.jfinal.kit.Prop; import com.jfinal.kit.PropKit; import com.jfinal.plugin.IPlugin; public class ValidationPlugin implements IPlugin{ protected Prop prop = null; public ValidationPlugin(String fileName) { prop = PropKit.use(fileName, Const.DEFAULT_ENCODING); } public ValidationPlugin(String fileName, String encoding) { prop = PropKit.use(fileName, encoding); } /** * 初始化校验规则 */ public boolean start() { Properties properties = prop.getProperties(); for (Object object : properties.keySet()) { String key = (String) object; String rule[] = properties.getProperty(key).split(","); ValidationRules.ruleMap.put(key, rule[0]); ValidationRules.ruleErrorMessageMap.put(key,rule[1]); } return true; } public boolean stop() { return true; } } package com.nmtx.plugins.validation; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import com.jfinal.kit.StrKit; public class ValidationRules { static Map<String, String> ruleMap = new HashMap<String,String>(); static Map<String, String> ruleErrorMessageMap = new HashMap<String,String>(); public static boolean isMatch(String rule, String value) { boolean matchResult; if(rule.equals("required")){ matchResult = StrKit.notBlank(value); }else { if(StrKit.notBlank(value))matchResult = Pattern.compile(ruleMap.get(rule)).matcher(value).matches(); else matchResult = true; } return matchResult; } public static String getErrorMessage(String rule){ return ruleErrorMessageMap.get(rule); } } 规则加载后就是如何拦截校验了,这里用拦截器实现大概如下 package com.nmtx.plugins.validation; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import com.jfinal.aop.Duang; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.jfinal.kit.StrKit; import com.nmtx.common.ErrorCode; import com.nmtx.common.MessageResp; import com.nmtx.controller.para.IParaFormat; import com.nmtx.controller.para.impl.HumpToMiddleScoreFormat; public class ValidatorInterceptor implements Interceptor { private IParaFormat humpParaFormat = Duang.duang("humpParaFormat", HumpToMiddleScoreFormat.class); public void intercept(Invocation inv) { String methodName = inv.getMethodName(); Controller controller = inv.getController(); Method[] methods = controller.getClass().getDeclaredMethods(); boolean matchResult = true; for (Method method : methods) { if (method.getName().equals(methodName)) { boolean hasAnnotation = method.isAnnotationPresent(Validation.class); if (hasAnnotation) { Validation anno = method.getAnnotation(Validation.class); Map<String, String> ruleMap = dealRule(anno.rules()); for (String key : ruleMap.keySet()) { String value = controller.getPara(humpParaFormat.paraToFormat(key)); String rule = ruleMap.get(key); matchResult = ValidationRules.isMatch(rule, value); MessageResp<String> message = new MessageResp<String>(); message.setCode(ErrorCode.ERROR); if (!matchResult) { message.setMessage(humpParaFormat.paraToFormat(key)+ValidationRules.getErrorMessage(rule)); message.setData(""); controller.renderJson(message); break; } } } } } if (matchResult) inv.invoke(); } public Map<String, String> dealRule(String rules) { Map<String, String> map = new IdentityHashMap<String, String>(); if (StrKit.notBlank(rules)) { String[] paraRules = rules.split(";"); for (String paraRule : paraRules) { String[] para = paraRule.split("="); map.put(para[0], para[1]); } } return map; } } 有了拦截器,拦截的方法肯定需要注解了,注解实现如下 package com.nmtx.plugins.validation; import java.lang.annotation.*; /** * 定义Validator规则的注解 * @author lianghao * */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Validation { String rules (); } 这样拦截插件构造就完成了 二,使用篇 添加插件 /** * 定义插件,如数据库连接等一些插件 */ @Override public void configPlugin(Plugins me) { me.add(new ValidationPlugin("validation.properties")); } 添加全局拦截 /** * 必须按这种顺序,不允许改,不得在新增新的全局拦截器 */ @Override public void configInterceptor(Interceptors me) { me.add(new ValidatorInterceptor()); } 只需一个注解就搞定参数校验,demo如下 @Validation(rules = "userName=required;password=required") public void login() { } 需要什么规则还可以自己加在配置文件里,附上一些常用的校验 email=^\w+([-+.]\w+)@\w+([-.]\w+)\.\w+([-.]\w+)*$,"邮箱格式不正确" chinese=^[\u4e00-\u9fa5]+$,"不是中文" number=^[0-9]*$,"只能输入数字" phone=^1+[0-9]{10}$,"号码格式不正确" idcard=^(\d{15}|\d{18})$,"身份证号码不正确"//15或18位 postCode=^[0-9]{6}$,"邮政编码格式不正确" url=[a-zA-z]+://[^\s]*,"url格式不对" date=[0-9]{4}-[0-9]{2}-[0-9]{2},"时间格式不对(yyyy-mm-dd)" creditcard=^((?:4\d{3})|(?:5[1-5]\d{2})|(?:6011)|(?:3[68]\d{2})|(?:30[012345]\d),"信用卡格式不正确" acceptImg=[.](jpg|gif|bmp|png)$,"图片后缀名格式不正确" acceptFile=[.](xls|xlsx|csv|txt)$,"文件后缀名格式不正确" required=required,"参数不能为空"

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

基于django的视频点播网站开发-step11-后台用户管理功能

用户管理功能,包含用户添加、列表展示、编辑、删除四大功能。下面我们一一揭晓。 用户添加 我们先实现用户添加功能,我们现在urls.py下添加相关的路由 path('user_add/', views.UserAddView.as_view(), name='user_add'), path('user_list/', views.UserListView.as_view(), name='user_list'), path('user_edit/<int:pk>',views.UserEditView.as_view(), name='user_edit'), path('user_delete/', views.user_delete, name='user_delete'), 用户添加的视图类是UserAddView class UserAddView(SuperUserRequiredMixin, generic.View): def get(self, request): form = UserAddForm() return render(self.request, 'myadmin/user_add.html', {'form': form}) def post(self, request): form = UserAddForm(data=request.POST) if form.is_valid(): user = form.save(commit=False) password = form.cleaned_data.get('password') user.set_password(password) user.save() return render(self.request, 'myadmin/user_add_success.html') return render(self.request, 'myadmin/user_add.html', {'form': form}) 这是一个普通的视图类,通过get()和post()来完成用户添加的功能,get里面负责页面的展示,post里面负责逻辑处理。在get中,初始化form为UserAddForm,因为添加的用户是有类别的,所以我们在UserAddForm中应用了is_staff字段来表示管理员。在post中,我们通过user.set_password(password)来设置新密码。user.save()来保存记录到数据库。保存成功后会跳转到myadmin/user_add_success.html页面。 用户列表 用户添加成功后,当你点击用户列表,即可看到用户列表数据,用户列表我们配置的路由是 path('user_list/', views.UserListView.as_view(), name='user_list'), 使用的是UserListView视图类,该类是继承自ListView通用视图类的。因此 只需要我们简单的配置几下,就能实现列表功能。UserListView代码如下 class UserListView(AdminUserRequiredMixin, generic.ListView): model = User template_name = 'myadmin/user_list.html' context_object_name = 'user_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(UserListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return User.objects.filter(username__contains=self.q).order_by('-date_joined') 我们知道ListView是有多个回调函数的,这里就是通过get_context_data()和get_queryset()回调函数来实现列表中的功能的。在get_context_data()中实现了列表分页功能,在get_queryset()中实现了搜索功能。 配置的模板是myadmin/user_list.html,显示效果如下 用户编辑 当你点击编辑按钮的时候,即可进入编辑页面。对应的路由是 path('user_edit/<int:pk>',views.UserEditView.as_view(), name='user_edit'), 即UserEditView class UserEditView(SuperUserRequiredMixin, generic.UpdateView): model = User form_class = UserEditForm template_name = 'myadmin/user_edit.html' def get_success_url(self): messages.success(self.request, "保存成功") return reverse('myadmin:user_edit', kwargs={'pk': self.kwargs['pk']}) 同样是继承自UpdateView,仅需要配置好model、form_class、template_name即可,简单至极。 效果如下 用户删除 当你点击删除按钮的时候,会弹出确认框让你删除。然后网站通过ajax调用user_delete来实现真正的删除操作,其中,ajax代码位于static/js/myadmin/user_list.js 真正的删除函数是user_delete,下面是它的真面目 @ajax_required @require_http_methods(["POST"]) def user_delete(request): user_id = request.POST['user_id'] instance = User.objects.get(id=user_id) instance.delete() return JsonResponse({"code": 0, "msg": "success"}) 首先获取到当前用户的实例,然后通过 instance.delete() 删除之。

资源下载

更多资源
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文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册