精华内容
参与话题
问答
  • 深度学习快速入门 美国Texas A&M 在读博士,空间智能计算研究, 曾先...

    订阅后:请点击此处观看视频课程

     

    视频教程-深度学习快速入门-深度学习

    学习有效期:永久观看

    学习时长:723分钟

    学习计划:13天

    难度:

     

    口碑讲师带队学习,让你的问题不过夜」

    讲师姓名:阿勒拉哈

    技术总监/研发总监

    讲师介绍:美国Texas A&M 在读博士,空间智能计算研究, 曾先后在全球大安全公司从事爬虫工程师、数 据分析、文本挖掘、机器学习等工作。对数据科学 和人工智能领域有深入研究。

    ☛点击立即跟老师学习☚

     

    「你将学到什么?」

    涵盖深度学习的主要各个核心模块,以及流行框架 TensorFlow, Keras,Caffee和PyTorch, 以实战为核心,手把手带学员编程。本课程将用通俗易懂的语言已经相关项目给学校展示深度学习相关知识,让学员学以致用。

     

    「课程学习目录」

    第1章:课前准备
    1.课程介绍
    2.课程结构
    3.正确认识深度学习
    4.环境安装
    5.安装Keras和TensorFlow
    6.常用深度学习辅助工具
    第2章:衣物图片分类项目-TensorFlow和Keras
    1.最新版Tensorflow亮点
    2.深度学习开发流程
    3.感性认识神经网络
    4.免费GPU
    5.最新版anoconda安装深度学习库的问题
    6.数据准备
    7.数据预处理
    8.模型构建与训练
    9.模型调优与预测分析
    第3章:Tensorflow
    1.tensorflow概览
    2.tensorflow安装和版本介绍
    3.张量(tesnor)和会话(session)
    4.初识图和占位变量
    5.多节点图
    6.多图创建
    7.TensorFlow部分复盘
    8.张量1-常量
    9.张量2-向量与矩阵
    10.张量3-序列
    11.基本预算与数据类型
    12.Variable张量
    13.Variable之二
    14.互动会话
    15.占位变量
    16.懒加载
    第4章:TensorFlow续篇
    1.人均寿命预测小项目
    2.构建回归模型
    3.可视化预测结果
    4.底层API版逻辑回归-MNIST
    5.高层API版逻辑回归-MNIST
    6.梯度递减算法
    7.实时执行(渴望执行)
    8.GPU与CUDA
    9.深度学习开发箱与易用机器人
    第5章:Tensorflow续篇2-卷积网络
    1.神经网络和神经元
    2.卷积网络之一
    3.卷积网络之二
    4.TF卷积网络函数细讲
    5.TF卷积网络底层AP列子
    第6章:动物分类-Tensorflow
    1.数据介绍
    2.分离训练与测试集
    3.加载本地数据集
    4.Keras与TensorFlow
    5.构建卷积网络模型之一
    6.构建卷积网络模型之二
    7.训练模型
    8.可视化学习曲线
    9.模型预测
    10.准确度与提高方法
    11.数据扩增之一
    12.数据扩增之二
    13.数据扩增之三
    14.模型调优与项目总结
    第7章:经典深度学习架构与迁移学习
    1.VGG
    2.迁移学习之一
    3.迁移学习之二
    4.AlexNet和Inception
    5.ResNet和InceptionResNet
    6.DenseNet
    7.MobileNet
    8.Keras另外一种代码
    第8章:递归神经网络
    1.RNN 递归神经网络
    2.LSTM与GRU
    3.双向递归神经网络
    4.北京市PM2.5预测
    第9章:拓展内容
    1.对象监测与识别
    2.RCNN和YOLO
    3.对象监测与识别相关源代码
    4.姿势识别
    5.图像切割
    6.GAN生成对抗网络
    7.结束语和未来学习建议

     

    7项超值权益,保障学习质量」

    • 大咖讲解

    技术专家系统讲解传授编程思路与实战。

    • 答疑服务

    专属社群随时沟通与讲师答疑,扫清学习障碍,自学编程不再难。

    • 课程资料+课件

    超实用资料,覆盖核心知识,关键编程技能,方便练习巩固。(部分讲师考虑到版权问题,暂未上传附件,敬请谅解)

    • 常用开发实战

    企业常见开发实战案例,带你掌握Python在工作中的不同运用场景。

    • 大牛技术大会视频

    2019Python开发者大会视频免费观看,送你一个近距离感受互联网大佬的机会。

    • APP+PC随时随地学习

    满足不同场景,开发编程语言系统学习需求,不受空间、地域限制。

     

    「什么样的技术人适合学习?」

    • 想进入互联网技术行业,但是面对多门编程语言不知如何选择,0基础的你
    • 掌握开发、编程技术单一、冷门,迫切希望能够转型的你
    • 想进入大厂,但是编程经验不够丰富,没有竞争力,程序员找工作难。

     

    「悉心打造精品好课,13天学到大牛3年项目经验」

    【完善的技术体系】

    技术成长循序渐进,帮助用户轻松掌握

    掌握深度学习知识,扎实编码能力

    【清晰的课程脉络】

    浓缩大牛多年经验,全方位构建出系统化的技术知识脉络,同时注重实战操作。

    【仿佛在大厂实习般的课程设计】

    课程内容全面提升技术能力,系统学习大厂技术方法论,可复用在日后工作中。

     

    「你可以收获什么?」

    掌握深度学习流行框架

    编程实战深度学习

     

    展开全文
  • 快速入门Web前端开发

    万次阅读 多人点赞 2018-09-30 09:06:40
    入门标准 入门标准很简单,就一条:达到能参与 Web 前端实际项目的开发水平。请注意,是实际项目,这就需要了解如今的实际项目开发都用了哪些技术栈。HTML/CSS/JavaScript 这三大基础技术栈肯定是需要掌握的,但要...

    入门标准

    入门标准很简单,就一条:达到能参与 Web 前端实际项目的开发水平。请注意,是实际项目,这就需要了解如今的实际项目开发都用了哪些技术栈。HTML/CSS/JavaScript 这三大基础技术栈肯定是需要掌握的,但要能参与实际项目开发,肯定还要掌握其他一些主流的框架体系。

    几年前, jQuery + Bootstrap 可以说是一统江湖,是前端领域的绝对霸主。而这几年,随着 AngularReactVue 等框架的兴起,变成了百家争鸣的局面。这几年,Web 前端的技术发展真是太快了,相应地,技术栈也就变得非常多,除了最基本的HTML/CSS/JavaScript,以及 Vue/React/Angular 等这些 JavaScript 框架和各自的生态体系,还有 CSS 预处理器 Sass/Less/Stylus,还有 TypeScript,还有 grunt/webpack/gulp 等各种打包构建工具,还有其他一大堆技术栈。

    这么多技术栈,我们不可能全都掌握,就算是资深的前端工程师,也只是精通其中一部分,比如,有些精通 Angular,有些掌握 React,有些则熟悉 Vue,很少有人对三种框架生态体系都非常了解。因此,我们入门也没必要每种框架都学习,只要挑选一种就够了。而且,作为全栈,我们学习一门技术更重要的是要学习技术背后的编程思想、设计思想、架构思想等。而不管是 Angular、React 还是 Vuew,其背后的核心设计思想都是组件化的设计,因此只要掌握一种框架,我们也就能学习到前端技术的核心思想了。

    那么,我们应该学哪种框架体系呢?我的建议是从 Vue 开始,因为 Vue 的学习成本是最低的,入门简单,而且这两年 Vue 可以说是出现了爆发式的增长,已经直逼 React。React 的主要学习成本在于要掌握 JSX 语法,而且文档还大多都是英文。Vue 因为是国人开发和维护的,自然对国内的开发者更友好。Angular 则是个大而全的框架,显得太重,学习成本自然最高。至于 jQuery + Bootstrap 这套,已经过时了,建议没必要去学习了,毕竟我们的时间很宝贵,还有一大堆更有价值的东西等着我们去学。

    因此,我们要入门 Web 前端开发的话,除了要学习 HTML/CSS/JavaScript 三大基础技术栈,还要了解 Vue 体系。而 Vue 体系,除了 Vue 框架本身,还包括其他技术栈,这个后面再说。

    HTML/CSS/JavaScript

    HTML、CSS、JavaScript 是前端的核心基础,所以必须要掌握。HTML 主要就是HTML5,相比之前的版本,新增了很多新特性。CSS 则主要是 CSS3 了,相比以前的版本,主要就是作了模块化的拆分。JavaScript 其实分为三部分:ECMAScriptDOMBOM。ECMAScript 简称 ES,是 JavaScript 的核心,目前最新版本已经是ES2017,是 ES6 的第三个小版本。DOM 是文档对象模型,其实就是一套访问和操作 HTML 所有元素的 API。BOM 则是浏览器对象模型,用于访问和操作浏览器的一些特性。

    HTML/CSS/JavaScript 的学习资源比较多,我推荐几个。首先是 w3school 的系列教程:

    • HTML:该教程也包括了 HTML5 新增的内容,但讲得没下面专门讲解 HTML5 的细,所以该教程我建议只看 HTML 基础教程和表单部分即可
    • HTML5:该教程讲解了 HTML5 的新特性
    • CSS:该教程并不包括 CSS3 新增的特性,所以还需要学习下面的 CSS3 的教程
    • CSS3:该教程内容比较少,只包含 CSS3 新增的特性
    • JavaScript:该教程只是讲解了非常基础的语法

    不过,我更推荐菜鸟的教程,内容虽然也是来自 w3school,但部分内容比 w3school 的更详细,以下是教程地址:

    • HTML:http://www.runoob.com/html/html-tutorial.html
    • CSS:http://www.runoob.com/css/css-tutorial.html
    • JavaScript:http://www.runoob.com/js/js-tutorial.html

    HTML 和 CSS 只要根据以上教程学习就足够了,但 JavaScript 则是不够的,以上教程缺少了 ES6 及更高版本的内容,后面我再推荐其他学习资源进行补充。

    视频教程方面,慕课网、极客学院等都有基础课程,但都是收费的,而且价格不菲,性价比实在太低。比如慕课网的《前端小白入门》+《前端进阶:响应式开发与前端框架》两套课程的组合套餐就要 988 元了,而内容还没有上面免费教程的齐全。如果真要看视频,那我会推荐网易云课堂的一些免费课程:

    • 从零玩转HTML5前端+跨平台开发
    • H5/web前端开发|HTML5+CSS3
    • 李炎恢JavaScript教程 第一季

    书籍方面,HTML 和 CSS 基础方面的,首推《Head First HTML与CSS》,编排设计通俗易懂,就连完全零基础的非 IT 人员都适合学习。不过,Head First 这本书没有涉及到 HTML5 和 CSS3 的更新内容。不过,Head First 有另一本书讲解了 HTML5,叫《Head First HTML5 Programming》,不过,要熟悉 HTML5 的用法,还是要先掌握一点 JavaScript 基础。CSS3 方面 Head First 则没有相应的书籍,因此,我推荐另一本《CSS3实用指南》

    JavaScript 方面,我首推《JavaScript高级程序设计》这本书,书中内容由浅入深,也是写得通俗易懂,适合入门。另外,有些人会推荐《JavaScript权威指南》,但这本书主要还是一本字典书,略显晦涩,其实不适合入门。不过《JavaScript高级程序设计》还是基于 ES5 的,为了补充 ES6 的内容,推荐阮一峰的《ES6标准入门》,目前是第3版,内容已经覆盖了最新版本的 ES2017。另外,因为这是一本开源教材,所以也可以直接去阮一峰的官网免费阅读,以下是链接地址:

    • ECMAScript 6 入门:http://es6.ruanyifeng.com/

    另外,有一套系列书叫《You Don't Know JS》也要推荐给大家,也是开源教材,这套书会让你对 JavaScript 知其然也知其所以然,也包含了 ES6 的内容,不过这套书面向初学者的,只适合用来进阶。也出版了中文翻译的书籍,叫《你不知道的JavaScript》,目前只有上卷和中卷两本,据评价,上卷的翻译还不错,但中卷的翻译则一般般,下卷不知道什么时候才出版。以下是系列书的github地址:

    • You Don't Know JS:https://github.com/getify/You-Dont-Know-JS

    那么,这么多学习资源,我们应该如何学习才高效呢?其实,和前面学习 Android 和 iOS 时一样,我们主要还是为了了解各种核心概念,我们不可能在短期内熟悉所有知识点,因此,我还是和前面的文章一样,也罗列出一些核心的知识点吧。

    • HTML基础:以 w3school 或菜鸟的 HTML 教程为主,熟悉各种常用标签的用法,尤其是标题、段落、链接、图像、表格、列表、表单、区块、布局、CSS、脚本等
    • CSS基础:同样以 w3school 或菜鸟的 CSS 教程为主,熟悉 CSS 语法和选择器、样式、框模型、定位等模块的内容
    • JavaScript基础:首先作为一门编程语言,语言本身的基础肯定要熟悉,包括数据类型、变量、运算符、控制流、函数、对象等;另外,也要熟悉 DOM;BOM 简单了解下就可以了,使用场景不多
    • HTML5:HTML5 的新特性肯定要了解,内容其实也不是很多,核心的就是 canvas、svg、对多媒体的支持、Web 存储、应用缓存、WebSocket等
    • CSS3:CSS3 也是要熟悉那些新特性,最核心的就是弹性盒子
    • ES6:ES6 自然也是要熟悉的,学好阮一峰的《ECMAScript 6 入门》教程就足够了

    Vue 体系

    在开始正式学习 Vue 之前,我们先来了解几个概念,这样才能更好理解 Vue 的一些设计理念。第一个概念是「单页应用程序」,就是只有一个 Web 页面的应用,是只加载单个 HTML 页面并在用户与应用程序交互式动态更新该页面的 Web 应用程序。第二个概念是「Virtual DOM」,即虚拟 DOM,简单说就是一个模拟 DOM 树的 JavaScript 对象,是为了避免大面积操作真实 DOM 而导致的性能问题。第三个概念是「响应式系统」,通过数据模型和 View 的数据绑定,系统可以对数据模型的修改自动响应到视图上。第四个概念则是「组件化」,Vue 和 React 都是通过组合各种组件组成应用程序的。理解了这些概念,你才能更好的理解 Vue/React 这些前端框架体系。

    还有,开发工具方面,我推荐 Visual Studio Code,一款免费开源的轻量级代码编辑器,macOS、Windows、Linux 都支持,有人评价说比sublime开源,比atom更快,比webstorm更轻,所以说,你值得拥有。

    Vue 体系包含了很多技术栈,一套完整的 Vue 项目一般包括 vue + vue-router + vuex + vue-cli + axios + sass + webpack,其中,vue + vue-router + vuex 又称为 Vue 全家桶,因为这三套技术栈都是 Vue 官方推出的,其他框架和工具则是第三方的。那么,就让我们来一个个了解这些技术栈吧。

    • vue:vue 即是 Vue.js 框架本身,是一套采用了 MVVM 模式的 JavaScript 框架,它和 React 一样使用了 Virtual DOM,也提供了响应式和组件化的视图组件。不过与 React 不同的是,Vue 更推荐使用基于 HTML 的模板,这也是它相比 React 等其他框架更容易入门的原因。
    • vue-router:因为现在大多数 Web 应用都是单页应用,那要实现单个页面里的不同视图的跳转,就要用到路由,vue-router 库就是用来实现单页应用的路由功能。
    • vuex:vuex 是一个类 Flux 的状态管理库,它采用集中式存储管理应用的所有组件的状态。关于什么是 Flux,可以参考阮一峰写的一篇文章《Flux 架构入门教程》。
    • vue-cli:vue-cli 是官方提供的命令行工具,用它可以快速创建 vue 项目。
    • axios:axios 是 vue 官方推荐的一个第三方 HTTP 库,它是基于 promise 的,promise 是 ES6 的新增特性。
    • sass:CSS 的一款预处理器,简单入门可以看看阮一峰的一篇文章《SASS用法指南》。预处理器另外还有 less 和 stylus,不过不少大牛最推荐的还是 sass。
    • webpack:webpack 是打包构建工具,可以类比为 Java 的 Gradle。不过 webpack 是基于 node.js 的,所以要用熟 webpack,还要学点 node.js 的基础知识,至少要懂得配置 node.js 的运行环境以及了解 node.js 的包管理工具 npm 的常用命令。

    对于刚接触当代前端的人员来说,存在太多陌生的概念需要了解,一时可能难以消化,Vue 的作者尤雨溪写过一篇《新手向:Vue 2.0 的建议学习顺序》,可以按照他的建议去学习。

    学习资源方面,最好的应该就是官方文档了。另外,《Vue.js实战》这本书有尤雨溪作推荐序,也可以买来看看,可以作为官网的补充资源。对于一些概念如果还不是很理解,也可以暂时先放一放,后面在做项目开发的过程中可能你就会理解了。

    实战入门

    最关键的还是要通过项目实战才能真正入门,这也是我一贯推崇的。也是和 Android、iOS 实战一样的建议,如果条件允许,你可以向上司申请参与自己公司的前端项目开发,然后开始去熟悉代码和实现一些简单的工作任务,建议先从完成一些简单的UI界面开始。同样,开源项目自然也是少不了,Vue 这块的开源项目我推荐两个:

    • vue2-happyfri:很简单的一个小项目,很适合入门练习
    • vue2-elm:用 vue 模仿饿了么的一个完整项目,重点推荐

    另外,也附上一个汇总了众多 vue 开源项目的 github 地址:https://github.com/opendigg/awesome-github-vue。

    对于开源实战项目的操作上,我依然还是建议先给应用改皮肤开始,之后尝试着自己做出一个类似的App。以上面的 vue 版饿了么项目为例,你先给它所有页面先换个皮肤,包括背景、按钮、文字等等,通通换掉一遍,然后尝试自己做一个百度外卖或美团外卖,当你做完,应付一般的 vue 项目开发就应该没有问题了。之后也根据需要可以再去学下 React 体系,这时候学起来绝对不会吃力。

    总结

    前端开发入门,要学的技术栈真的很多,除了最基础的 HTML/CSS/JavaScript,还包括 HTML5、CSS3、ES6,还要学习目前流行的 JavaScript 框架,我的建议是从 Vue 开始,容易入门,要掌握的技术栈包括 vue + vue-router + vuex + vue-cli + axios + sass + webpack,另外,node.js 也要了解点基础。最后,实战项目我推荐了一个简单的小项目和一个完整的 vue 版饿了么项目。

    思考和实践

    前端开发的编程思想和移动开发有什么不同?如何将前端的架构思想应用到移动开发上?最后,还是要独立完成一款 Web 应用。

    展开全文
  • 快速入门

    2020-10-09 13:14:24
    01-快速入门-框架的介绍 02-快速入门-ORM介绍 03-快速入门-mybatis的介绍 04-快速入门-mybatis入门程序 05-快速入门-快速入门小结 1.1 框架介绍 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成...

    01-快速入门-框架的介绍

    • 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!

    02-快速入门-ORM介绍

    • ORM(Object Relational Mapping): 对象关系映射

    • 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。

    在这里插入图片描述
    在这里插入图片描述


    03-快速入门-mybatis的介绍

    为什么使用MyBatis?先看一下JDBC

    在这里插入图片描述

    • JDBC新增

    在这里插入图片描述

    原始JDBC的操作问题分析

    1.频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。
    3.查询操作时,需要手动将结果集中的数据封装到实体对象中。
    2.sql语句在代码中硬编码,如果要修改sql语句,就需要修改java代码,造成代码不易维护。
    4.增删改查操作需要参数时,需要手动将实体对象的数据设置到sql语句的占位符。

    原始JDBC的操作问题解决方案

    1.使用数据库连接池初始化连接资源。
    2.将sql语句抽取到配置文件中。
    3.使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射。

    这些问题和解决措施,导致MyBatis的出现

    什么是MyBatis

    • mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
    • mybatis通过xml或注解的方式将要执行的各种
      statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
    • 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc
      进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

    MyBatis官网地址:http://www.mybatis.org/mybatis-3/

    04-快速入门-mybatis入门程序

    SQL数据准备

    CREATE DATABASE db1;
    
    USE db1;
    
    CREATE TABLE student(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(20),
    	age INT
    );
    
    INSERT INTO student VALUES (NULL,'张三',23);
    INSERT INTO student VALUES (NULL,'李四',24);
    INSERT INTO student VALUES (NULL,'王五',25);
    
    SELECT * FROM student;
    

    在这里插入图片描述

    MyBatis开发步骤:

    ①添加MyBatis的jar包

    ②创建Student数据表

    ③编写Studentr实体类

    ④编写映射文件StudentMapper.xml

    ⑤编写核心文件MyBatisConfig.xml

    ⑥编写测试类

    1.7.1 环境搭建

    1)导入MyBatis的jar包

    • mysql-connector-java-5.1.37-bin.jar
    • mybatis-3.5.3.jar
    • log4j-1.2.17.jar
    1. 创建student数据表

    2. 编写Student实体

    package com.itheima.bean;
    
    /**
     * @author major_s
     * @date 2020/10/16 - 18:17
     **/
    public class Student {
    
        private Integer id;
        private String name;
        private Integer age;
    
        public Student() {
        }
    
        public Student(Integer id, String name, Integer age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    

    4)编写StudentMapper.xml映射文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--MyBatis的DTD约束-->
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <!--
        mapper:核心根标签
        namespace属性:名称空间
    -->
    <mapper namespace="StudentMapper">
        <!--
            select:查询功能的标签
            id属性:唯一标识
            resultType属性:指定结果映射对象类型
            parameterType属性:指定参数映射对象类型
        -->
        <select id="selectAll" resultType="com.itheima.bean.Student">
            SELECT * FROM student
        </select>
    
    </mapper>
    
    1. 编写MyBatis核心文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--MyBatis的DTD约束-->
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <!--configuration 核心根标签-->
    <configuration>
    
        <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
        <environments default="mysql">
            <!--environment配置数据库环境  id属性唯一标识-->
            <environment id="mysql">
                <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
                <transactionManager type="JDBC"></transactionManager>
                <!-- dataSource数据源信息   type属性 连接池-->
                <dataSource type="POOLED">
                    <!-- property获取数据库连接的配置信息 -->
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://49.234.118.92:3306/db1" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
    
        <!-- mappers引入映射配置文件 -->
        <mappers>
            <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
            <mapper resource="StudentMapper.xml"/>
        </mappers>
    </configuration>
    
    
    1.7.2编写测试代码
    package com.itheima.dao;
    
    
    import com.itheima.bean.Student;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * @author major_s
     * @date 2020/10/16 - 18:18
     **/
    public class StudentTest01 {
        public static void main(String[] args) throws IOException {
            // 1.加载核心配置文件
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            // 2. 获取SqlSession工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            // 3. 通过SqlSession工厂对象获取SqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 4.执行映射配置文件中的sql语句,并接受结果
            List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
    
            // 5. 处理结果
            for (Student stu : list){
                System.out.println(stu);
            }
            // 6. 释放资源
            sqlSession.close();
            is.close();
        }
    
    }
    
    

    知识小结

    • 框架

      框架是一款半成品软件,我们可以基于框架继续开发,从而完成一些个性化的需求。

    • ORM

      对象关系映射,数据和实体对象的映射。

    • MyBatis

      是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC。

    展开全文
  • 2、快速入门

    2020-04-08 09:24:25
    文章目录 文章目录项目初始化开发工具代码初始化数据库初始化首次启动项目参数Apollo配置项目配置系统配置分布式锁通知管理微信配置任务调度配置工作流配置数据库配置分布式主键Redis消息队列单点配置服务目录文件...

    文章目录

    项目初始化

    通过本指南快速上手lcp开发平台

    开发工具

    以下工具都可以从公司内部ftp上获取

    • Jdk 1.8
    • Redis 3.0+
    • Maven 3.3+,参考首页完成私有仓库配置
    • Tomcat 7+
    • Svn 1.8+
    • IntelliJ IDEA 2017+
    • Mysql server 5.6+
    • Navicat Premium 10+

    代码初始化

    从svn上下载项目开发模板

    http://172.16.1.78:81/svn/06_源代码管理/S008_LCP平台/applicationTemplete
    

    从首页地址获取并访问Maven私有仓库,查找并修改为最新稳定的extension版本号

    <dependency>
        <groupId>com.fsl</groupId>
        <artifactId>lcp.extension</artifactId>
        <type>war</type>
        <version>2.5-SNAPSHOT</version>
    </dependency>
    
    <dependency>
        <groupId>com.fsl</groupId>
        <artifactId>lcp.extension</artifactId>
        <classifier>classes</classifier>
        <scope>provided</scope>
        <version>2.5-SNAPSHOT</version>
    </dependency>
    
    <dependency>
    	<groupId>com.fsl</groupId>
    	<artifactId>lcp.wrapper</artifactId>
    	<type>war</type>
    	<version>2.1-SNAPSHOT</version>
    </dependency>
    
    <dependency>
    	<groupId>com.fsl</groupId>
    	<artifactId>lcp.wrapper</artifactId>
    	<classifier>classes</classifier>
    	<scope>provided</scope>
    	<version>2.1-SNAPSHOT</version>
    </dependency>
    

    在这里插入图片描述

    基于项目实际需求修改pom文件中的如下属性

    <project>
        ……
        <artifactId>applicationTemplete</artifactId>
        <version>1.0-RELEASE</version>
        ……
        <build>
            ……
            <finalName>applicationTemplete</finalName>
            ……
        </build>
    </project>
    

    执行如下命令,完成项目首次打包

    mvn clean package
    

    数据库初始化

    使用如下信息连接数据库

    ip:172.16.20.118
    port:3306
    user:root
    pwd:fswl@1234
    

    平台使用Mysql数据库完成开发。登录数据库服务器,在my.cnf(或my.ini)完成以下配置

    # 忽略大小写
    lower_case_table_names=1
    # 采用utf8mb4编码,utf8mb4才是真正的utf8编码,能够存储各类符号
    character_set_server=utf8mb4
    # 默认值为100,调整到500
    max_connections=500
    

    如果数据库开启了bin-log日志,则还需在my.cnf(或my.ini)添加以下配置

    log_bin_trust_function_creators=1
    

    使用utf8mb4字符集,创建名为applicationTemplete的数据库。数据库名称可按需求修改。

    访问target\war\work\com.fsl\lcp.extension\WEB-INF\classes\db路径,按顺序执行脚本,初始化表结构与表数据

    平台默认使用JNDI配置数据源。数据源的配置独立于项目配置。打开tomcat安装目录/conf/context.xml文件,添加如下配置。注意各参数应按需修改

    <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" name="jdbc/lcp_db" type="javax.sql.DataSource" url="jdbc:mysql://172.16.20.118:3306/applicationTemplete" username="root" password="fswl@1234"/>  
    

    首次启动

    本地先行启动Redis。使用Idea打开项目并完成Tomcat配置。使用admin/Fslgz@1234!!登录,成功启动后的面如下。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vzASari-1586308930974)(.\pic\20190324-205613.png)]

    项目参数

    src\main\resources\profiles目录下,存储了项目四套环境参数配置,说明如下

    名称 描述
    dev 开发环境参数
    sit 综测环境参数
    uat 业测环境参数
    prod 正式环境参数

    Apollo配置

    需要指定Apollo上应用程序编码与Apollo服务器地址。此配置放置在app.properties

    app.id=lcp
    apollo.meta=http://172.16.20.136:8080
    

    项目配置

    目前项目的所有配置统一由Apollo管理。

    系统配置

    系统级参数配置

    # system
    env.code = DEV
    sys.code = TEMPLETE
    sys.name = 模板
    sys.log.dir = /lcp_logs
    sys.webroot.url = http://localhost:8080/applicationTemplete/
    sys.home.refresh.interval = 60
    

    分布式锁

    当前未启用

    # redisson
    #  multiple redis such as
    #  redisson.server.url=\
    #    127.0.0.1:6379,\
    #    10.211.103.142:6379
    # redisson.server.url=
    # redissson.server.password=
    

    通知管理

    # mail notify
    mail.smtp.host=mail.fslgz.com
    mail.smtp.port=587
    mail.smtp.username=lcpnotice
    mail.smtp.password=lcp!@2019
    mail.smtp.auth=true
    mail.smtp.timeout=50000
    #mail.from=lcpnotice@fslgz.com
    
    # sms notify
    sms.corpid=105686
    sms.loginname=system
    sms.password=390323
    sms.url=https://sms.mobset.com:843/SDK3/SMS
    
    # dd nofity
    dingtalk.corp.id=ding6b6ffebcd75ef63335c2f4657eb6378f
    dingtalk.app.key=dinggkwxz61kgu7vvw8a
    dingtalk.app.secret=VnA-wL-bqviMkIsw_Qn81TqH-Q7fqzCchOglmBjplbjeBZvdzH5MZ8e66vDNefo-
    dingtalk.default.agentid=280426666
    

    微信配置

    # weixin
    weixin.app.id = wxdaa8c45050e1968c
    weixin.app.secret = cf958a9dd8882631b8c5b6beb2d19a64
    

    任务调度配置

    启动后自动执行任务调度

    # job
    job.autoStartup=true
    

    工作流配置

    # Activiti
    activiti.dd.todo.open=N
    activiti.dd.process.open = N
    

    数据库配置

    注意jndiName的配置需与tomcat中保持一致

    # db
    db.jndiName=java:comp/env/jdbc/lcp_db
    # db.type property is used for activiti
    db.type=mysql
    #db.type=oracle
    #db.type=mysql
    #db.type=hana
    mybatis.identity=JDBC
    #mybatis.identity=SEQUENCE
    

    分布式主键

    在正式项目中需配置为分配的主键区间

    # snow generate Id
    snow.workerId=0
    snow.datacenterId=0
    

    Redis

    默认未使用集群。可添加访问密码保证缓存不被其它应用干扰

    # redis
    redis.sentinel=\
      10.86.20.183:26379,\
      10.86.20.184:26379
    # if redis.useSentinel is true, then redis.ip and redis.port is useless
    # this value should always be true except local dev test
    redis.useSentinel=false
    redis.ip=localhost
    redis.port=6379
    redis.db=10
    redis.password=
    redis.queue.retry.times = 5
    

    消息队列

    # rabbitmq intergration
    rabbit.mq.open=false
    rabbit.mq.host=172.16.20.121
    rabbit.mq.port=5672
    rabbit.mq.username=fsl
    rabbit.mq.password=fsl
    rabbit.mq.exchange=exchange.topic.sit
    rabbit.mq.queue=queue.ams.sit
    rabbit.mq.queue.concurrency=10
    

    单点配置

    可删除默认配置,使用本地登录

    # cas intergration
    cas.service=http://localhost:8080/applicationTemplete/login/cas
    cas.ssoserver.url=http://172.16.20.124:8080/cas
    cas.ssoserver.loginurl=http://172.16.20.124:8080/cas/login
    cas.ssoserver.logouturl=http://172.16.20.124:8080/cas/logout?service=http://localhost:8080/applicationTemplete
    

    服务目录

    # ldap intergration
    ldap.server.url=ldap://localhost:389/
    ldap.conn.userDn=cn=Manager,dc=hand,dc=com
    ldap.conn.password=secret
    ldap.user.search.base=dc=hand,dc=com
    ldap.user.search.filter=(uid={0})
    

    文件存储

    # FastDFS intergration
    #fastdfs.connect_timeout_in_seconds = 5
    #fastdfs.network_timeout_in_seconds = 30
    #fastdfs.charset = UTF-8
    #fastdfs.http_anti_steal_token = false
    #fastdfs.http_secret_key = FastDFS1234567890
    #fastdfs.http_tracker_http_port = 80
    fastdfs.tracker_servers = 172.16.20.147:22122
    fastdfs.nginx.url=http://172.16.20.148:6001/
    

    门户集成

    # portal address
    portal.address=http://172.16.20.119/portal/
    portal.token.url=http://172.16.20.119/portal/api/public/lcp/restful/get_token?clientId=82c15660e444467b9cb78578c6864b04&clientSecret=a4faf06c-7bab-4a99-a144-034358fafc9f
    

    网关集成

    gateway.num.retry = 1
    

    组件配置

    当前平台存在30个组件配置文件,清单如下

    配置文件名称 模块名称 项目覆盖
    Spring根容器注册对象
    applicationContext.xml 公共对象注册
    applicationContext-ext.xml 扩展对象注册
    applicationContext-beans.xml 项目对象注册
    Mvc子容器注册对象
    appServlet/servlet-context.xml 公共对象注册
    appServlet/controllers.xml 控制器对象注册
    接口认证管理
    applicationContext-gateway.xml 网关设置
    oauth2Security-gateway.xml 网关安全设置
    applicationContext-oauth2.xml OAuth2设置
    oauth2Security.xml OAuth2安全认证
    applicationContext-cxf.xml CXF设置
    cxfSecurity.xml CXF安全认证
    cxf-beans-demo.xml CXF使用样例
    用户认证管理
    applicationContext-security.xml 登录开关
    casSecurity.xml 单点认证
    standardSecurity.xml 标准认证
    standardSecurity-LDAP.xml 基于目录服务的标准认证
    通知管理
    applicationContext-msg.xml 消息管理开关(始终指向Redis)
    message/rabbitmq.xml RabbitMQ消息配置(废弃)
    message/redis.xml Redis消息管理
    applicationContext-nofify.xml 通知管理
    applicationContext-mail.xml 邮件管理
    applicationContext-rabbitmq.xml 队列管理
    applicationContext-rabbitmq-customer.xml 消费者个性化配置
    工作流
    applicationContext-activiti.xml 工作流管理
    appServlet/servlet-activiti.xml 工作流Web应用管理
    其它模块
    applicationContext-apollo.xml Apollo配置
    applicationContext-db.xml 数据库连接
    applicationContext-job.xml 调度管理
    applicationContext-redis.xml 缓存配置
    applicationContext-websocket.xml webSocket配置

    项目菜单

    最多支持四级菜单。项目标准菜单如下

    一级菜单 二级菜单 三级菜单 备注 原菜单
    业务担当使用
    业务办理 协同管理 我待办的流程 等待我办理的工作流节点信息 工作流/我的待办列表
    业务办理 协同管理 抄送我的流程 抄送我知晓的工作流节点信息 工作流/我的抄送流程
    业务办理 协同管理 我发起的流程 我完成发起的工作流节点信息 工作流/我发起的流程
    业务办理 协同管理 我参与的流程 我完成办理的工作流节点信息 工作流/我参与的流程
    业务办理 协同管理 自动转交配置 将规定时间内的所有流程任务转交其它人处理 工作流/自动转交配置
    报表管理 报表管理 业务系统报表展示菜单
    配置管理 配置管理 业务系统配置设置菜单
    系统管理员使用
    业务办理 协同管理 所有待办的流程 获取系统所有的待办节点信息 流程管理/待办事项(管理员)
    业务办理 协同管理 所有的流程 获取系统所有的工作流节点信息
    系统管理 账户管理 账户管理 管理系统的登录账户信息,为账户分配角色与权限 同运维管理/账户管理
    系统管理 账户管理 角色管理 管理系统的角色信息 同运维管理/角色管理
    系统管理 账户管理 默认角色配置 为岗位设定默认的角色 同运维管理/默认角色配置
    系统管理 功能管理 功能分配 为角色分配系统功能 同系统管理/同运维管理/功能分配
    系统管理 流程管理 职能主担配置 配置各部门职能主担人员 同运维管理/流程管理
    系统管理 流程管理 职能主担报表 集中展示系统配置的所有部门职能主担 同运维管理/流程管理
    运维部门使用
    运维管理 组织管理 组织管理 管理公司信息 组织管理/公司管理
    运维管理 组织管理 部门管理 管理公司内各层级部门信息 组织管理/组织管理
    运维管理 组织管理 岗位管理 管理部门内各岗位信息 组织管理/岗位管理
    运维管理 组织管理 员工管理 管理岗位内各员工信息 组织管理/员工管理
    运维管理 账户管理 账户管理 管理系统的登录账户信息,为账户分配角色与权限 系统管理/账户管理/用户管理
    运维管理 账户管理 登录配置 管理各账户的安全/密码/登录策略 系统管理/系统配置
    运维管理 账户管理 角色管理 管理系统的角色信息 系统管理/账户管理/角色管理
    运维管理 账户管理 默认角色配置 为岗位设定默认的角色
    运维管理 功能管理 资源管理 管理系统内所有的请求地址资源,定义资源权限 系统管理/功能管理/资源管理
    运维管理 功能管理 功能维护 管理系统内功能清单,为功能绑定地址资源 系统管理/功能管理/功能维护
    运维管理 功能管理 功能分配 为角色分配系统功能 系统管理/功能管理/功能分配
    运维管理 数据权限 数据资源管理 管理系统内所有的数据权限规则
    运维管理 数据权限 数据资源分配 为账户分配数据权限
    运维管理 参数管理 外观维护 管理系统标题与图标 系统管理/系统配置
    运维管理 参数管理 首页配置 管理登录首页的仪表盘 系统管理/仪表盘配置
    运维管理 参数管理 系统参数 管理系统参数信息 系统管理/配置维护
    运维管理 参数管理 数据字典 管理系统数据字典信息 系统管理/代码维护
    运维管理 参数管理 LOV定义 管理系统LOV信息 系统管理/LOV定义
    运维管理 参数管理 流水号配置 管理系统流水号信息 系统管理/编码规则
    运维管理 参数管理 快捷键配置 管理页面操作快捷键信息 系统管理/热键配置
    运维管理 参数管理 多语言定义 管理系统多语言类型 系统管理/语言维护
    运维管理 参数管理 多语言描述 管理系统各语言具体描述 系统管理/描述维护
    运维管理 审批管理 流程设计 绘制系统工作流 流程管理/流程设计
    运维管理 审批管理 流程部署 查询流程布署信息 流程管理/流程部署
    运维管理 审批管理 流程监控 管理系统正在运行的工作流实例 流程管理/流程监控
    运维管理 审批管理 流程异常日志 管理工作流异常日志 流程管理/报错日志
    运维管理 审批管理 审批方式配置 配置流程节点的通过条件 流程管理/审批配置/审批方式
    运维管理 审批管理 审批规则配置 配置接收流程节点待办任务的人员筛选规则 流程管理/审批配置/审批规则
    运维管理 审批管理 职能主担配置 配置各部门职能主担人员
    运维管理 审批管理 职能主担报表 集中展示系统配置的所有部门职能主担
    运维管理 审批管理 审批权限配置 配置流程走向的判定条件 流程管理/审批配置/审批权限
    运维管理 任务管理 任务调度 配置系统自动调度执行的计划任务 计划任务/任务明细
    运维管理 任务管理 任务日志 管理系统任务的执行日志 计划任务/执行记录
    运维管理 通知管理 通知模板 设定通知消息的正文格式
    运维管理 通知管理 通知列表 管理所有的通知执行
    运维管理 附件管理 文件管理 查询目前所有已上传的文件清单 附件管理/文件管理
    运维管理 附件管理 上传测试 文件上传测试 附件管理/上传附件
    运维管理 服务管理 服务发布 生产者将服务发布至消息总线 服务管理/服务注册
    运维管理 服务管理 服务订阅 消费者在消息总线上订阅服务 服务管理/应用管理
    运维管理 服务管理 调用日志 管理服务的调用日志 服务管理/调用记录
    运维管理 集成管理 系统集成配置 将指定系统的菜单与待办集成至本系统(钉钉工作台)
    运维管理 集成管理 微信集成配置 将指定系统的入口集成至本系统(微信工作台)
    运维管理 日志管理 MQ消息日志 管理与MQ平台交互的日志信息
    运维管理 日志管理 钉钉接口日志 管理与钉钉服务器交互的日志信息
    运维管理 日志管理 RESTFul接口日志 管理与钉钉服务器交互的日志信息

    项目实践

    数据源管理

    平台默认已包含单数据源配置。如需连接更多数据源则需修改 applicationContext-db.xml,添加如下配置。

    • dataSource,数据源连接配置
    • sqlSessionFactory,数据源工厂配置
    • mapperScannerConfigurer,数据映射配置
    • transactionManager,事务管理配置

    独立事务

    一段代码只能使用一个事务管理器。当存在同时操作两个数据源的时候,默认情况下,发生异常时只能回滚一个数据源的事务。示例配置如下,注意需添加多个数据库配置。

    <!-- 数据源连接信息-->
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    	<property name="jndiName" value="${db.jndiName}"/>
    </bean>
    <bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
    	<property name="jndiName" value="${db.jndiName2}"/>
    </bean>
    
    <!-- 数据源创建工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource"/>
    	<!-- 注意:这里针对不同的数据源,应该配置不同的扫描路径!!!-->
    	<property name="mapperLocations" value="classpath*:com/hand/hap/**/*Mapper.xml"/>
    	<property name="plugins">
    		<array>
    			<bean class="com.hand.hap.core.interceptor.RequestContextInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.MultiLanguageInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.SecurityTokenInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.OvnInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.AuditInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.DataPermissionInterceptor"/>
    			<bean class="com.github.pagehelper.PageHelper"/>
    			<bean class="com.hand.hap.core.interceptor.CacheJoinInterceptor">
    				<property name="cacheJoinType" ref="cacheJoinType"></property>
    			</bean>
    		</array>
    	</property>
    	<property name="configLocation" value="classpath:mybatis-configuration.xml"/>
    </bean>
    <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource2"/>
    	<!-- 注意:这里针对不同的数据源,应该配置不同的扫描路径!!!-->
    	<property name="mapperLocations" value="classpath*:com/hand/test/**/*Mapper.xml"/>
    	<property name="plugins">
    		<array>
    			<bean class="com.hand.hap.core.interceptor.RequestContextInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.MultiLanguageInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.SecurityTokenInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.OvnInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.AuditInterceptor"/>
    			<bean class="com.hand.hap.core.interceptor.DataPermissionInterceptor"/>
    			<bean class="com.github.pagehelper.PageHelper"/>
    			<bean class="com.hand.hap.core.interceptor.CacheJoinInterceptor">
    				<property name="cacheJoinType" ref="cacheJoinType"></property>
    			</bean>
    		</array>
    	</property>
    	<property name="configLocation" value="classpath:mybatis-configuration.xml"/>
    </bean>
    
    <!-- 数据映射配置 -->
    <bean id="mapperScannerConfigurer" class="com.hand.hap.mybatis.spring.MapperScannerConfigurer">
    	<!-- 注意:这里针对不同的数据源,应该配置不同的扫描路径!!!-->
    	<property name="basePackage" value="com.hand.hap.**.mapper"/>
    	<property name="processPropertyPlaceHolders" value="true"/>
    	<property name="propertiesMap">
    		<map>
    			<entry key="mappers" value="com.hand.hap.mybatis.common.Mapper"/>
    			<entry key="IDENTITY" value="${mybatis.identity}"/>
    			<entry key="dataBaseType" value="${db.type}"/>
    			<entry key="seqFormat" value="{3}_s.nextVal"/>
    			<entry key="enableMethodAnnotation" value="true"/>
    		</map>
    	</property>
    	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
    <bean id="mapperScannerConfigurer2" class="com.hand.hap.mybatis.spring.MapperScannerConfigurer">
    	<!-- 注意:这里针对不同的数据源,应该配置不同的扫描路径!!!-->
    	<property name="basePackage" value="com.hand.test.**.mapper"/>
    	<property name="processPropertyPlaceHolders" value="true"/>
    	<property name="propertiesMap">
    		<map>
    			<entry key="mappers" value="com.hand.hap.mybatis.common.Mapper"/>
    			<entry key="IDENTITY" value="${mybatis.identity2}"/>
    			<entry key="dataBaseType" value="${db.type2}"/>
    			<entry key="seqFormat" value="{3}_s.nextVal"/>
    			<entry key="enableMethodAnnotation" value="true"/>
    		</map>
    	</property>
    	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/>
    </bean>
    
    <!-- 事务管理配置 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource2"/>
    </bean>
    

    分布式事务

    代码使用分布式事务,所有数据源的事务都将统一管理

    首先在pom里添加如下依赖

    <dependency>
       <groupId>com.atomikos</groupId>
       <artifactId>transactions-jdbc</artifactId>
       <version>4.0.2</version>
    </dependency>
    <dependency>
       <groupId>javax.transaction</groupId>
       <artifactId>jta</artifactId>
       <version>1.1</version>
    </dependency>
    

    分布式事务使用独立的数据源连接配置与事务管理配置,数据源工厂配置与数据映射配置和之前保持一致

    <!-- 两个数据源的公用配置,方便下面直接引用 -->
    <!-- 数据源配置必须使用AtomikosDataSourceBean,因此JNDI配置不能用了-->
    <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" abstract="true">
      <property name="poolSize" value="10" />
      <property name="minPoolSize" value="10"/>
      <property name="maxPoolSize" value="30"/>
      <property name="borrowConnectionTimeout" value="60"/>
      <property name="reapTimeout" value="20"/>
      <!-- 最大空闲时间 -->
      <property name="maxIdleTime" value="60"/>
      <property name="maintenanceInterval" value="60" />
      <property name="loginTimeout" value="60"/>
      <property name="logWriter" value="60"/>
     <!-- <property name="testQuery">
    	  <value>select 1</value>
      </property>-->
    </bean>
    
    <!-- 配置第一个数据源 -->
    <bean id="dataSource" parent="abstractXADataSource">
      <!-- value只要两个数据源不同就行,随便取名 -->
      <property name="uniqueResourceName" value="oracle/sitestone" />
      <!-- 注意className,不同的数据库不一样 -->
      <property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource"/>
      <property name="xaProperties">
    	  <props>
    		  <prop key="URL">jdbc:oracle:thin:@10.211.107.202:1521:xe</prop>
    		  <prop key="user">hap_dev</prop>
    		  <prop key="password">hap_dev</prop>
    	  </props>
      </property>
    </bean>
    
    <!-- 配置第二个数据源-->
    <bean id="dataSource2" parent="abstractXADataSource">
      <!-- value只要两个数据源不同就行,随便取名 -->
      <property name="uniqueResourceName" value="mysql/sitesttwo" />
      <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
      <property name="xaProperties">
    	  <props>
    		  <prop key="url">jdbc:mysql://10.211.107.202:3306/hap_dev</prop>
    		  <prop key="user">hap_dev</prop>
    		  <prop key="password">hap_dev</prop>
    	  </props>
      </property>
    </bean>
    
    <!-- 分布式事务 -->
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
    	<property name="forceShutdown" value="true"/>
    </bean>
    
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    	<property name="transactionTimeout" value="300"/>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    	<property name="transactionManager" ref="atomikosTransactionManager"/>
    	<property name="userTransaction" ref="atomikosUserTransaction"/>
    </bean>
    

    后端开发

    代码生成器

    访问如下地址,填写必要参数后,系统将自动生成对应业务的Html,Controller,Service,ServiceImp,Mapper,MapperXml,Dto。注意,在正式项目中,主键策略一率选择雪花Id。

    http://localhost:8080/applicationTemplete/generator/generator.html
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgOS1L6m-1586308930975)(.\pic\20190315-152620.png)]

    编写DTO

    DTO类

    • DTO 类不需要提供任何实现,所以属于供应方的服务接口层。创建在 项目模块xxx.<module>.dto 包下。
    • 每一个 DTO 类即为一个实体类,对应数据库中的一个具体表。
    • 名称与表名称相同,表名中 _ 替换为驼峰命名法,首字母大写,且忽略前缀。如:UserRole 对应表为 sys_user_role
    • LCP 依赖 java bean 命名规范。请严格遵循规范定义属性,getter,setter等.
    • @Table(name = "table_name") 指定 DTO 对应数据库中表的名称。
    • 每一个 DTO 对应数据库中的一个具体表,一般都需要继承 ExtensionBaseDto 类。

    DTO属性

    • 所有属性均为private属性。
    • 每一个属性需要生成对应的 gettersetter 方法。
    • 字段名称应根据驼峰命名规则从数据库列名转换过来
      • 例如:数据库列名为 USER_NAME,则字段名为 userName
      • 特殊字段名称,可以在字段在添加@Column(name = "xxx") 注解,指定数据库列名
    • 非数据库字段,需要用@Transient 标注
      • javax.persistence.Transient
    • 属性的的类型与字段的 type 对应
      • 不使用基本类型,全部使用基本类型的包装类,如 Long 对应数据库中的 INTEGER,而不是使用 long
      • 数字类型主键统一采用 Long
      • 金额、数量 等精度严格浮点类型采用 BigDecimal
        • 注意 BigDecimal 在计算、比较方面的特殊性
    • 所有的主键字段都需要用@Id标注
      • 对于自增张、序列(SEQUENCE)类型的主键,需要添加注解@GeneratedValue
      • 序列命名规范:表名_S
        • 例如:表 SYS_USER 对应的序列为 SYS_USER_S

    编写Mapper

    Mapper接口

    • Mapper 接口类即为传统意义上的 DAO,但与 interface 不同,Mapper 本身就是对数据访问的具体实现,所以属于供应方的服务实现层。创建在 项目模块xxx.<module>.mapper 包下。
    • 每一个 Mapper 接口类封装了对数据库表的操作,每一个 Mapper 对应一个 DTO 类,所以命名为 DTO 类名 + Mapper。如:UserRoleMapper 对应表为 UserRole 类。
    • 基础的 CRUD 操作不需要再次实现,通过继承 ExtensionMapper<T> 类实现。其中 T 为 对应 DTO 的泛型。
    • 复杂的数据库操作需要定义具体的接口方法。

    Mapper脚本

    • Mapper.xml 是数据库的的具体映射,与 Mapper 接口同级,创建在 项目模块 resources 目录的 xxx.<module>.mapper 包下。
    • Mapper.xml,与 Mapper 接口对应。所以命名 Mapper 接口类相同。
    • 对于基本的 CRUD 不需要进行配置,所以也就不需要创建对应的 Mapper.xml 文件。
    • 对于自定义的数据库方法,需要创建对应的 Mapper.xml 文件。
    • Mapper.xml 中的操作 id 对应 Mapper 接口类的方法名。

    编写Service

    Service接口

    • Service 接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在 项目模块xxx.<module>.service 包下。
    • 接口(interface)统一以大写字母 I 做为命名前缀
    • 每一个 Service 对应一个 DTO 类,所以命名为I + DTO 类名 + Service。如:IUserRoleService 对应表为 UserRole 类。
    • Service 里的每一个方法需要加上IRequest对象作为参数。
    • Service 接口,如无特殊例外,需要继承IExtensionBaseService<T>ProxySelf<T> 接口
      • T 为 Service 本身

    Service实现类

    • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在 项目模块xxx.<module>.service.impl 包下。
    • 每一个 Service 实现类对应一个 Service 接口类,所以命名为 Service 接口类名(去掉I前缀) + Impl。如:UserRoleServiceImpl 对应 IUserRoleService 类。
    • 实现类,如无特殊情况,需要用@Service标注,以自动扫描注册
    • 实现类可以通过继承ExtensionBaseServiceImpl<T> 来获得标准的 CRUD 操作支持
      • 需要 Service 接口类 继承 IExtensionBaseService<T>

    编写Controller

    • Controller 负责对 Model 和 View 的处理,创建在 项目模块 的 xxx..controllers 包下。
    • 每一个 Controller 是对一个具体的 DTO 资源进行处理的,所以命名为 DTO 类名 + Controller。如: UserRoleController 对应 UserRole 类。
    • 需要通过 @Controller 指定该类为一个 Controller 类。
    • 需要在每一个 Controller 中通过 @Autowired 注入 Service。

    前端开发

    目录划分

    按照web目录规范,前端文件存放在如下目录

      webapp
        ├─lib
        │  ├─asserts
        │  ├─bootstrap-3.3.7
        │  ├─dashboard
        │  ├─font-awesome-4.6.3
        │  ├─form-builder
        │  ├─jquery-ui
        │  ├─kendoui
        │  ├─polyfill
        │  └─websocket
        ├─resources
        │  ├─css
        │  ├─diagram-viewer
        │  ├─editor-app
        │  ├─font
        │  ├─images
        │  ├─js
        │  ├─upload
        └─WEB-INF
            ├─web.xml
            └─view
    

    资源文件按照类型划分为两个目录:libresources

    • lib目录存放kendoui的所有文件
    • resources目录存放程序通用的资源文件

    功能文件存放在view目录下

    • 目录的命名规则为[模块代码]/[功能项代码]
    • 例如:用户管理的功能代码是SYS001,那么用户管理相关的界面文件都存放在src/main/webapp/WEB-INF/view/sys/sys001/

    命名规范

    界面文件,按照如下格式:[模块代码]/[业务对象]/query

    • 例如:用户查询界面: sys_user_query.html

    系统中url地址,按照以下格式命名:[contextPath]/[模块代码]/[业务对象]/[操作类型]。对于常见的几种操作类型定义如下

    • 查询:[模块代码]/[业务对象]/query
    • 提交:[模块代码]/[业务对象]/submit
    • 删除:[模块代码]/[业务对象]/remove

    PC客户端,使用JQuery,KendoUI,Bootstrap,Fort Awesome等框架进行开发。移动端,使用VUE,MUI等框架进行开发。访问首页地址,可获取以上所有框架的帮助文档。

    列表页面示例

    在这里插入图片描述

    <!-- PC端页面都会引入这个头文件,里面包含了js、css文件的引入,公共的脚本等 -->
    <#include "../include/header.html">
    <body>
    	<script type="text/javascript">
            // PC端采用kendoUI进行开发,每个页面至少有一个ViewModel。这里使用Hap.createGridViewModel 方法初始化viewModel,其默认了表格的增删查改操作方法。
            var viewModel = Hap.createGridViewModel("#grid");
        </script>
        
        <div class="page-content">
            <form class="form-horizontal" id="query-form">
                <div id="queryPanel">
                    <div class="form-group">
                        <div class="col-sm-4">
                            <label class="control-label col-sm-4"><@spring.message "sys.dashboard.dashboardcode"/></label>
                            <div class="col-sm-8">
                                <input type="text" class="k-textbox" data-bind="value:model.dashboardCode"/>
                            </div>
                        </div>
                        <div class="col-sm-4">
                            <label class="control-label col-sm-4"><@spring.message "sys.dashboard.dashboardtitle"/></label>
                            <div class="col-sm-8">
                                <input type="text" class="k-textbox" data-bind="value:model.title"/>
                            </div>
                        </div>
                    </div>
    
                </div>
                <div id="line"></div>
                <div class="clearfix"></div>
                <div class="pull-right" style="padding-bottom:10px;margin-right: 15px">
                    <span class="btn btn-primary" data-bind="click:query" type="submit"><i class="fa fa-search"></i><@spring.message "hap.query"/></span>
                    <span class="btn btn-primary" type="button" data-bind="click:reset"> <i class="fa fa-eraser"></i><@spring.message "hap.reset"/></span>
                    <span class="btn btn-primary" data-bind="click:create"><i class="fa fa-plus-square"></i><@spring.message "hap.new"/></span>
                    <span class="btn btn-primary" data-bind="click:save"><i class="fa fa-save"></i><@spring.message "hap.save"/></span>
                    <span class="btn btn-danger" data-bind="click:remove"><i class="fa fa-trash-o"></i><@spring.message "hap.delete"/></span>
                    <span class="btn btn-primary" data-bind="click:exportExcel"><i class="fa fa-file-excel-o"></i><@spring.message "hap.exportexcel"/></span>
                </div>
                <script>
                	  // 绑定viewModel
                    kendo.bind($('#query-form'), viewModel);
                    // 添加分隔符
                    $("#line").kendoDivideLine({
                        hasIcon: false
                    });
                </script>
                <div class="clearfix"></div>
                // 表格
                <div id="grid"></div>
            </form>
    
        </div>
    
    
        <script type="text/javascript">
        	  // 给查询表单绑定回车键触发事件
            Hap.initEnterQuery("#query-form", viewModel.query);
    	   // 定义表格的数据源
            var dataSource = Hap.createGridDataSource({
                url:'${base.contextPath}/sys/dashboard/',
                model: {
                    id: "dashboardId",
                    fields: {
                    	// 这里定义表格字段的类型、默认值、校验规则等
                        dashboardCode: {
                            type: "string",
                            validation:{required:true}
                        },
                        title: {
                            type: "string",
                            validation:{required:true}
                        },
                        description: {
                            type: "string"
                        },
                        resourceId: {
                            type: "int",
                            validation:{required:true}
                        },
                        enabledFlag:{
                            defaultValue: 'Y',type:'String' ,checkedValue:'Y',uncheckedValue:'N'
                        },
                        sortNum:{
                            defaultValue: 0,type:'number'
                        }
                    },
                    // 定义列是否可以编辑
                    editable: function (col) {
                        if (col == "dashboardCode" && this.dashboardId) {
                            return false;
                        }
                        return true;
                    }
                }
            });
    	   // 表格定义
            var grid = $("#grid").kendoGrid({
                dataSource: dataSource,
                navigatable: false,
                dataBound: function () {
                    if (parent.autoResizeIframe) {
                        parent.autoResizeIframe('${RequestParameters.functionCode!}')
                    }
                    // 将首列标题改为'序号'(默认是#号)
                    $("#grid th").eq(0).text("序号");
                },
                resizable: true,
                scrollable: true,
                rownumber: true, // 显示行号
                selectable: 'multiple, rowbox', // 定义是否可选,这里定义为可多选,并且有勾选框
                pageable: {
                    pageSizes: [5, 10, 20, 50],
                    refresh: true,
                    buttonCount: 5
                },
                sortable: true,
                editable: true,
                // 定义列
                columns: [
                    {
                        field: "dashboardCode",
                        title: '<@spring.message "sys.dashboard.dashboardcode"/>',
                        width: 180
                    },
                    {
                        field: "title",
                        title: '<@spring.message "sys.dashboard.dashboardtitle"/>',
                        width: 180,
                        // editor 定义列的编辑样式,比如这里添加了TLEdit输入框
                        editor: function (container, options) {
                            $(
                                '<input required name="' + options.field + '"/>')
                                .appendTo(container)
                                .kendoTLEdit(
                                    {
                                        idField: 'dashboardId',
                                        field: 'title',
                                        dto: "com.hand.hap.system.dto.DashBoard",
                                        model: options.model
                                    });
                        }
                    },
                    {
                        field: "description",
                        title: '<@spring.message "sys.dashboard.dashboarddescription"/>',
                        width: 150,
                        editor: function (container, options) {
                            $(
                                '<input name="' + options.field + '"/>')
                                .appendTo(container)
                                .kendoTLEdit(
                                    {
                                        idField: 'dashboardId',
                                        field: 'description',
                                        dto: "com.hand.hap.system.dto.DashBoard",
                                        model: options.model
                                    });
                        }
                    },
                    {
                        field: "resourceId",
                        title: '<@spring.message "sys.dashboard.dashboardmainpage"/>',
                        width: 120,
                        sortable: false,
                        // template 可以定义列的显示样式,比如显示一个操作按钮,或者一个链接或者其它字段的值。
                        template: function (dataItem) {
                            return dataItem['resourceName']
                                || ''
                        },
                        editor: function (container, options) {
                            $('<input  required  name="' + options.field + '"/>')
                                .appendTo(container).kendoLov($.extend(<@lov "LOV_RESOURCE" />,
                                {
                                    textField: 'resourceName',
                                    model: options.model
                                }
                            ));
                        }
                    },
                    {
                        field: "sortNum",
                        title: '排序号',
                        width: 50,
                    },
                    {
                        field: "enabledFlag",
                        title: '<@spring.message "interface.enableflag"/>',
                        attributes: {style: "text-align:center"},
                        width: 50,
                    },
                ]
            }).data("kendoGrid");
    
            Hap.autoResizeGrid("#grid");
            // 从第一列开始包括第一列给显示不全的格子添加tooltip显示完整内容
            Lcp.gridToolTip("#grid",1);
        </script>
    
    </body>
    </html>
    

    明细页面示例

    在这里插入图片描述

    <#include "../include/header.html">
    <script type="text/javascript">
        var viewModel = Hap.createGridViewModel("#grid",{
            model:{
    			// 获取url的参数
                id : '${RequestParameters.businessKey!}',
                editable : '${RequestParameters.editable!}'
            }
        });
    
    	// 查询数据
        $.ajax({
            type: "POST",
            url: "${base.contextPath}/t/m/activity/type/queryActivityTypesList",
            data: {id: viewModel.model.id},
            dataType: "json",
            async : false,
            success: function (data) {
    			
                if (data.success) {
                    var row = data.rows[0];
                    for (var k in row) {
    					// 赋值数据到viewModel
                        viewModel.model.set(k, row[k]);
                    }
                } else {
    				// 弹框提示错误
                    kendo.ui.showErrorDialog({
                        message: data.message
                    })
                }
            }
        });
    </script>
    <body>
    <div id="page-content">
        <div id="employee_select_window" style="display: none"></div>
        <form class="form-horizontal" id="detailForm">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h4 class="panel-title">
                        <a class="panel-accordion fa fa-angle-double-up" target-panel="headInfo">基础信息</a>
                    </h4>
                </div>
                <div id="headInfo" class="panel-body">
                    <div class="form-group">
                        <div class="col-sm-4">
                            <label class="col-sm-4 control-label">活动类型代码 </label>
                            <div class="col-sm-8">
                                <input class="k-textbox" disabled="disabled" data-bind="value : model.activityTypeCode" style="background-color: #EFEFEF" />
                            </div>
                        </div>
                        <div class="col-sm-4">
                            <label class="col-sm-4 control-label">活动类型<span style="color: red">*</span></label>
                            <div class="col-sm-8">
                                <input id="applyDate"  class="k-textbox" data-bind="value:model.activityTypeName"  required="required"/>
                            </div>
                        </div>
                        <div class="col-sm-4">
                            <label class="col-sm-4 control-label" >组织<span style="color: red">*</span></label>
                            <div class="col-sm-8">
                                <input   data-bind="value:model.orgName"  id="orgName" required="required"/>
                            </div>
                            <script>
                                // 初始化一个选择组织的 LOV
                                $("#orgName").kendoLov($.extend(<@lov "ORG_MCODE_NAME" />, {
                                    valuePrimitive:true,
                                    dataTextField: 'name',
                                    dataValueField: 'name',
                                    textField: 'orgName',
                                    model: viewModel.model,
                                    select : function(e){
                                        viewModel.model.set('orgMcode',e.item.mdmCode);
                                    }
                                }))
                            </script>
                        </div>
                    </div>
    
    
                </div>
            </div>
    
    
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h4 class="panel-title">
                        <a class="panel-accordion fa fa-angle-double-up" target-panel="budget">激励费用出处</a>
                    </h4>
                </div>
    
                <div id="budget" class="panel-body" >
                    <div style="clear:both">
                        <div id="gridButton" class="form-group">
                            <div class="pull-left" style="margin-left: 20px">
                                <span class="btn btn-primary k-grid-add" style="float:left;margin-right:5px;" οnclick="createGrid()" ><i class="fa fa-plus-square"></i>新增</span>
                                <!--<span class="btn btn-danger" style="float:left;margin-right:5px;" data-bind="click:remove"><i class="fa fa-trash-o"></i>删除</span>-->
                                <span data-hotkey="hotkey_delete" class="btn btn-danger"οnclick="removeGrid()" style="float:left;"><i class="fa fa-trash-o" style="margin-right:3px;"></i><@spring.message "hap.delete"/></span>
                            </div>
                        </div>
                        <div id="grid"></div>
                    </div>
                </div>
            </div>
        </form>
        <div style="position:fixed;right: 10px; z-index: 100;margin-top: 10px">
            <div id="addEditButton2">
                <span id="delete" class="btn btn-danger " οnclick="removeActive()"style="float:right;margin-right:5px;"><i class="fa fa-trash-o"></i>删除</span>
                <span class="btn btn-primary k-grid-add" οnclick="submit()" style="float:right;margin-right:5px;"><i class="fa fa-save"></i>提交</span>
            </div>
        </div>
    </div>
    
    <script type="text/javascript">
        kendo.bind($('#page-content'), viewModel);
        var BaseUrl = _basePath;
        dataSource = new kendo.data.DataSource({
            transport: {
                read: {
                    url: BaseUrl + "/t/m/activity/type/cost/type/queryMActivityTypeCostType",
                    type: "POST",
                    dataType: "json"
    
                },
                update: {
                    url: BaseUrl + "/t/m/activity/type/activitySave",
                    type: "POST",
                    contentType: "application/json"
                },
               destroy: {
                    url: BaseUrl + "/t/m/activity/type/cost/type/remove",
                    type: "POST",
                    contentType: "application/json"
                },
             /*   create: {
                    url: BaseUrl + "/t/m/dept/project/SaveProDep",
                    type: "POST",
                    contentType: "application/json"
                },*/
                parameterMap: function (options, type) {
                    if (type !== "read" && options.models) {
                        var datas = Hap.prepareSubmitParameter(options, type)
                        return kendo.stringify(datas);
                    } else if (type === "read") {
                        return Hap.prepareQueryParameter(viewModel.model.toJSON(), options)
                    }
                }
            },
            batch: true,
            serverPaging: true,
            pageSize: 20,
            schema: {
                data: 'rows',
                total: 'total',
                model: {
                    id: "id",
                    fields: {}
                }
            }
        });
    
        $("#grid").kendoGrid({
            dataSource: dataSource,
            rownumber: true,
            resizable: true,
            scrollable: true,
            navigatable: false,
            selectable: 'multiple, rowbox',
            dataBound: function () {
                if (parent.autoResizeIframe) {
                    parent.autoResizeIframe('${RequestParameters.functionCode!}')
                }
                $(".k-grid-header colgroup").children().eq(0).width("40px");
                $(".k-grid-content colgroup").children().eq(0).width("40px");
                $("#grid th").eq(0).text("序号");
            },
            pageable: {
                pageSizes: [5, 10, 20, 50],
                refresh: true,
                buttonCount: 5
            },
            columns: [
                {
                    field: "costTypeName",
                    title: '费用激励出处',
                    width: 120,
                    editable: true,
                    headerAttributes: {
                        style: "text-align: center"
                    },
                    attributes: {
                        "class": "table-header-cell",
                        style: "text-align: center;"
                    },
                    template: function (dataItem) {
                        return dataItem.costTypeName||"";
                    },
                    editor: function(container, options) {
                        var sourceCityName = options.model.costTypeName||'';
                        var input = $('<input name="' + options.field + '" required="required"/>');
                        input.appendTo(container);
                        input.kendoLov($.extend(<@lov "GET_COSTTPES"/>, {
                            textField:'costTypeName',
                            model:options.model,
                            dataTextField: 'costTypeName',
                            dataValueField: 'id',
                            valuePrimitive:true,
                            select : function(e){
                                 options.model.set('costTypeCode',e.item.costTypeCode);
                                 options.model.set('costTypeName',e.item.costTypeName);
                                 options.model.set('costTypeId',e.item.id);
                               //  alert("----"+e.item.id);
    
                            }
                        }))
                    }
                },
    
                {
                    field: "costTypeCode",
                    title: '费用激励出处代码',
                    width: 120,
                    headerAttributes: {
                        style: "text-align: center"
                    },
                    attributes: {
                        "class": "table-header-cell",
                        style: "text-align: center;"
                    },
                    editor: function(container, options) {
                        var v = options.model.costTypeCode;
                        if (v){
                            $('<span>' + v + '</span>').appendTo(container);
                        }
                    }
    
                },
             ],
            editable: true
        });
    
    
    
        function createGrid() {
            var grid = $("#grid").data("kendoGrid");
            grid.addRow();
        }
        function removeGrid() {
            Hap.blockUI(); // 给页面添加loading框,避免重复操作
            var costtypeDatas = $("#grid").data("kendoGrid").selectedDataItems();
            if (!costtypeDatas.length) {
                kendo.ui.showInfoDialog({
                    message: '请选择要删除的费用激励!'
                })
            } else {
                kendo.ui.showConfirmDialog({
                    message: '确认删除吗?'
                }).done(function (e) {
                    if (e.button == "OK") {
                        // ... 这里进行删除操作
                    }
    
                })
            }
            Hap.unblockUI();
    
    
        }
    
        function submit() {
            Hap.blockUI();
            // ... 数据校验及提交数据
            Hap.unblockUI();
        }
    
        function removeActive() {
            Hap.blockUI();
            //  var budgetDatas = $("#budgetGrid").data("kendoGrid").selectedDataItems();怎么选择数据源,model中的
    
            kendo.ui.showConfirmDialog({
                message: '确认删除吗?'
            }).done(function (e) {
                //  var applyNo = viewModel.model.applyNo;
                if (e.button == "OK") {
                    // ... 删除数据
                }
            })
    
            Hap.unblockUI();
        }
    
    </script>
    
    </body>
    </html>
    

    项目集成

    一般来讲,各个业务项目,还需要在以下方面和平台进行集成

    • 基础数据:基于MQ,从MDM同步组织,部门,岗位,员工,工作信息,数据字典数据
    • 员工账户:基于MQ,从门户同步账户数据
    • 单点登录:基于CAS,完成单点登录集成
    • 使用菜单:基于约定的对接方式,完成菜单集成
    • 任务管理:基于约定的对接方式,完成任务集成
    • 文件管理:基于FASTDFS,完成上传文件的统一存储
    • 接口管理:基于RESTFul或者SOAP规则,完成接口集成

    ata(“kendoGrid”).selectedDataItems();
    if (!costtypeDatas.length) {
    kendo.ui.showInfoDialog({
    message: ‘请选择要删除的费用激励!’
    })
    } else {
    kendo.ui.showConfirmDialog({
    message: ‘确认删除吗?’
    }).done(function (e) {
    if (e.button == “OK”) {
    // … 这里进行删除操作
    }

            })
        }
        Hap.unblockUI();
    
    
    }
    
    function submit() {
        Hap.blockUI();
        // ... 数据校验及提交数据
        Hap.unblockUI();
    }
    
    function removeActive() {
        Hap.blockUI();
        //  var budgetDatas = $("#budgetGrid").data("kendoGrid").selectedDataItems();怎么选择数据源,model中的
    
        kendo.ui.showConfirmDialog({
            message: '确认删除吗?'
        }).done(function (e) {
            //  var applyNo = viewModel.model.applyNo;
            if (e.button == "OK") {
                // ... 删除数据
            }
        })
    
        Hap.unblockUI();
    }
    
    ```

    项目集成

    一般来讲,各个业务项目,还需要在以下方面和平台进行集成

    • 基础数据:基于MQ,从MDM同步组织,部门,岗位,员工,工作信息,数据字典数据
    • 员工账户:基于MQ,从门户同步账户数据
    • 单点登录:基于CAS,完成单点登录集成
    • 使用菜单:基于约定的对接方式,完成菜单集成
    • 任务管理:基于约定的对接方式,完成任务集成
    • 文件管理:基于FASTDFS,完成上传文件的统一存储
    • 接口管理:基于RESTFul或者SOAP规则,完成接口集成

    参考对应的章节,了解上述各项的技术要求

    展开全文
  • HTML快速入门

    千次阅读 2018-07-17 10:11:13
    一旦入门后,你可以从网上找到更多更详细的资料来继续学习。 什么是HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,它规定了自己的语法规则,用来表示比"文本"更丰富的意义,比如...
  • Spring入门第一讲——Spring框架的快速入门

    万次阅读 多人点赞 2017-04-08 00:27:34
    Spring的概述什么是Spring据度娘所载: Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。...
  • JavaWeb快速入门(一)——新建JavaWeb项目

    万次阅读 多人点赞 2018-07-04 20:01:33
    今天是暑期实训的第三天,上午继续昨天未讲完的任务java,比如:java的异常处理、java的集合等其它java常用知识,具体讲解链接如下。下午开始将JavaWeb服务器端程序开发,包含:处理请求和展示返回回来的数据。...
  • 小猪的C语言快速入门系列(一)

    万次阅读 多人点赞 2017-10-12 16:37:14
    教程会把 C语言入门 的核心内容做关键知识点的提纯,去除一些笼统的废话,配以思维导图与经典例子, 相信可以让初学者更快的上手C语言。另外笔者只是大学学过下C基础的东西, 不是专业选手,如果本教程有什么纰漏...
  • 快速入门51单片机

    千次阅读 多人点赞 2018-05-09 09:08:55
    有些学生觉得单片机很难学其实掌握入门方法也不难 开发环境搭建,不用多说,看网上教程 拿到51单片机该如何做? 首先打开看51单片机的管脚分布,51单片机是8个引脚一组,为什么是8个一组呢? 因为它是8位...
  • Qt Creator快速入门

    千次下载 热门讨论 2012-10-05 10:34:10
    花了不少时间整理的 希望能帮助大家q入门
  • Unity快速入门系列课程(第1部)

    千人学习 2019-05-08 15:49:57
    为满足入门学员的学习要求,“刘国柱讲Unity”系列课程,因此推出了本套“Unity快速入门系列课程”,目前内容包含如下:     1: 项目“我的世界”: 讲解Unity软件的重要组成窗口与基本使用。 ...
  • c语言快速入门

    万次阅读 多人点赞 2020-04-17 18:42:42
    该c语言是针对学生学习的哦(考研/升本/接本等等) 专接本c语言基础知识讲解 该视频为本人录制。
  • uni-app是一个使用 Vue.js 开发跨平台应用的前端框架,使用hbuilder X可以快速将一套代码打包至最多7个平台。对于个人开发者,或者创业公司来说就是开发神器,省去了很多开发成本。下面就给大家介绍一下怎么快速上手...
  • Maven入门指南 :Maven 快速入门及简单使用前言 Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目。主要用于项目构建,依赖管理,项目信息管理。 maven项目在编译、测试、打包里,会需要从...
  • 小猪的C语言快速入门系列(五)

    万次阅读 多人点赞 2017-10-16 16:32:26
    小猪的C语言快速入门系列(五)标签: C语言本节引言:上一节我们C语言 复合数据类型 中的 数组 进行了解读,本节我们会继续来学习 复合数据类型中的 指针,指针可是C语言的灵魂;利用指针可以表示与使用复杂的 数据...
  • LaTeX实战经验:从零开始快速入门

    万次阅读 多人点赞 2016-01-29 16:29:54
    本文的长期更新版本在我的新博客:new blog对于理工科的学生来说,尤其是从研究生阶段开始,LaTeX应该会是日常中必不可少的科研工具。...此篇为写给一些想快速入门LaTeX的朋友,本人学识与能力有限,以下内容如有纰
  • SpringMVC快速入门第一讲——SpringMVC介绍与入门

    万次阅读 多人点赞 2017-05-15 22:50:55
    SpringMVC介绍SpringMVC是什么?SpringMVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来: SpringMVC处理流程SpringMVC处理流程如下...SpringMVC入门程序本系列教程使
  • IntelliJ IDEA 快速入门指南

    万次阅读 多人点赞 2016-07-03 17:05:30
    本节内容:- 运行你的第一个Java应用程序- 熟悉主界面- 智能编码- 简单的项目配置- 构建您的项目- 运行和调试应用程序- 运行测试- 部署你的应用到服务器上- 定制一切- 找到适合你的方式- 从Eclipse或NetBeans的迁移-...
  • 小猪的C语言快速入门系列(四)

    万次阅读 多人点赞 2017-10-16 15:08:36
    小猪的C语言快速入门系列(四)标签: C语言本节引言:经过前面三节的学习,我们对于C语言有了一点基本的了解, 假如现在要你根据下面的题目写一个这样的代码应该不难吧:题目: 输入五个学生的成绩,然后求出总和和...
  • Apache Shiro 快速入门教程,shiro 基础教程

    万次阅读 多人点赞 2015-06-03 10:51:46
    第一部分 什么是Apache Shiro 1、什么是 apache shiro : Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理 如同 Spring security 一样都是是一个权限安全框架,但是...

空空如也

1 2 3 4 5 ... 20
收藏数 313,871
精华内容 125,548
关键字:

快速入门