pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc</groupId>
<artifactId>wchat</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>wchat</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置全局属性-->
<settings>
<!--使用jdbc的getGeneratedKeys获取数据库自增主键值-->
<setting name="useGeneratedKeys" value="true" />
<!--使用列标签替换列别名 默认:true-->
<setting name="useColumnLabel" value="true"/>
<!--开启驼峰命名转换:Table{create_time} -> Entity{createTime}-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
application.properties:
server.context-path=/demo
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=1234
#Mybatis
mybatis_config_file=mybatis-config.xml
mapper_path=/mapper/**.xml
entity_package=com.imooc.demo.entity
Area.java:
package com.imooc.demo.entity;
import java.util.Date;
/**
* Created by yrui on 2018/9/3.
*/
public class Area {
private Integer areaId;
private String areaName;
private Integer priority;
private Date createTime;
private Date lastEditTime;
public Integer getAreaId() {
return areaId;
}
public void setAreaId(Integer areaId) {
this.areaId = areaId;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public Integer getPriority() {
return priority;
}
public void setPriority(Integer priority) {
this.priority = priority;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getLastEditTime() {
return lastEditTime;
}
public void setLastEditTime(Date lastEditTime) {
this.lastEditTime = lastEditTime;
}
}
DataSourceConfiguration.java:
package com.imooc.demo.config.dao;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.beans.PropertyVetoException;
/**
* Created by yrui on 2018/9/3.
*/
@Configuration
//配置mybatis mapper的扫描路径
@MapperScan("com.imooc.demo.dao")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String jdbcDriver;
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Bean(name="dataSource")
public ComboPooledDataSource createDataSource() throws PropertyVetoException{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(jdbcDriver);
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUser(jdbcUsername);
dataSource.setPassword(jdbcPassword);
//关闭连接后不自动commit
dataSource.setAutoCommitOnClose(false);
return dataSource;
}
}
SessionFactoryConfiguration.java:
package com.imooc.demo.config.dao;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
/**
* Created by yrui on 2018/9/3.
*/
@Configuration
public class SessionFactoryConfiguration {
//mybatis-config.xml配置文件路径
@Value("${mybatis_config_file}")
private String mybatisConfigFilePath;
//mybatis mapper文件所在路径
@Value("${mapper_path}")
private String mapperPath;
//实体类所在的package
@Value("${entity_package}")
private String entityPackage;
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
@Bean(name="sqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFilePath));
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageSearchPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+mapperPath;
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageSearchPath));
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage(entityPackage);
return sqlSessionFactoryBean;
}
}
TransactionManagementConfiguration.java
package com.imooc.demo.config.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import javax.sql.DataSource;
/**
* Created by yrui on 2018/9/3.
*/
@Configuration
@EnableTransactionManagement
public class TransactionManagementConfiguration implements TransactionManagementConfigurer{
@Autowired
private DataSource dataSource;
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
AreaDao.java:
package com.imooc.demo.dao;
import com.imooc.demo.entity.Area;
import java.util.List;
/**
* Created by yrui on 2018/9/3.
*/
public interface AreaDao {
List<Area> queryArea();
Area queryAreaById(int areaId);
int insertArea(Area area);
int updateArea(Area area);
int deleteArea(int areaId);
}
AreaService.java:
package com.imooc.demo.service;
import com.imooc.demo.entity.Area;
import java.util.List;
/**
* Created by yrui on 2018/9/3.
*/
public interface AreaService {
List<Area> getAreaList();
Area getAreaById(int areaId);
boolean addArea(Area area);
boolean modifyArea(Area area);
boolean deleteArea(int areaId);
}
AreaServiceImpl.java:
package com.imooc.demo.service.impl;
import com.imooc.demo.dao.AreaDao;
import com.imooc.demo.entity.Area;
import com.imooc.demo.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* Created by yrui on 2018/9/3.
*/
@Service
public class AreaServiceImpl implements AreaService{
@Autowired
private AreaDao areaDao;
@Override
public List<Area> getAreaList() {
return areaDao.queryArea();
}
@Override
public Area getAreaById(int areaId) {
return areaDao.queryAreaById(areaId);
}
@Transactional
@Override
public boolean addArea(Area area) {
if(area.getAreaName()!=null&&!"".equals(area.getAreaName())){
area.setCreateTime(new Date());
area.setLastEditTime(new Date());
try{
int effectedNum = areaDao.insertArea(area);
if(effectedNum>0){
return true;
}else{
throw new RuntimeException("插入区域信息失败!");
}
}catch (Exception e){
throw new RuntimeException("插入区域信息失败:"+e.getMessage());
}
}else{
throw new RuntimeException("区域信息不能为空!");
}
}
@Override
public boolean modifyArea(Area area) {
if(area.getAreaId()!=null&&area.getAreaId()>0){
area.setLastEditTime(new Date());
try{
int effectedNum = areaDao.updateArea(area);
if(effectedNum>0){
return true;
}else{
throw new RuntimeException("更新区域信息失败!");
}
}catch (Exception e){
throw new RuntimeException("更新区域信息失败:"+e.toString());
}
}else{
throw new RuntimeException("区域信息不能为空!");
}
}
@Override
public boolean deleteArea(int areaId) {
if (areaId > 0) {
try {
int effectedNum = areaDao.deleteArea(areaId);
if (effectedNum > 0) {
return true;
} else {
throw new RuntimeException("删除区域信息失败!");
}
} catch (Exception e) {
throw new RuntimeException("删除区域信息失败:" + e.toString());
}
} else {
throw new RuntimeException("区域Id不能为空!");
}
}
}
AreaController.java:
package com.imooc.demo.web;
import com.imooc.demo.entity.Area;
import com.imooc.demo.service.AreaService;
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.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by yrui on 2018/9/3.
*/
@RestController
@RequestMapping("/superadmin")
public class AreaController {
@Autowired
private AreaService areaService;
@RequestMapping(value="/listarea",method = RequestMethod.GET)
private Map<String,Object> listArea(){
Map<String,Object> modelMap = new HashMap<String,Object>();
List<Area> list = areaService.getAreaList();
modelMap.put("areaList",list);
return modelMap;
}
@RequestMapping(value="/getareabyid",method = RequestMethod.GET)
private Map<String,Object> getAreaById(Integer areaId){
Map<String,Object> modelMap = new HashMap<String,Object>();
Area area = areaService.getAreaById(areaId);
modelMap.put("area",area);
return modelMap;
}
@RequestMapping(value="/addarea",method = RequestMethod.POST)
private Map<String,Object> addArea(@RequestBody Area area){
Map<String,Object> modelMap = new HashMap<String,Object>();
modelMap.put("success",areaService.addArea(area));
return modelMap;
}
@RequestMapping(value="/modifyarea",method = RequestMethod.POST)
private Map<String,Object> modifyArea(@RequestBody Area area){
Map<String,Object> modelMap = new HashMap<String,Object>();
modelMap.put("success",areaService.modifyArea(area));
return modelMap;
}
@RequestMapping(value="/removearea",method = RequestMethod.GET)
private Map<String,Object> removeArea(Integer areaId){
Map<String,Object> modelMap = new HashMap<String,Object>();
modelMap.put("success",areaService.deleteArea(areaId));
return modelMap;
}
}
AreaDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.imooc.demo.dao.AreaDao">
<select id="queryArea" resultType="com.imooc.demo.entity.Area">
SELECT area_id,area_name,priority,create_time,last_edit_time
from tb_area ORDER BY priority DESC
</select>
<select id="queryAreaById" resultType="com.imooc.demo.entity.Area">
SELECT area_id,area_name,priority,create_time,last_edit_time
from tb_area WHERE area_id = #{areaId}
</select>
<insert id="insertArea" useGeneratedKeys="true" keyProperty="areaId"
keyColumn="area_id" parameterType="com.imooc.demo.entity.Area">
INSERT INTO tb_area(area_name,priority,create_time,last_edit_time)
VALUES(#{areaName},#{priority},#{createTime},#{lastEditTime})
</insert>
<update id="updateArea" parameterType="com.imooc.demo.entity.Area">
UPDATE tb_area
<set>
<if test="areaName!=null">area_name=#{areaName},</if>
<if test="priority!=null">priority=#{priority},</if>
<if test="lastEditTime!=null">last_edit_time=#{lastEditTime}</if>
</set>
WHERE area_id=#{areaId}
</update>
<delete id="deleteArea">
DELETE FROM tb_area WHERE area_id=#{areaId}
</delete>
</mapper>
后台编写完成,前台使用微信web开发者工具编写。
将index.js中的事件处理函数的url改为“../list/list”
list.json:
改标题名
{
"navigationBarTitleText": "区域信息列表"
}
list.wxml:
<!--pages/list/list.wxml-->
<view class='container'>
<view class='widget'>
<text class='column'>ID</text>
<text class='column'>区域名</text>
<text class='column'>优先级</text>
<text class='link-column'>操作</text>
</view>
<scroll-view scroll-y="true">
<view>
<block wx:for="{{list}}">
<view class='widget'>
<text class='column'>{{item.areaId}}</text>
<text class='column'>{{item.areaName}}</text>
<text class='column'>{{item.priority}}</text>
<view class='link-column'>
<navigator class='link' url='../operation/operation?areaId={{item.areaId}}'>编辑</navigator> |
<text class='link' bindtap='deleteArea' data-areaid='{{item.areaId}}' data-areaname='{{item.areaName}}' data-index='{{index}}'>删除</text>
</view>
</view>
</block>
</view>
</scroll-view>
<button type='primary' bindtap='addArea'>添加区域信息</button>
</view>
list.wxss:
/* pages/list/list.wxss */
.widget {
position: relative;
margin-top: 5rpx;
margin-bottom: 5rpx;
padding-top: 10rpx;
padding-bottom: 10rpx;
padding-left: 40rpx;
padding-right: 40rpx;
border: #ddd 1px solid;
}
.container {
height: 100%;
display: table;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-top: 10rpx;
padding-bottom: 10rpx;
text-align: center;
}
.column {
width: 4rem;
display: table-cell;
}
.link-column {
width: 6rem;
display: table-cell;
}
.link {
color: blue;
display: inline-table;
}
list.js:
// pages/list/list.js
Page({
/**
* 页面的初始数据
*/
data: {
list: []
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
var that = this;
wx.request({
url: 'http://127.0.0.1:8080/demo/superadmin/listarea',
method: 'Get',
data: {},
success: function (res) {
var list = res.data.areaList;
if (list == null) {
var toastText = '获取数据失败' + res.data.errMsg;
wx.showToast({
title: toastText,
icon: '',
duration: 2000
});
} else {
that.setData({
list: list
});
}
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
addArea: function () {
wx.navigateTo({
url: '../operation/operation',
})
},
deleteArea: function (e) {
var that = this;
wx.showModal({
title: '提示',
content: '确定要删除[' + e.target.dataset.areaname + ']吗?',
success: function (sm) {
if (sm.confirm) {
wx.request({
url: 'http://127.0.0.1:8080/demo/superadmin/removearea',
data: { 'areaId': e.target.dataset.areaid },
method: 'GET',
success: function (res) {
var result = res.data.success;
var toastText = "删除成功!";
if (result != true) {
toastText = "删除失败!";
} else {
that.data.list.splice(e.target.dataset.index, 1);
that.setData({
list: that.data.list
});
wx.showToast({
title: toastText,
icon: '',
duration: 2000
});
}
}
})
}
}
})
}
})
operation.json:
{
"navigationBarTitleText": "区域信息表单"
}
operation.wxml:
<!--pages/operation/operation.wxml-->
<view class='container'>
<form bindsubmit='formSubmit' bindreset='formReset'>
<view class='row'>
<text>区域名:</text>
<input type='text' name="areaName" placeholder='请输入区域名' value='{{areaName}}' />
</view>
<view class='row'>
<text>优先级:</text>
<input type='number' name="priority" placeholder='数值越大越靠前' value='{{priority}}' />
</view>
<view class='row'>
<button type='primary' form-type='submit'>提交</button>
<button type='primary' form-type='reset'>清空</button>
</view>
</form>
</view>
operation.wxss:
/* pages/operation/operation.wxss */
.container{
padding: 1rem;
font-size: 0.9rem;
line-height: 1.5rem;
}
.row{
display: flex;
align-items: center;
margin-bottom: 0.8rem;
}
.row text{
flex-grow: 1;
text-align: right;
}
.row input{
font-size: 0.7rem;
flex-grow: 3;
border: 1px solid #0099CC;
display: inline-block;
border-radius: 0.3rem;
box-shadow: 0 0 0.15rem #aaa;
padding: 0.3rem;
}
.row button{
padding: 0 2rem;
margin: 3rem 1rem;
}
operation.js:
// pages/operation/operation.js
Page({
/**
* 页面的初始数据
*/
data: {
areaId:undefined,
areaName:'',
priority:'',
addUrl: "http://127.0.0.1:8080/demo/superadmin/addarea",
modifyUrl: "http://127.0.0.1:8080/demo/superadmin/modifyarea"
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that = this;
//页面初始化 options为页面跳转所带来的参数
this.setData({
areaId: options.areaId
});
if(options.areaId==undefined){
return;
}
wx.request({
url: 'http://127.0.0.1:8080/demo/superadmin/getareabyid',
data:{"areaId":options.areaId},
method:'GET',
success: function(res){
var area = res.data.area;
if(area==undefined){
var toastText = "获取数据失败"+res.data.errMsg;
wx.showToast({
title: toastText,
icon:'',
duration:2000
});
}else{
that.setData({
areaName:area.areaName,
priority:area.priority
});
}
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
formSubmit: function(e){
var that = this;
var formData = e.detail.value;
var url = this.data.addUrl;
if(that.data.areaId!=undefined){
formData.areaId = that.data.areaId;
url = this.data.modifyUrl;
}
wx.request({
url: url,
data: JSON.stringify(formData),
method: 'POST',
header: {
'Content-Type':'application/json'
},
success: function(res){
var result = res.data.success;
var toastText = "操作成功!";
if(result!=true){
toastText = "操作失败"+res.data.errMsg;
}
wx.showToast({
title: toastText,
icon:'',
duration:2000
});
if(that.data.areaId==undefined){
wx.redirectTo({
url: '../list/list',
})
}
}
})
}
})
完成!
最终效果: