Quasar Sika Design Admin 是一个企业级中后台前端 / 设计解决方案,中后台管理模板,我们秉承 Ant Design 的设计价值观,致力于在设计规范和基础组件的基础上,继续向上构建,提炼出典型模板 / 业务组件 / 配套设计资源,进一步提升企业级中后台产品设计研发过程中的『用户』和『设计者』的体验。
起于 Sika Design,不止于 Sika Design,每一个细节都是极致体验 愿景:开源改变世界,Sika Design Admin 让世界没有难写的代码。
- quasar-sika-design-admin - quasar-sika-design // 前端-基于vue+quasar构建 - quasar-sika-design-server // 后端服务-基于springboot+mybatis - doc // 文档说明 - sql // sql脚本 - quasar-sika-design-server-common // 基础公共模块;包括业务的constant+dto+query以及baseDTO+baseSrvice等等 - quasar-sika-design-server-core // 核心业务模块;包括业务的service,核心领域实现逻辑等等 - quasar-sika-design-server-ataaccess // 数据库访问层 - quasar-sika-design-server-generator // 代码生成器模块【无须开发】 - quasar-sika-design-server-web // controller层 - sika-code-cor // 核心公共组件,包括且不限于缓存组件、代码生成器组件、公共组件、数据访问、分布式锁、脚手架规范 - cache // 缓存组件 - code-generator // 代码生成器组件 - common // 公共组件 - databasse // 数据库访问组件 - hutool-starter // hutool基础集成 - lock // 分布式组件 - standard-footer // 标准脚手架组件
技术 | 官网 | 备注 |
---|---|---|
Spring Framework | http://projects.spring.io/spring-framework/ | 容器 |
spring-boot-dependencies | https://spring.io/projects/spring-boot/ | 不解释 |
Apache Shiro | http://shiro.apache.org/ | 安全框架 |
MyBatis | http://www.mybatis.org/mybatis-3/zh/index.html | ORM框架 |
MyBatisPlus | https://mp.baomidou.com/ | ORM增强框架 |
Mybatis-plus-boot-starter | https://mp.baomidou.com/ | ORM增强框架 |
Mybatis-Plus-Generator | https://baomidou.gitee.io/mybatis-plus-doc/#/generate-code/ | ORM增强框架 |
HikariCP | https://github.com/brettwooldridge/HikariCP/ | 数据库连接池 |
ShardingSphere | https://shardingsphere.apache.org/ | 分库分表组件 |
Redis | https://redis.io/ | 分布式缓存数据库 |
commons-collections | http://commons.apache.org/proper/commons-collections/ | 集合工具组件 |
Log4J | http://logging.apache.org/log4j/1.2/ | 日志组件 |
FastJson | https://mvnrepository.com/artifact/com.alibaba/fastjson/ | JSON序列化和反序列化组件 |
Lombok | https://www.projectlombok.org/ | 简化JAVA代码组件 |
Hutool | http://hutool.mydoc.io/ | 符合国人习惯的工具组件 |
MapStruct | http://mapstruct.org/ | 实体转化组件 |
技术 | 官网 | 备注 |
---|---|---|
Vue | https://cn.vuejs.org/ | 渐进式JavaScript 框架 |
Quasar | http://www.quasarchs.com/ | 基于Vue实现的前端UI框架 |
Echarts | https://echarts.apache.org/zh/index.html/ | 基于 JavaScript 的开源可视化图表库 |
Lodashi | https://www.lodashjs.com/ | 一致性、模块化、高性能的 JavaScript 实用工具库 |
基于 Quasar 实现的 Quasar Sika Design_Admin
package com.quasar.sika.design.server.business.menu.controller; import java.util.List; import com.sika.code.result.Result; import com.sika.code.standard.base.controller.BaseStandardController; import com.quasar.sika.design.server.business.menu.service.MenuService; import com.quasar.sika.design.server.business.menu.pojo.dto.MenuDTO; import com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 菜单权限表 前端控制器 * </p> * * @author daiqi * @since 2021-01-07 23:35:13 */ @RestController(value = "menuController") @RequestMapping("menu") public class MenuController extends BaseStandardController { @Autowired private MenuService menuService; @RequestMapping(value = "save") public Result save(@RequestBody MenuDTO menuDto) { return super.success(menuService.save(menuDto)); } @RequestMapping(value = "save_batch") public Result saveBatch(@RequestBody List<MenuDTO> menuDtos) { return super.success(menuService.saveForBatch(menuDtos)); } @RequestMapping(value = "update_by_id") public Result updateById(@RequestBody MenuDTO menuDto) { return super.success(menuService.updateById(menuDto)); } @RequestMapping(value = "page") public Result page(@RequestBody MenuQuery menuQuery) { return super.success(menuService.page(menuQuery)); } @RequestMapping(value = "find") public Result find(@RequestBody MenuQuery menuQuery) { return super.success(menuService.find(menuQuery)); } @RequestMapping(value = "list") public Result list(@RequestBody MenuQuery menuQuery) { return super.success(menuService.list(menuQuery)); } }
package com.quasar.sika.design.server.business.menu.service; import com.quasar.sika.design.server.business.menu.pojo.dto.MenuDTO; import com.sika.code.standard.base.service.BaseStandardService; import java.util.List; /** * <p> * 菜单权限表 服务类 * </p> * * @author daiqi * @since 2021-01-07 23:35:09 */ public interface MenuService extends BaseStandardService<MenuDTO> { }
package com.quasar.sika.design.server.business.menu.service.impl; import cn.hutool.core.collection.CollUtil; import com.google.common.collect.Lists; import com.quasar.sika.design.server.business.menu.convert.MenuConvert; import com.quasar.sika.design.server.business.menu.entity.MenuEntity; import com.quasar.sika.design.server.business.menu.mapper.MenuMapper; import com.quasar.sika.design.server.business.menu.pojo.dto.MenuDTO; import com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery; import com.quasar.sika.design.server.business.menu.service.MenuService; import com.quasar.sika.design.server.business.rolemenu.service.RoleMenuService; import com.sika.code.standard.base.convert.BaseConvert; import com.sika.code.standard.base.service.impl.BaseStandardServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Set; /** * <p> * 菜单权限表 服务实现类 * </p> * * @author daiqi * @since 2021-01-07 23:35:10 */ @Service(value = "menuService") public class MenuServiceImpl extends BaseStandardServiceImpl<MenuMapper, MenuEntity, MenuDTO> implements MenuService { @Autowired private MenuMapper menuMapper; @Override protected BaseConvert<MenuEntity, MenuDTO> convert() { return MenuConvert.INSTANCE; } }
package com.quasar.sika.design.server.business.menu.mapper; import com.quasar.sika.design.server.business.menu.entity.MenuEntity; import org.springframework.stereotype.Repository; import com.sika.code.standard.base.basemapper.BaseStandardMapper; /** * <p> * 菜单权限表 Mapper 接口 * </p> * * @author daiqi * @since 2021-01-07 23:35:08 */ @Repository public interface MenuMapper extends BaseStandardMapper<MenuEntity> { }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.quasar.sika.design.server.business.menu.mapper.MenuMapper"> <!-- 通用查询映射结果 --> <resultMap id="ResultMap" type="com.quasar.sika.design.server.business.menu.entity.MenuEntity"> <result column="id" property="id" /> <result column="create_by" property="createBy" /> <result column="update_by" property="updateBy" /> <result column="create_date" property="createDate" /> <result column="update_date" property="updateDate" /> <result column="version" property="version" /> <result column="available" property="available" /> <result column="is_deleted" property="isDeleted" /> <result column="remark" property="remark" /> <result column="menu_name" property="menuName" /> <result column="parent_id" property="parentId" /> <result column="order_num" property="orderNum" /> <result column="url" property="url" /> <result column="target" property="target" /> <result column="menu_type" property="menuType" /> <result column="visible" property="visible" /> <result column="perms" property="perms" /> <result column="icon" property="icon" /> </resultMap> <!-- 通用查询结果列 --> <sql id="columnList"> id, create_by, update_by, create_date, update_date, version, available, is_deleted, remark, menu_name, parent_id, order_num, url, target, menu_type, visible, perms, icon </sql> <!-- 根据查询条件获取列表信息 --> <select id="listByQuery" resultMap="ResultMap" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT <include refid="columnList" /> FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> </select> <!-- 根据查询条件获取Id列表信息 --> <select id="listIdByQuery" resultType="java.lang.Long" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT id FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> </select> <!-- 根据查询条件获取实体信息 --> <select id="findByQuery" resultMap="ResultMap" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT <include refid="columnList" /> FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> LIMIT 1 </select> <!-- 根据查询条件获取表id --> <select id="findIdByQuery" resultType="java.lang.Long" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT id FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> LIMIT 1 </select> <!-- 根据查询条件获取分页信息 --> <select id="pageByQuery" resultMap="ResultMap" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT <include refid="columnList" /> FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> <include refid="order_by_sql"/> </select> <!-- 根据查询条件获取总数量信息 --> <select id="totalCountByQuery" resultType="Integer" parameterType="com.quasar.sika.design.server.business.menu.pojo.query.MenuQuery" > SELECT count(*) FROM sika_menu <where> is_deleted = 0 <include refid="query_sql" /> </where> </select> <!-- 根据查询条件SQL --> <sql id="query_sql" > <if test="query.id != null">AND id = #{query.id}</if> <if test="query.menuId != null">AND id = #{query.menuId}</if> <if test="query.menuName != null">AND menu_name = #{query.menuName}</if> <if test="query.parentId != null">AND parent_id = #{query.parentId}</if> <if test="query.orderNum != null">AND order_num = #{query.orderNum}</if> <if test="query.url != null">AND url = #{query.url}</if> <if test="query.target != null">AND target = #{query.target}</if> <if test="query.menuType != null">AND menu_type = #{query.menuType}</if> <if test="query.visible != null">AND visible = #{query.visible}</if> <if test="query.perms != null">AND perms = #{query.perms}</if> <if test="query.icon != null">AND icon = #{query.icon}</if> <if test="query.ids != null and query.ids.size() > 0"> AND id in <foreach item="item" collection="query.ids" separator="," open="(" close=")" index=""> #{item} </foreach> </if> </sql> <!-- 排序的sql --> <sql id="order_by_sql"> <if test="query.sortColumn != null and query.sortType != null" > ORDER BY <include refid="order_by_column_sql"/> <include refid="order_by_type_sql"/> </if> </sql> <!-- 排序列名的sql --> <sql id="order_by_column_sql"> <choose> <when test="query.sortColumn == 'menuId'"> id </when> <otherwise> id </otherwise> </choose> </sql> <!-- 排序类型的sql --> <sql id="order_by_type_sql"> <choose> <when test="query.sortType == 'DESC'"> DESC </when> <otherwise> ASC </otherwise> </choose> </sql> </mapper>
package com.quasar.sika.design.server.common.auth.context; import com.quasar.sika.design.server.common.auth.executor.AuthRegisterRequestExecutor; import com.quasar.sika.design.server.common.auth.pojo.request.AuthRegisterRequest; import com.quasar.sika.design.server.common.captcha.pojo.request.CaptchaCheckRequest; import com.quasar.sika.design.server.common.mail.context.CheckMailCodeContext; import com.quasar.sika.design.server.common.mail.pojo.request.CheckMailRequest; import com.quasar.sika.design.server.common.shiro.util.SHA256Util; import com.sika.code.standard.base.pojo.context.BaseStandardContext; import com.sika.code.standard.base.pojo.executor.BaseStandardExecutor; import lombok.Data; import lombok.experimental.Accessors; /** * @author daiqi * @create 2021-01-09 18:02 */ @Data @Accessors(chain = true) public class AuthRegisterContext extends BaseStandardContext { private AuthRegisterRequest registerRequest; private CheckMailRequest checkMailRequest; protected CaptchaCheckRequest captchaCheckRequest; private CheckMailCodeContext checkMailCodeContext; private Boolean bindOauthUser; @Override public void initCustomer() { checkMailCodeContext = new CheckMailCodeContext().setRequest(checkMailRequest); registerRequest.setPassword(SHA256Util.sha256(registerRequest)); } @Override protected Class<? extends BaseStandardExecutor> buildExecutorClass() { return AuthRegisterRequestExecutor.class; } }
package com.quasar.sika.design.server.common.auth.executor; import cn.hutool.core.util.BooleanUtil; import com.quasar.sika.design.server.common.auth.context.AuthRegisterContext; import com.quasar.sika.design.server.common.auth.domain.AuthDomain; import com.quasar.sika.design.server.common.auth.pojo.request.AuthLoginRequest; import com.quasar.sika.design.server.common.auth.pojo.request.AuthRegisterRequest; import com.quasar.sika.design.server.common.auth.pojo.response.AuthResponse; import com.sika.code.basic.pojo.dto.ServiceResult; import com.sika.code.exception.BusinessException; import com.sika.code.standard.base.pojo.executor.BaseStandardExecutor; import lombok.Data; import lombok.experimental.Accessors; /** * @author daiqi * @create 2021-01-09 18:02 */ @Data @Accessors(chain = true) public class AuthRegisterRequestExecutor extends BaseStandardExecutor<AuthRegisterContext> implements AuthDomain { @Override protected void executeBefore() { verify(); } protected void verify() { // 图片验证码校验 captchaService().checkCaptchaVerifyCode(context.getCaptchaCheckRequest()); // 邮箱验证码校验 executorManager().execute(context.getCheckMailCodeContext()); // 校验用户名 AuthRegisterRequest registerRequest = context.getRegisterRequest(); authService().checkRegisterUsername(registerRequest); // 校验邮箱 authService().checkRegisterEmail(registerRequest); // 校验手机号 authService().checkRegisterPhone(registerRequest); } @Override protected ServiceResult doExecute() { AuthRegisterRequest registerRequest = context.getRegisterRequest(); boolean saveSuccess = userService().save(registerRequest); if (BooleanUtil.isFalse(saveSuccess)) { throw new BusinessException("保存失败,请校验注册参数"); } return ServiceResult.newInstanceOfSucResult(AuthResponse.success(registerRequest)); } @Override protected void executeAfter() { // 自动登录 AuthRegisterRequest registerRequest = context.getRegisterRequest(); AuthLoginRequest request = new AuthLoginRequest(registerRequest.getUsername(), registerRequest.getPassword()); request.setEncryptedPassword(true); if (BooleanUtil.isTrue(context.getBindOauthUser())) { authService().bindOauthUser(request); } else { authService().login(request); } // 移除缓存 captchaService().removeCaptchaVerifyCode(context.getCaptchaCheckRequest()); mailService().removeMailCode(context.getCheckMailRequest()); } }
请注意,我们强烈建议本项目使用 Yarn 包管理工具,这样可以与本项目演示站所加载完全相同的依赖版本 (yarn.lock) 。由于我们没有对依赖进行强制的版本控制,采用非 yarn 包管理进行引入时,可能由于 Pro 所依赖的库已经升级版本而引入了新版本所导致的问题。作者可能会由于时间问题无法及时排查而导致您采用本项目作为基项目而出现问题。
git clone https://github.com/dq-open-cloud/quasar-sika-design.git
cd quasar-sika-design
yarn install
quasar dev
quasar build
yarn run lint
文档待完善
启动步骤
关于 Issue 反馈 (重要!重要!重要!) 请在开 Issue 前,先阅读该内容:Issue / PR 编写建议
项目使用的 quasar-cli, 请确保你所使用的 quasar-cli 是新版,并且已经学习 cli 官方文档使用教程
关闭 Eslint (不推荐) 移除 package.json
中 eslintConfig
整个节点代码, vue.config.js
下的 lintOnSave
值改为 false
用于生产环境,请使用 release
版本代码,使用 master 代码出现的任何问题需要你自行解决
后端提供的Mysql
和Redis
环境属于线上测试环境,内测阶段请大家一定不要随意增删字段
IE / Edge | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|
IE10, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
This project exists thanks to all the people who contribute.
URL:http://www.ambysoft.com/essays/userInterfaceDesign.html#Principles A fundamental reality of application development is that the user interface is the system to the users. What users want is for d
# Quasar App > WIP #开发命令 # 运行开发服务器(使用默认主题) $ quasar dev # 运行开发服务器(使用特定主题) $ quasar dev -t mat $ quasar dev -t ios # 运行在特定端口 $ quasar dev -p 9090 # PWA模式 $ quasar dev -m pwa
GUI Design Studio - User Interface Design and Software Prototyping Tools https://www.carettasoftware.com/ GUI Design Studio is a specialised software design tool for anyone involved in application use
本来想写一篇博客专门介绍Quasar的Layout组件,写了一半发现都是在废话 因为官方做了一个Layout Builder,专门用来配置layout,而且可以导出代码,非常好用 这里就不废话了
Quasar 中文文档连接点击这里 Quasar 安装 # Node.js> = 8.9.0是必需的。 $ yarn global add @quasar/cli # 或者 $ npm install -g @quasar/cli 创建项目 $ quasar create <folder_name> 项目的目录结构 .quasar文件 #此文件是自动生成的。
Asset-Based Ordering Quick Setting Declaration: This guide is just a quick instruction. I can not sure all the words is correct. Welcome anyone help me to update. Asset-based ordering is available w
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp An effective software interface can improve user productivity and satisfaction and reduce errors. But desig
quasar mode add cordova cd src-cordova cordova platform add android cordova requirements cordova plugin add cordova-plugin-ionic-webview cordova plugin add cordova-plugin-wkwebview-engine cd ../ quasa
今日系操作Agent既时候保存的时候突然报了一个错误,看了一下错误的信息,下意识以为是签名的问题,所以就跑去Admin那里把database签了名一次,结果还是没有什么效果;后来发现该database被我签名以后,database里面的所有elements 既last Modified by都全部变成我的名字了,这时候我才恍然大悟签名的用处.
登录企业后台,仅企业创建人或被授权的企业管理员可以登录企业管理平台 支持两种登录方式: 1、手机号登录 1.输入注册/加入企业时的手机号、验证码 2.设置/输入管理员密码:企业管理员进行重要操作时需要验证的二次验证密码 3.登录成功 2、扫码登录 1.使用如流手机客户端扫码 2.设置/输入管理员密码:企业管理员进行重要操作时需要验证的二次验证密码 3.登录成功
本文向大家介绍C++实现企业职工工资管理系统,包括了C++实现企业职工工资管理系统的使用技巧和注意事项,需要的朋友参考一下 课程设计目的和要求 工资管理要和人事管理相联系,生成企业每个职工的实际发放工资。 企业职工人事基本信息包括:职工编号、姓名、性别、出生日期、职称(助工、工程师、高级工程师)和任职年限。 企业职工工资信息包括:职工编号、姓名、职务工资、职务补贴、住房补贴、应发工资、个人所得税、
一、简介 管理黄页企业的注册企业信息,可进行查看、修改、删除、审核、推荐等操作。 二、企业库管理 三、资质证书管理 可对企业上传的资质证书进行统一查看管理。
RBAC - YII2权限管理 开源协议 GPL 注意事项 严禁使用本软件从事任何非法活动 安装步骤 复制install目录下的dev文件至config目录下 修改dev目录下的db.php中的数据库配置 数据库导入SQL脚本,对应的脚本install目录下 默认密码:ranko/admin 后台地址:index.php?r=site/login 使用事项 starter/filter/Backe
企业管理平台是面向企业管理员的管理系统,功能包括: 1、将企业成员统一管理到统一通讯录 2、创建应用、服务号为企业成员提供办公和咨询服务,安装第三方应用授权成员使用 3、针对企业管理需求做管理设置 4、查看企业成员激活统计、应用访问数量、服务号咨询数量
获取企业内所有成员 请求方式: GET 请求地址:https://open.qingtui.cn/team/member/all/paged?access_token=ACCESS_TOKEN&page_size=PAGE_SIZE&request_page=REQUEST_PAGE 参数说明: 参数 必须 说明 access_token 是 接口调用凭证 page_size 是 分页返回时每页数
一、简介 黄页企业所使用模版的添加、修改、及管理。 二、添加黄页企业模版 企业模版的位置是: phpcms\templates\default\yp\com_default(com_default:为企业模版名称) 二、企业模版管理 三、企业模版的权限设置
本文向大家介绍10k+点赞的 SpringBoot 后台管理系统教程详解,包括了10k+点赞的 SpringBoot 后台管理系统教程详解的使用技巧和注意事项,需要的朋友参考一下 其实项目网上有很多了,但是教程比较详细的没多少,今天分享的项目从安装部署到代码具体功能都有很详细都说明 eladmin 是一款基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、red