Initial Commit

This commit is contained in:
dong_bo0602 2021-03-20 10:59:52 +08:00
commit c68f4fb7ad
38 changed files with 4050 additions and 0 deletions

14
.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
# Windows
[Dd]esktop.ini
Thumbs.db
$RECYCLE.BIN/
# macOS
.DS_Store
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
# Node.js
node_modules/

16
app.js Normal file
View File

@ -0,0 +1,16 @@
//app.js
var restAjax = require('utils/restAjax.js');
var dialog = require('utils/dialog.js');
App({
loginUrl: 'https://www.tenlion.com.cn/usercenter/',
// requestUrl: 'http://192.168.0.120:8083/servicecity/',
requestUrl: 'https://www.tenlion.com.cn/servicecity/',
restAjax: restAjax,
dialog: dialog,
onLaunch: function () {
},
globalData: {
userInfo: null
}
})

22
app.json Normal file
View File

@ -0,0 +1,22 @@
{
"pages":[
"pages/index/index",
"pages/caseCheck/caseCheck",
"pages/caseReport/caseReport",
"pages/caseDetail/caseDetail",
"pages/process/process"
],
"window":{
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#008cff",
"navigationBarTitleText": "片长制城市管理服务平台",
"navigationBarTextStyle":"white"
},
"style": "v2",
"sitemapLocation": "sitemap.json",
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
}
}

10
app.wxss Normal file
View File

@ -0,0 +1,10 @@
/**app.wxss**/
.container {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 200rpx 0;
box-sizing: border-box;
}

BIN
images/camera.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

BIN
images/default-avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
images/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 B

BIN
images/marker_red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

BIN
images/position.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

BIN
images/select.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

BIN
images/vioce.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 B

452
lib/bmap-wx.js Normal file
View File

@ -0,0 +1,452 @@
/**
* @file 微信小程序JSAPI
* @author 崔健 cuijian03@baidu.com 2017.01.10
* @update 邓淑芳 623996689@qq.com 2019.07.03
*/
/**
* 百度地图微信小程序API类
*
* @class
*/
class BMapWX {
/**
* 百度地图微信小程序API类
*
* @constructor
*/
constructor(param) {
this.ak = param["ak"];
}
/**
* 使用微信接口进行定位
*
* @param {string} type 坐标类型
* @param {Function} success 成功执行
* @param {Function} fail 失败执行
* @param {Function} complete 完成后执行
*/
getWXLocation(type, success, fail, complete) {
type = type || 'gcj02',
success = success || function () { };
fail = fail || function () { };
complete = complete || function () { };
wx.getLocation({
type: type,
success: success,
fail: fail,
complete: complete
});
}
/**
* POI周边检索
*
* @param {Object} param 检索配置
* 参数对象结构可以参考
* http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
*/
search(param) {
var that = this;
param = param || {};
let searchparam = {
query: param["query"] || '生活服务$美食&酒店',
scope: param["scope"] || 1,
filter: param["filter"] || '',
coord_type: param["coord_type"] || 2,
page_size: param["page_size"] || 10,
page_num: param["page_num"] || 0,
output: param["output"] || 'json',
ak: that.ak,
sn: param["sn"] || '',
timestamp: param["timestamp"] || '',
radius: param["radius"] || 2000,
ret_coordtype: 'gcj02ll'
};
let otherparam = {
iconPath: param["iconPath"],
iconTapPath: param["iconTapPath"],
width: param["width"],
height: param["height"],
alpha: param["alpha"] || 1,
success: param["success"] || function () { },
fail: param["fail"] || function () { }
};
let type = 'gcj02';
let locationsuccess = function (result) {
searchparam["location"] = result["latitude"] + ',' + result["longitude"];
wx.request({
url: 'https://api.map.baidu.com/place/v2/search',
data: searchparam,
header: {
"content-type": "application/json"
},
method: 'GET',
success(data) {
let res = data["data"];
if (res["status"] === 0) {
let poiArr = res["results"];
// outputRes 包含两个对象,
// originalData为百度接口返回的原始数据
// wxMarkerData为小程序规范的marker格式
let outputRes = {};
outputRes["originalData"] = res;
outputRes["wxMarkerData"] = [];
for (let i = 0; i < poiArr.length; i++) {
outputRes["wxMarkerData"][i] = {
id: i,
latitude: poiArr[i]["location"]["lat"],
longitude: poiArr[i]["location"]["lng"],
title: poiArr[i]["name"],
iconPath: otherparam["iconPath"],
iconTapPath: otherparam["iconTapPath"],
address: poiArr[i]["address"],
telephone: poiArr[i]["telephone"],
alpha: otherparam["alpha"],
width: otherparam["width"],
height: otherparam["height"]
}
}
otherparam.success(outputRes);
} else {
otherparam.fail({
errMsg: res["message"],
statusCode: res["status"]
});
}
},
fail(data) {
otherparam.fail(data);
}
});
}
let locationfail = function (result) {
otherparam.fail(result);
};
let locationcomplete = function (result) {
};
if (!param["location"]) {
that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
} else {
let longitude = param.location.split(',')[1];
let latitude = param.location.split(',')[0];
let errMsg = 'input location';
let res = {
errMsg: errMsg,
latitude: latitude,
longitude: longitude
};
locationsuccess(res);
}
}
/**
* sug模糊检索
*
* @param {Object} param 检索配置
* 参数对象结构可以参考
* http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api
*/
suggestion(param) {
var that = this;
param = param || {};
let suggestionparam = {
query: param["query"] || '',
region: param["region"] || '全国',
city_limit: param["city_limit"] || false,
output: param["output"] || 'json',
ak: that.ak,
sn: param["sn"] || '',
timestamp: param["timestamp"] || '',
ret_coordtype: 'gcj02ll'
};
let otherparam = {
success: param["success"] || function () { },
fail: param["fail"] || function () { }
};
wx.request({
url: 'https://api.map.baidu.com/place/v2/suggestion',
data: suggestionparam,
header: {
"content-type": "application/json"
},
method: 'GET',
success(data) {
let res = data["data"];
if (res["status"] === 0) {
otherparam.success(res);
} else {
otherparam.fail({
errMsg: res["message"],
statusCode: res["status"]
});
}
},
fail(data) {
otherparam.fail(data);
}
});
}
/**
* rgc检索逆地理编码经纬度->地点描述
*
* @param {Object} param 检索配置
* 参数对象结构可以参考
* https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
*
*/
regeocoding (param) {
var that = this;
param = param || {};
let regeocodingparam = {
coordtype: param["coordtype"] || 'gcj02ll',
ret_coordtype: 'gcj02ll',
radius: param["radius"] || 1000,
ak: that.ak,
sn: param["sn"] || '',
output: param["output"] || 'json',
callback: param["callback"] || function () { },
extensions_poi: param["extensions_poi"] || 1,
extensions_road: param["extensions_road"] || false,
extensions_town: param["extensions_town"] || false,
language: param["language"] || 'zh-CN',
language_auto: param["language_auto"] || 0
};
let otherparam = {
iconPath: param["iconPath"],
iconTapPath: param["iconTapPath"],
width: param["width"],
height: param["height"],
alpha: param["alpha"] || 1,
success: param["success"] || function () { },
fail: param["fail"] || function () { }
};
let type = 'gcj02';
let locationsuccess = function (result) {
regeocodingparam["location"] = result["latitude"] + ',' + result["longitude"];
wx.request({
url: 'https://api.map.baidu.com/reverse_geocoding/v3',
data: regeocodingparam,
header: {
"content-type": "application/json"
},
method: 'GET',
success(data) {
let res = data["data"];
if (res["status"] === 0) {
let poiObj = res["result"];
// outputRes 包含两个对象:
// originalData为百度接口返回的原始数据
// wxMarkerData为小程序规范的marker格式
let outputRes = {};
outputRes["originalData"] = res;
outputRes["wxMarkerData"] = [];
outputRes["wxMarkerData"][0] = {
id: 0,
latitude: result["latitude"],
longitude: result["longitude"],
address: poiObj["formatted_address"],
iconPath: otherparam["iconPath"],
iconTapPath: otherparam["iconTapPath"],
desc: poiObj["sematic_description"],
business: poiObj["business"],
alpha: otherparam["alpha"],
width: otherparam["width"],
height: otherparam["height"]
}
otherparam.success(outputRes);
} else {
otherparam.fail({
errMsg: res["message"],
statusCode: res["status"]
});
}
},
fail(data) {
otherparam.fail(data);
}
});
};
let locationfail = function (result) {
otherparam.fail(result);
}
let locationcomplete = function (result) {
};
if (!param["location"]) {
that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
} else {
let longitude = param.location.split(',')[1];
let latitude = param.location.split(',')[0];
let errMsg = 'input location';
let res = {
errMsg: errMsg,
latitude: latitude,
longitude: longitude
};
locationsuccess(res);
}
}
/**
* gc检索地理编码地点->经纬度
*
* @param {Object} param 检索配置
* 参数对象结构可以参考
* https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding
*
*/
geocoding(param) {
var that = this;
param = param || {};
let geocodingparam = {
address: param["address"] || '',
city: param["city"] || '',
ret_coordtype: param["coordtype"] || 'gcj02ll',
ak: that.ak,
sn: param["sn"] || '',
output: param["output"] || 'json',
callback: param["callback"] || function () { }
};
let otherparam = {
iconPath: param["iconPath"],
iconTapPath: param["iconTapPath"],
width: param["width"],
height: param["height"],
alpha: param["alpha"] || 1,
success: param["success"] || function () { },
fail: param["fail"] || function () { }
};
if (param["address"]) {
wx.request({
url: 'https://api.map.baidu.com/geocoding/v3',
data: geocodingparam,
header: {
"content-type": "application/json"
},
method: 'GET',
success(data) {
let res = data["data"];
if (res["status"] === 0){
let poiObj = res["result"];
// outputRes 包含两个对象:
// originalData为百度接口返回的原始数据
// wxMarkerData为小程序规范的marker格式
let outputRes = res;
outputRes["originalData"] = res;
outputRes["wxMarkerData"] = [];
outputRes["wxMarkerData"][0] = {
id: 0,
latitude: poiObj["location"]["lat"],
longitude: poiObj["location"]["lng"],
iconPath: otherparam["iconPath"],
iconTapPath: otherparam["iconTapPath"],
alpha: otherparam["alpha"],
width: otherparam["width"],
height: otherparam["height"]
}
otherparam.success(outputRes);
} else {
otherparam.fail({
errMsg: res["message"],
statusCode: res["status"]
});
}
},
fail(data) {
otherparam.fail(data);
}
});
} else {
let errMsg = 'input address!';
let res = {
errMsg: errMsg
};
otherparam.fail(res);
}
}
/**
* 天气检索
*
* @param {Object} param 检索配置
*/
weather(param) {
var that = this;
param = param || {};
let weatherparam = {
coord_type: param["coord_type"] || 'gcj02',
output: param["output"] || 'json',
ak: that.ak,
sn: param["sn"] || '',
timestamp: param["timestamp"] || ''
};
let otherparam = {
success: param["success"] || function () { },
fail: param["fail"] || function () { }
};
let type = 'gcj02';
let locationsuccess = function (result) {
weatherparam["location"] = result["longitude"] + ',' + result["latitude"];
wx.request({
url: 'https://api.map.baidu.com/telematics/v3/weather',
data: weatherparam,
header: {
"content-type": "application/json"
},
method: 'GET',
success(data) {
let res = data["data"];
if (res["error"] === 0 && res["status"] === 'success') {
let weatherArr = res["results"];
// outputRes 包含两个对象,
// originalData为百度接口返回的原始数据
// wxMarkerData为小程序规范的marker格式
let outputRes = {};
outputRes["originalData"] = res;
outputRes["currentWeather"] = [];
outputRes["currentWeather"][0] = {
currentCity: weatherArr[0]["currentCity"],
pm25: weatherArr[0]["pm25"],
date: weatherArr[0]["weather_data"][0]["date"],
temperature: weatherArr[0]["weather_data"][0]["temperature"],
weatherDesc: weatherArr[0]["weather_data"][0]["weather"],
wind: weatherArr[0]["weather_data"][0]["wind"]
};
otherparam.success(outputRes);
} else {
otherparam.fail({
errMsg: res["message"],
statusCode: res["status"]
});
}
},
fail(data) {
otherparam.fail(data);
}
});
}
let locationfail = function (result) {
otherparam.fail(result);
}
let locationcomplete = function (result) {
}
if (!param["location"]) {
that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
} else {
let longitude = param.location.split(',')[0];
let latitude = param.location.split(',')[1];
let errMsg = 'input location';
let res = {
errMsg: errMsg,
latitude: latitude,
longitude: longitude
};
locationsuccess(res);
}
}
}
module.exports.BMapWX = BMapWX;

1122
lib/qqmap-wx-jssdk.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,228 @@
// pages/caseCheck/caseCheck.js
var bmap = require('../../lib/bmap-wx.js');
var app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
caseId: '',
longitude: '111.759608',
latitude: '40.860318',
markers: [],
caseDetail: {},
token: wx.getStorageSync('token'),
requestUrl: app.requestUrl,
evaluateContent: '',
isPass: 1,
grade: '',
photoList: []
},
getDetail: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/getreportcase/' + self.data.caseId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
console.log(data)
var imgArr, handleArr
imgArr = data.casePhotos.split(',')
handleArr = data.handlePhotos.split(',')
var arr = [{longitude: data.caseLongitude,latitude: data.caseLatitude,iconPath:'../../images/marker_red.png',width:'25px',height: '30px'}]
self.setData({
markers: arr
});
self.setData({
caseDetail: data,
longitude: data.caseLongitude,
latitude: data.caseLatitude,
imageList: imgArr,
handleList: handleArr
})
});
},
isQualified: function (e) {
this.setData({
isPass: e.detail.value
})
},
isSatisfied: function (e) {
this.setData({
grade: e.detail.value
})
},
// 选择图片
chooseImage: function () {
var self = this
wx.chooseImage({
count: 9 - self.data.photoList.length,
sourceType: ['album', 'camera'],
success: function (res) {
console.log(res)
self.setData({
showPhotoList: self.data.photoList.concat(res.tempFiles)
})
wx.showToast({
title: '上传中',
icon: 'loading'
})
var arr = []
for (let i = 0; i < res.tempFiles.length; i++) {
var path = res.tempFiles[i].path;
app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadimage', [app.requestUrl]), path, 'image', {
headers: {
token: self.data.token
}
}, function (code, data) {
var id = JSON.parse(data).data
arr.push(id)
if (arr.length == res.tempFiles.length) {
self.setData({
photoList: arr
})
wx.hideToast()
}
}, function (code, data) {
console.log(data)
})
}
}
})
},
// 删除图片
deleteImg: function (e) {
var idx = e.currentTarget.dataset.num
var self = this
self.data.photoList.splice(idx, 1)
self.data.showPhotoList.splice(idx, 1)
self.setData({
showPhotoList: self.data.showPhotoList,
photoList: self.data.photoList
})
},
// 确认处理
submitHandle: function () {
var photo = '', self = this
if (!self.data.evaluateContent) {
wx.showToast({
title: '请输入评价内容',
duration: 2000,
icon: 'none'
})
return
}
if (!self.data.grade) {
wx.showToast({
title: '请选择满意度',
duration: 2000,
icon: 'none'
})
return
}
if (this.data.photoList.length == 0) {
wx.showToast({
title: '请至少上传一张照片',
duration: 2000,
icon: 'none'
})
return
}
for (let i = 0; i < this.data.photoList.length; i++) {
if (i == this.data.photoList.length - 1) {
photo += this.data.photoList[i]
} else {
photo += this.data.photoList[i] + ','
}
console.log(i, photo)
}
var info = {
inspectPhotos: photo,
inspectOpinion: self.data.evaluateContent,
isPass: self.data.isPass,
grade: self.data.grade
}
app.restAjax.post(app.restAjax.path('{reqesutUrl}app/reportcase/savereportcaseinspect/' + self.data.caseId, [app.requestUrl]), info, {
headers: {
token: self.data.token
}
}, function (code, data) {
if (code == '200') {
wx.showToast({
title: '处理成功',
duration: 2000,
success: function () {
setTimeout(function () {
wx.navigateTo({
url: '../index/index',
})
}, 2000)
}
})
}
});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
caseId: options.id
})
this.getDetail()
var BMap = new bmap.BMapWX({
ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK'
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,89 @@
<view class="check">
<view class="case-info">
<view class="title-status">
<view class="title">{{caseDetail.communityName}}</view>
<view class="status">待处理</view>
</view>
<view class="info">
<view class="row">{{caseDetail.caseContent}}</view>
<view class="row">上报时间:{{caseDetail.reportDate}}</view>
<view class="row">上报类型:{{caseDetail.caseTypeName}}</view>
<view class="row">上报人员:{{caseDetail.caseReporter}}</view>
</view>
<view class="photo">
<image src="{{requestUrl}}route/file/downloadfile/true/{{item}}" wx:for="{{imageList}}" wx:key="index" wx:if="{{item}}"></image>
</view>
<view class="map">
<view class="position">{{caseDetail.casePosition}}</view>
<view class="map-box">
<map name="map" show-location longitude='{{longitude}}' latitude='{{latitude}}' scale='14' markers='{{markers}}'></map>
</view>
</view>
</view>
<view class="handle">
<view class="handle-title">案件处理详情</view>
<view class="info handle-info">
<view class="row">处理人员:{{caseDetail.handleUserName}}</view>
<view class="row">处理时间:{{caseDetail.handleCreateTime}}</view>
<view class="row">{{caseDetail.handleOpinion}}</view>
<view class="photo handle-photo">
<image src="{{requestUrl}}route/file/downloadfile/true/{{item}}" wx:for="{{handleList}}" wx:key="index" wx:if="{{item}}"></image>
</view>
</view>
</view>
<view class="check-container">
<view class="handle-title"><text>*</text>案件处理详情</view>
<view class="check-box">
<view class="check-content">
<textarea placeholder="请输入评价内容" model:value="{{evaluateContent}}"></textarea>
</view>
<view class="qualified">
<view class="text">是否合格</view>
<view class="input-box">
<radio-group bindchange="isQualified">
<label>
<radio value="1" color="#008cff" checked="checked">是</radio>
</label>
<label>
<radio value="0" color="#008cff">否</radio>
</label>
</radio-group>
</view>
</view>
<view class="satisfied">
<view class="satisfied-title">处理满意度</view>
<view class="satisfied-box">
<radio-group bindchange="isSatisfied">
<label>
<radio value="1" color="#008cff">非常不满意</radio>
</label>
<label>
<radio value="2" color="#008cff">不满意</radio>
</label>
<label>
<radio value="3" color="#008cff">一般</radio>
</label>
<label>
<radio value="4" color="#008cff">满意</radio>
</label>
<label>
<radio value="5" color="#008cff">非常满意</radio>
</label>
</radio-group>
</view>
</view>
<view class="choose-photo">
<view class="img-box" wx:for="{{showPhotoList}}" wx:key="index">
<image src="{{item.path}}"></image>
<image src="../../images/delete.png" class="delete-btn" data-num="{{index}}" bindtap="deleteImg"></image>
</view>
<view class="add" bindtap="chooseImage">
<image src="../../images/camera.png"></image>
</view>
</view>
</view>
</view>
<view class="submit" bindtap="submitHandle">
确认处理
</view>
</view>

View File

@ -0,0 +1,180 @@
page{
background: #f2f1f6;
}
.check{
padding: 20rpx;
}
.case-info{
background: #fff;
border-radius: 10rpx;
padding: 20rpx;
margin-bottom: 15rpx;
}
.title-status{
display: flex;
justify-content: space-between;
margin-bottom: 10rpx;
}
.title{
font-size: 36rpx;
line-height: 60rpx;
display: inline-block;
max-width: 65%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #06a3f6;
}
.status{
line-height: 60rpx;
display: inline-block;
padding: 0 30rpx;
background: #fff7ec;
color: #fdc36e;
border-radius: 30rpx;
}
.status.green{
color: #2dfe2e;
background: rgba(45,254,46,0.1)
}
.status.red{
color: red;
background: rgba(255,0,0,0.1)
}
.row{
border-bottom: 1px dashed #EEE;
font-size: 32rpx;
color: #888;
line-height: 60rpx;
}
.photo{
margin: 50rpx 0;
}
.photo image{
width: 140rpx;
height: 140rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.position{
font-size: 36rpx;
color: #06a3f6;
margin-bottom: 10rpx;
}
.map-box map{
width: 100%;
height: 400rpx;
}
.handle-info{
border-radius: 10rpx;
background: #fff;
margin-top: 15rpx;
padding: 20rpx 20rpx 10rpx;
}
.handle-photo{
margin: 20rpx 0 0;
}
.handle-title{
font-size: 36rpx;
color: #888;
}
.handle-title text{
color: red;
}
.check-box{
padding: 20rpx;
background: #fff;
border-radius: 10rpx;
margin-top: 15rpx;
}
.check-content{
background: #f2f1f6;
margin-bottom: 20rpx;
}
.check-content textarea{
width: 100%;
height: 300rpx;
padding: 15rpx;
box-sizing: border-box;
}
.qualified{
display: flex;
justify-content: space-between;
background: #f2f1f6;
padding: 15rpx;
}
.qualified label{
margin-right: 20rpx;
}
.qualified label:last-child{
margin-right: 0;
}
.satisfied{
margin-top: 15rpx;
background: #f2f1f6;
padding: 15rpx;
}
.satisfied-title{
font-size: 36rpx;
}
.satisfied-box label{
display: block;
margin-top: 15rpx;
}
.choose-photo{
margin-top: 15rpx;
}
.choose-photo .img-box{
width: 32%;
height: 140rpx;
margin-right: 2%;
margin-bottom: 10rpx;
position: relative;
display: inline-block;
}
.img-box image{
width: 100%;
height: 100%;
}
.img-box .delete-btn{
position: absolute;
top: -10rpx;
right: -10rpx;
width: 40rpx;
height: 40rpx;
}
.choose-photo .img-box:nth-child(3n){
margin-right: 0;
}
.photo-main{
background: none;
padding: 0;
}
.add{
display: inline-block;
width: 32%;
height: 140rpx;
background: #f1f1f6;
position: relative;
}
.add image{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 60rpx;
height: 60rpx;
}
.submit{
width: 710rpx;
height: 100rpx;
background: #008cff;
line-height: 100rpx;
text-align: center;
color: #fff;
border-radius: 10rpx;
margin: 15rpx auto;
}
.check-container{
margin-top: 15rpx;
}

View File

@ -0,0 +1,122 @@
const app = getApp()
// var QQMapWX = require('../../lib/qqmap-wx-jssdk.js');
var bmap = require('../../lib/bmap-wx.js');
// pages/caseDetail/caseDetail.js
Page({
/**
* 页面的初始数据
*/
data: {
requestUrl: app.requestUrl,
token: '',
caseId: '',
caseDetail: {},
longitude: '',
latitude: '',
markers: [],
imageList: []
},
// 获取详情
getDetail: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/getreportcase/' + self.data.caseId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var imgArr
imgArr = data.casePhotos.split(',')
var arr = [{longitude: data.caseLongitude,latitude: data.caseLatitude,iconPath:'../../images/marker_red.png',width:'25px',height: '30px'}]
// varwxMarkerData = arr;
self.setData({
markers: arr
});
self.setData({
caseDetail: data,
longitude: data.caseLongitude,
latitude: data.caseLatitude,
imageList: imgArr
})
});
},
// 查看流程
goProcess: function () {
var self = this
wx.navigateTo({
url: '../process/process?id=' + self.data.caseId,
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
caseId: options.id
})
wx.getStorage({
key: 'token',
success: function (res) {
self.setData({
token: res.data
})
self.getDetail()
}
})
var BMap = new bmap.BMapWX({
ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK'
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,31 @@
<view class="case">
<view class="case-info">
<view class="title-status">
<view class="title">{{caseDetail.communityName}}</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 0}}">待处理</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 1}}">待立案</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 2}}">待下派</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 3}}">待处理</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 4}}">待检查</view>
<view class="status" wx:if="{{caseDetail.caseStatus == 5}}">待结案</view>
<view class="status green" wx:if="{{caseDetail.caseStatus == 6}}">已归档</view>
<view class="status red" wx:if="{{caseDetail.caseStatus == -1}}">案件异常</view>
</view>
<view class="info">
<view class="row">{{caseDetail.caseContent}}</view>
<view class="row">上报时间:{{caseDetail.reportDate}}</view>
<view class="row">上报类型:{{caseDetail.caseTypeName}}</view>
<view class="row">上报人员:{{caseDetail.caseReporter}}</view>
</view>
<view class="photo">
<image src="{{requestUrl}}route/file/downloadfile/true/{{item}}" wx:for="{{imageList}}" wx:key="index" wx:if="{{item}}"></image>
</view>
<view class="map">
<view class="position">{{caseDetail.casePosition}}</view>
<view class="map-box">
<map name="map" show-location longitude='{{longitude}}' latitude='{{latitude}}' scale='14' markers='{{markers}}'></map>
</view>
</view>
<view class="process" bindtap="goProcess">查看流程</view>
</view>
</view>

View File

@ -0,0 +1,81 @@
page{
background: #f2f1f6;
}
.case{
width: 710rpx;
margin: 20rpx auto;
padding: 20rpx;
box-sizing: border-box;
background: #fff;
border-radius: 10rpx;
}
.case-info{
margin-bottom: 15rpx;
}
.title-status{
display: flex;
justify-content: space-between;
margin-bottom: 10rpx;
}
.title{
font-size: 36rpx;
line-height: 60rpx;
display: inline-block;
max-width: 65%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #06a3f6;
}
.status{
line-height: 60rpx;
display: inline-block;
padding: 0 30rpx;
background: #fff7ec;
color: #fdc36e;
border-radius: 30rpx;
}
.status.green{
color: #2dfe2e;
background: rgba(45,254,46,0.1)
}
.status.red{
color: red;
background: rgba(255,0,0,0.1)
}
.row{
border-bottom: 1px dashed #EEE;
font-size: 32rpx;
color: #888;
line-height: 60rpx;
}
.photo{
margin: 50rpx 0;
}
.photo image{
width: 140rpx;
height: 140rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.position{
font-size: 36rpx;
color: #06a3f6;
margin-bottom: 10rpx;
}
.map-box map{
width: 100%;
height: 400rpx;
}
.process{
width: 100%;
height: 80rpx;
display: flex;
justify-content: center;
align-items: center;
border-radius: 10rpx;
background: #06a3f6;
color: #fff;
font-size: 30rpx;
margin-top: 15rpx;
}

View File

@ -0,0 +1,472 @@
const app = getApp()
var bmap = require('../../lib/bmap-wx.js');
let wxMarkerData = [];
// pages/caseReport/caseReport.js
Page({
/**
* 页面的初始数据
*/
data: {
address: '获取案件地址中...',
recodePath: '',
recorderManager: wx.getRecorderManager(),
innerAudioContext: wx.createInnerAudioContext(),
// 办事处
officeIndex: 0,
officeArray: [],
officeList: [],
officeSelectedId: '',
// 社区
communityIndex: 0,
communityArray: [],
communityList: [],
communitySelectedId: '',
// 类型
typeIndex: 0,
typeArray: [],
typeList: [],
typeSelectedId: '',
// 类型二级
typeLvIndex: 0,
typeLvArray: [],
typeLvList: [],
typeLvSelectedId: '',
// 案件类型
caseIndex: 0,
caseArray: [],
caseList: [],
caseSelectedId: '',
photoList: [],
startTouch: {},
selfHandle: 0,
caseDesc: '',
imageList: [],
token: ''
},
// 办事处列表
getOfficeList: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/9d179f05-3ea0-48f7-853c-d3b7124b791c', [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var arr = []
for (let i = 0 ; i < data.length; i++) {
arr.push(data[i].dictName)
}
self.setData({
officeArray: arr,
officeList: data,
officeSelectedId: data[0].dictId
})
self.getCommunityList()
});
},
// 办事处选中
bindPickerChange: function (e) {
var self = this
this.setData({
officeIndex: e.detail.value,
officeSelectedId: self.data.officeList[e.detail.value].dictId
})
wx.showToast({
title: '加载中',
icon: 'loading'
})
this.getCommunityList()
},
// 社区列表
getCommunityList: function () {
var self = this
self.setData({
communityIndex: 0
})
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/community/listareacommunity/' + self.data.officeSelectedId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var arr = []
for (let i = 0 ; i < data.length; i++) {
arr.push(data[i].communityName)
}
self.setData({
communityArray: arr,
communityList: data,
communitySelectedId: data[0].communityId
})
wx.hideToast()
});
},
// 选中社区
bindCommunityChange: function (e) {
var self = this
this.setData({
communityIndex: e.detail.value,
communitySelectedId: self.data.communityList[e.detail.value].communityId
})
},
// 类型列表
getTypeList: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/46d108b2-4ef9-4f6f-b30c-0c700e3ee852' + self.data.officeSelectedId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var arr = []
for (let i = 0 ; i < data.length; i++) {
arr.push(data[i].dictName)
}
self.setData({
typeArray: arr,
typeList: data,
typeSelectedId: data[0].dictId
})
self.getTypeLv()
});
},
// 类型选中
bindTypeChange: function (e) {
var self = this
this.setData({
typeIndex: e.detail.value,
typeSelectedId: self.data.typeList[e.detail.value].dictId
})
self.getTypeLv()
},
// 类型二级
getTypeLv: function () {
var self = this
self.setData({
typeLvIndex: 0
})
wx.showToast({
title: '加载中',
icon: 'loading'
})
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/' + self.data.typeSelectedId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var arr = []
for (let i = 0 ; i < data.length; i++) {
arr.push(data[i].dictName)
}
self.setData({
typeLvArray: arr,
typeLvList: data,
typeLvSelectedId: data[0].dictId
})
wx.hideToast()
});
},
// 类型二级选中
bindTypeLvChange: function (e) {
var self = this
this.setData({
typeLvIndex: e.detail.value,
typeLvSelectedId: self.data.typeLvList[e.detail.value].dictId
})
self.getTypeLv()
},
// 案件类型列表
getCaseList: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/46d108b2-4ef9-4f6f-b30c-0c700e3ee852' + self.data.officeSelectedId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
var arr = []
for (let i = 0 ; i < data.length; i++) {
arr.push(data[i].dictName)
}
self.setData({
typeArray: arr,
typeList: data,
typeSelectedId: data[0].dictId
})
self.getTypeLv()
});
},
// 录音
recordVoice: function (e) {
this.setData({
startTouch: e.touches[0]
})
var options = {
format: 'mp3'
}
this.data.recorderManager.start(options)
wx.showToast({
title: "正在录音",
icon: "none",
duration: 60000//先定义个60秒后面可以手动调用wx.hideToast()隐藏
});
},
// 录音结束
recordEnd: function () {
var self = this
this.data.recorderManager.stop()
this.data.recorderManager.onStop(function (res) {
var path = res.tempFilePath
self.setData({
recodePath: path
})
wx.showToast({
title: '上传中',
icon: 'loading'
})
app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadaudio', [app.requestUrl]), path, 'audio', {
headers: {
token: self.data.token
}
}, function (code, data) {
var id = JSON.parse(data).data
self.setData({
audioId: id
})
wx.hideToast()
}, function (code, data) {
console.log(data)
})
})
var self = this
wx.hideToast()
},
// 播放录音
playRecord: function () {
var innerAudioContext = wx.createInnerAudioContext()
innerAudioContext.src = this.data.recodePath
innerAudioContext.play()
},
// 选择图片
chooseImage: function () {
var self = this
wx.chooseImage({
count: 9 - self.data.photoList.length,
sourceType: ['album', 'camera'],
success: function (res) {
self.setData({
photoList: self.data.photoList.concat(res.tempFiles)
})
wx.showToast({
title: '上传中',
icon: 'loading'
})
var arr = []
for (let i = 0; i < res.tempFiles.length; i++) {
var path = res.tempFiles[i].path;
app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadimage', [app.requestUrl]), path, 'image', {
headers: {
token: self.data.token
}
}, function (code, data) {
var id = JSON.parse(data).data
arr.push(id)
if (arr.length == res.tempFiles.length) {
self.setData({
imageList: arr
})
wx.hideToast()
}
}, function (code, data) {
console.log(data)
})
}
}
})
},
// 删除图片
deleteImg: function (e) {
var idx = e.currentTarget.dataset.num
var self = this
self.data.photoList.splice(idx, 1)
self.data.imageList.splice(idx, 1)
self.setData({
photoList: self.data.photoList,
imageList: self.data.imageList
})
},
// touchMove: function (e) {
// var moveLenght = e.touches[e.touches.length - 1].clientY - this.data.startTouch.clientY;
// if (Math.abs(moveLenght) > 50) {
// wx.showToast({
// title: "松开手指,取消发送",
// icon: "none",
// duration: 60000
// });
// } else {
// wx.showToast({
// title: "正在录音,上划取消发送",
// icon: "none",
// duration: 60000
// });
// }
// },
/**
* 生命周期函数--监听页面加载
*/
// 是否自行处理
isSelfHandle: function (e) {
this.setData({
selfHandle: e.detail.value
})
},
// 提交上报
submitReport: function () {
var self = this
var photos = ''
if (!self.data.caseDesc) {
wx.showToast({
title: '案件内容不能为空',
icon: 'none',
duration: 2000
})
return
}
if (self.data.imageList.length != 'undefined' && self.data.imageList.length != 0) {
for (let i = 0; i < self.data.imageList.length; i++) {
if (i == self.data.imageList.length - 1) {
photos += self.data.imageList[i]
} else {
photos += self.data.imageList[i] + ','
}
}
} else {
wx.showToast({
title: '请至少上传一张照片',
icon: 'none',
duration: 2000
})
return
}
var info = {
areaId: self.data.officeSelectedId,
areaName: self.data.officeArray[self.data.officeIndex],
casePhotos: photos,
caseAudio: self.data.audioId,
communityId: self.data.communitySelectedId,
communityName: self.data.communityArray[self.data.communityIndex],
caseSource: 1,
isSelf: self.data.selfHandle,
caseTypeId: self.data.typeLvSelectedId,
caseTypeName: self.data.typeLvArray[self.data.typeLvIndex],
caseContent: self.data.caseDesc,
caseLatitude: self.data.latitude,
caseLongitude: self.data.longitude,
casePosition: self.data.address
}
wx.showToast({
title: '上传中',
icon: 'loading'
})
app.restAjax.post(app.restAjax.path('{reqesutUrl}app/reportcase/saveappautoreportcase', [app.requestUrl]), info, {
headers: {
token: self.data.token
}
}, function (code, data) {
if (code == '200') {
wx.hideToast()
wx.showToast({
title: '上报成功',
duration: 1500
})
setTimeout(function () {
wx.navigateTo({
url: '../index/index',
})
}, 1500)
}
}, function (code, data) {
wx.showToast({
title: data.msg,
duration: 2000
})
});
},
onLoad: function (options) {
var self = this
wx.getStorage({
key: 'token',
success: function (res) {
self.setData({
token: res.data
})
self.getOfficeList()
self.getTypeList()
}
})
var BMap = new bmap.BMapWX({
ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK'
});
var success = function (data) {
self.setData({
address: data.wxMarkerData[0].address,
latitude: data.wxMarkerData[0].latitude,
longitude: data.wxMarkerData[0].longitude
})
}
var fail = function (data) {
console.log(data);
}
BMap.regeocoding({
fail:fail,
success:success
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,132 @@
<view class="report">
<view class="title">基本信息</view>
<view class="info">
<view class="row">
<view class="required">*</view>
<view class="main">
<view class="selected">
<picker bindchange="bindPickerChange" value="{{officeIndex}}" range="{{officeArray}}">
<view class="picker">
{{officeArray[officeIndex]}}
</view>
</picker>
</view>
<view class="select-icon">
<image src="../../images/select.png"></image>
</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main">
<view class="selected">
<picker bindchange="bindCommunityChange" value="{{communityIndex}}" range="{{communityArray}}">
<view class="picker">
{{communityArray[communityIndex]}}
</view>
</picker>
</view>
<view class="select-icon">
<image src="../../images/select.png"></image>
</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main">
<view class="selected">
<picker bindchange="bindTypeChange" value="{{typeIndex}}" range="{{typeArray}}">
<view class="picker">
{{typeArray[typeIndex]}}
</view>
</picker>
</view>
<view class="select-icon">
<image src="../../images/select.png"></image>
</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main">
<view class="selected">
<picker bindchange="bindTypeLvChange" value="{{typeLvIndex}}" range="{{typeLvArray}}">
<view class="picker">
{{typeLvArray[typeLvIndex]}}
</view>
</picker>
</view>
<view class="select-icon">
<image src="../../images/select.png"></image>
</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main">
<view class="selected">巡检采集</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main self-box">
<view class="self">自行处理</view>
<view class="self-check">
<radio-group bindchange="isSelfHandle">
<label>
<radio value="0" color="#008cff" checked="checked">否</radio>
</label>
</radio-group>
</view>
</view>
</view>
<view class="row">
<view class="required">*</view>
<view class="main address-main">
<view class="address">{{address}}</view>
</view>
</view>
</view>
</view>
<view class="report">
<view class="title">详细信息</view>
<view class="info">
<view class="row detail-row">
<view class="detail-required">*</view>
<view class="main detail-main">
<textarea placeholder="请输入案件描述内容" model:value="{{caseDesc}}"></textarea>
</view>
</view>
<view class="row detail-row">
<view class="voice">
<view class="voice-info" wx:if="{{!recodePath}}">
<image src="../../images/vioce.png"></image>
录音
</view>
<view class="voice-info" bindtap="playRecord" wx:else>
<image src="../../images/vioce.png"></image>
播放录音
</view>
<view class="voice-btn" bindlongpress="recordVoice" bindtouchend="recordEnd">长按录音</view>
<!-- <view class="voice-btn" bindlongpress="recordVoice" bindtouchend="recordEnd" bindtouchmove="touchMove">长按录音</view> -->
</view>
</view>
<view class="row detail-row">
<view class="detail-required">*</view>
<view class="main detail-main photo-main">
<view class="choose-photo">
<view class="img-box" wx:for="{{photoList}}" wx:key="index">
<image src="{{item.path}}"></image>
<image src="../../images/delete.png" class="delete-btn" data-num="{{index}}" bindtap="deleteImg"></image>
</view>
<view class="add" bindtap="chooseImage" wx:if="{{photoList.length < 9}}">
<image src="../../images/camera.png"></image>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="submit" bindtap="submitReport">
上报
</view>

View File

@ -0,0 +1,191 @@
page{
background: #f2f1f6;
}
.report, .detail{
padding: 0 20rpx;
}
.report{
margin-bottom: 15rpx;
}
.title, .detail-title{
font-size: 36rpx;
margin-bottom: 15rpx;
}
.info{
padding: 20rpx 20rpx 0;
overflow: hidden;
background: #fff;
border-radius: 10rpx;
box-shadow: 0 0 10rpx #EEE;
}
.row{
margin-bottom: 20rpx;
position: relative;
padding-left: 20rpx;
}
.required{
position: absolute;
top: 0;
left: 0;
color: red;
}
.main{
background: #f1f1f6;
width: 100%;
height: 75rpx;
border-radius: 10rpx;
padding: 0 15rpx;
box-sizing: border-box;
position: relative;
}
.main input{
width: 100%;
height: 100%;
}
.selected{
display: block;
line-height: 75rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 75rpx;
}
.select-icon{
position: absolute;
top: 0;
right: 0;
width: 75rpx;
height: 75rpx;
}
.select-icon image{
width: 30rpx;
height: 22rpx;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
.detail-required{
color: red;
}
.detail-row{
margin-bottom: 20rpx;
padding-left: 0;
}
.detail-row textarea{
width: 100%;
height: 200rpx;
padding: 10rpx;
box-sizing: border-box;
background: #f1f1f6;
}
.detail .info{
padding: 20rpx;
}
.voice{
display: flex;
justify-content: space-between;
padding: 20rpx;
background: #f1f1f6;
border-radius: 10rpx;
}
.detail-info{
background: #FFF;
border-radius: 10rpx;
padding: 20rpx 20rpx 0;
overflow: hidden;
}
.detail-main{
height: auto;
}
.voice-btn{
height: 70rpx;
padding: 0 20rpx;
background: #008cff;
color: #fff;
border-radius: 10rpx;
line-height: 70rpx;
}
.voice-info{
line-height: 70rpx;
padding-left: 50rpx;
position: relative;
}
.voice-info image{
position: absolute;
top: 50%;
left: 0;
width: 45rpx;
height: 45rpx;
transform: translate(0,-50%);
}
.choose-photo .img-box{
width: 32%;
height: 140rpx;
margin-right: 2%;
margin-bottom: 10rpx;
position: relative;
display: inline-block;
}
.img-box image{
width: 100%;
height: 100%;
}
.img-box .delete-btn{
position: absolute;
top: -10rpx;
right: -10rpx;
width: 40rpx;
height: 40rpx;
}
.choose-photo .img-box:nth-child(3n){
margin-right: 0;
}
.photo-main{
background: none;
padding: 0;
}
.submit{
width: 710rpx;
height: 100rpx;
background: #008cff;
line-height: 100rpx;
text-align: center;
color: #fff;
border-radius: 10rpx;
margin: 15rpx auto;
}
.add{
display: inline-block;
width: 32%;
height: 140rpx;
background: #f1f1f6;
position: relative;
}
.add image{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 60rpx;
height: 60rpx;
}
.address{
line-height: 75rpx;
}
.self-box{
display: flex;
justify-content: space-between;
}
.self, .self-check label{
line-height: 75rpx;
}
.self-check label{
margin-right: 15rpx;
}
.self-check label:last-child{
margin-right: 0;
}
.address-main{
height: auto;
}

195
pages/index/index.js Normal file
View File

@ -0,0 +1,195 @@
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
token: '',
areaList: [],
requestUrl: app.requestUrl,
page: {
page: 1,
rows: 20,
totalPage: 1
},
tab: 0
},
// 登录
doLogin: function () {
var self = this
wx.login({
success: function (res) {
app.restAjax.post(app.restAjax.path('{url}wxminiapp/auth/login', [app.loginUrl]), {
jsCode: res.code
}, null, function (code, data) {
var tokenArray = data.data.split('_');
var token = tokenArray[0];
self.setData({
token: token
})
wx.setStorageSync('token', token);
self.getList()
}, function (code, data) {
app.dialog.msg(data.msg);
});
}
})
},
// 获取列表
getList: function () {
var self = this
wx.showToast({
title: '加载中',
icon: 'loading'
})
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listpagereportcase', [app.requestUrl]), self.data.page, {
headers: {
token: self.data.token
}
}, function (code, data) {
if(data.rows.length == 0) {
self.setData({
[`page.page`] : self.data.page.page - 1
})
app.dialog.msg('暂无更多')
return false;
}
data.rows.forEach(function (i) {
i.casePhotos = i.casePhotos.split(',')[0]
})
if (self.data.page.page == 1) {
self.setData({
areaList: data.rows
})
} else {
self.setData({
areaList: self.data.areaList.concat(data.rows)
})
}
wx.hideToast()
});
},
// 查看详情
goDetail: function (e) {
if (e.currentTarget.dataset.status == '4') {
wx.navigateTo({
url: '../caseCheck/caseCheck?id=' + e.currentTarget.dataset.id,
})
} else {
wx.navigateTo({
url: '../caseDetail/caseDetail?id=' + e.currentTarget.dataset.id,
})
}
},
// 前往上报
goReport: function () {
wx.navigateTo({
url: '../caseReport/caseReport',
})
},
// 切换
changeTab: function (e) {
var cur = e.currentTarget.dataset.tab
if (this.data.tab != cur) {
this.setData({
tab: cur,
[`page.page`]: 1
})
if (cur == '0') {
this.getList()
} else {
this.getCheckList()
}
}
},
// 获取待检查列表
getCheckList: function () {
var self = this
wx.showToast({
title: '加载中',
icon: 'loading'
})
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listpagereportcaseinspectofmine', [app.requestUrl]), self.data.page, {
headers: {
token: self.data.token
}
}, function (code, data) {
if (self.data.page.page) {
self.setData({
areaList: data.rows
})
} else {
self.setData({
areaList: self.data.areaList.concat(data.rows)
})
}
wx.hideToast()
});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.doLogin()
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
var self = this
var pageNum = 'page.page'
self.setData({
[pageNum]: self.data.page.page + 1
})
if (self.data.tab == '0') {
this.getList()
} else {
this.getCheckList()
}
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

3
pages/index/index.json Normal file
View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

34
pages/index/index.wxml Normal file
View File

@ -0,0 +1,34 @@
<view class="tab-box">
<view class="tab {{tab == '0'?'active':''}}" data-tab="0" bindtap="changeTab">上报历史</view>
<view class="tab {{tab == '1'?'active':''}}" data-tab="1" bindtap="changeTab">待检查</view>
</view>
<view class="list">
<view class="list-box" wx:for="{{areaList}}" wx:key="index" data-id="{{item.reportCaseId}}" bindtap="goDetail" data-status="{{item.caseStatus}}">
<view class="avatar">
<image src="{{requestUrl}}route/file/downloadfile/true/{{item.casePhotos}}"></image>
</view>
<view class="case">
<view class="case-info">
<view class="case-title">
<view class="title">{{item.communityName}}</view>
<view class="status" wx:if="{{item.caseStatus == 0}}">待受理</view>
<view class="status" wx:if="{{item.caseStatus == 1}}">待立案</view>
<view class="status" wx:if="{{item.caseStatus == 2}}">待下派</view>
<view class="status" wx:if="{{item.caseStatus == 3}}">待处理</view>
<view class="status" wx:if="{{item.caseStatus == 4}}">待检查</view>
<view class="status" wx:if="{{item.caseStatus == 5}}">待结案</view>
<view class="status green" wx:if="{{item.caseStatus == 6}}">已归档</view>
<view class="status red" wx:if="{{item.caseStatus == -1}}">案件异常</view>
</view>
<view class="case-desc">
{{item.caseContent}}
</view>
</view>
<view class="case-postion">
<image src="../../images/position.png"></image>
{{item.casePosition}}
</view>
</view>
</view>
</view>
<view class="new-case" bindtap="goReport">案件上报</view>

109
pages/index/index.wxss Normal file
View File

@ -0,0 +1,109 @@
page{
background: #f2f1f6;
}
.tab-box{
position: fixed;
top: 0;
left: 0;
right: 0;
height: 100rpx;
display: flex;
background: #fff;
overflow-x: auto;
}
.tab{
display: flex;
flex: 1;
flex-shrink: 0;
justify-content: center;
align-items: center;
font-size: 30rpx;
box-sizing: border-box;
}
.tab.active{
font-size: 36rpx;
color: #226cd9;
border-bottom: 3px solid #226cd9;
}
.list{
margin-top: 100rpx;
padding: 20rpx 20rpx 0;
}
.list-box{
padding: 20rpx;
background: #fff;
border-radius: 10rpx;
margin-bottom: 20rpx;
display: flex;
justify-content: space-between;
}
.avatar, .avatar image{
width: 150rpx;
height: 150rpx;
}
.case{
width: 500rpx;
}
.case-info{
border-bottom: 1px dashed #EEE;
}
.case-title{
display: flex;
justify-content: space-between;
margin-bottom: 10rpx;
}
.title{
font-size: 36rpx;
line-height: 60rpx;
display: inline-block;
max-width: 65%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.status{
line-height: 60rpx;
display: inline-block;
padding: 0 30rpx;
background: #fff7ec;
color: #fdc36e;
border-radius: 30rpx;
}
.status.green{
color: #2dfe2e;
background: rgba(45,254,46,0.1)
}
.status.red{
color: red;
background: rgba(255,0,0,0.1)
}
.case-desc{
font-size: 28rpx;
color: #888;
margin-bottom: 10rpx;
}
.case-postion{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 28rpx;
color: #108aff;
margin-top: 10rpx;
}
.case-postion image{
width: 30rpx;
height: 28rpx;
}
.new-case{
position: fixed;
bottom: 40rpx;
right: 40rpx;
width: 120rpx;
height: 120rpx;
background: #108aff;
color: #fff;
border-radius: 50%;
padding: 20rpx;
box-sizing: border-box;
text-align: center;
}

98
pages/process/process.js Normal file
View File

@ -0,0 +1,98 @@
const app = getApp()
// pages/process/process.js
Page({
/**
* 页面的初始数据
*/
data: {
requestUrl: app.requestUrl,
token: '',
caseId: '',
processList: []
},
// 获取流程
getProcess: function () {
var self = this
app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listreportcaselog/' + self.data.caseId, [app.requestUrl]), {}, {
headers: {
token: self.data.token
}
}, function (code, data) {
console.log(data)
for (let i = 0; i < data.length; i++) {
data[i].userPhotos = data[i].userPhotos.split(',')
}
self.setData({
processList: data
})
});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
caseId: options.id
})
wx.getStorage({
key: 'token',
success: function (res) {
self.setData({
token: res.data
})
self.getProcess()
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,22 @@
<view class="process">
<view class="process-box" wx:for="{{processList}}" wx:key="index">
<view class="time-status">
<view class="point"></view>
<view class="time">{{item.gmtCreate}}</view>
<view class="status">{{item.optionType}}</view>
</view>
<view class="process-content">
<view class="row">处理人:{{item.userName}}</view>
<view class="row">处理描述:{{item.userOpinion}}</view>
<view class="row" wx:if="{{item.handleUserName}}">受理人:{{item.handleUserName}}</view>
<view class="row" wx:if="{{item.handleTime > 0}}">处理时限:{{item.handleTime}}天</view>
<view class="row">
<text wx:if="{{item.handleStatus == '1'}}" class="green">同意处理</text>
<text class="gray" wx:else>未处理</text>
</view>
<view class="process-img">
<image src="{{requestUrl}}route/file/downloadfile/true/{{inner}}" wx:for="{{item.userPhotos}}" wx:for-item="inner" wx:for-index="idx" wx:key="idx" wx:if="{{inner}}"></image>
</view>
</view>
</view>
</view>

View File

@ -0,0 +1,64 @@
page{
background: #f2f1f6;
}
.process{
padding: 0 10rpx 0 25rpx;
}
.process-box{
border-left: 3px solid #17bef5;
box-sizing: border-box;
padding-left: 25rpx;
padding-bottom: 15rpx;
}
.time-status{
display: flex;
justify-content: space-between;
position: relative;
font-size: 30rpx;
padding: 10rpx 0;
}
.point{
position: absolute;
top: 26rpx;
left: -42rpx;
width: 30rpx;
height: 30rpx;
background: #17bef5;
border-radius: 50%;
}
.time{
line-height: 60rpx;
}
.status{
line-height: 60rpx;
padding: 0 20rpx;
background: #dae5f7;
color: #158afa;
border-radius: 30rpx;
}
.process-content{
padding: 20rpx;
background: #fff;
border-radius: 10rpx;
}
.row{
border-bottom: 1px dashed #EEE;
font-size: 28rpx;
color: #888;
line-height: 50rpx;
}
.row text.green{
color: #2dfe2e;
}
.row text.gray{
color: #888;
}
.process-img{
margin-top: 10rpx;
}
.process-img image{
width: 140rpx;
height: 140rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}

70
project.config.json Normal file
View File

@ -0,0 +1,70 @@
{
"description": "项目配置文件",
"packOptions": {
"ignore": []
},
"setting": {
"urlCheck": false,
"es6": true,
"enhance": false,
"postcss": true,
"preloadBackgroundData": false,
"minified": true,
"newFeature": false,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"bundle": false,
"useIsolateContext": true,
"useCompilerModule": true,
"userConfirmedUseCompilerModuleSwitch": false,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true
},
"compileType": "miniprogram",
"libVersion": "2.15.0",
"appid": "wxc529578602bca580",
"projectname": "report",
"debugOptions": {
"hidedInDevtools": []
},
"scripts": {},
"isGameTourist": false,
"condition": {
"search": {
"list": []
},
"conversation": {
"list": []
},
"game": {
"list": []
},
"plugin": {
"list": []
},
"gamePlugin": {
"list": []
},
"miniprogram": {
"list": []
}
}
}

7
sitemap.json Normal file
View File

@ -0,0 +1,7 @@
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}

15
utils/dialog.js Normal file
View File

@ -0,0 +1,15 @@
function msg(text) {
wx.showToast({
title: text,
icon: 'none',
duration: 1000
})
}
function loading(msg) {
wx.showLoading({
title: msg,
mask: true
})
}
module.exports.msg = msg;
module.exports.loading = loading;

227
utils/restAjax.js Normal file
View File

@ -0,0 +1,227 @@
var methods = {
POST_METHOD: 'POST',
DELETE_METHOD: 'DELETE',
PUT_METHOD: 'PUT',
GET_METHOD: 'GET'
};
/**
* 新增
* @param url
* @param dataObj
* @param args
* @param successCallback
* @param errorCallback
* @param completeCallback
*/
function postJson(url, dataObj, args, successCallback, errorCallback, completeCallback) {
doAjax(url, methods.POST_METHOD, dataObj, args, successCallback, errorCallback, completeCallback);
}
/**
* 删除
* @param url
* @param dataObj
* @param args
* @param successCallback
* @param errorCallback
* @param completeCallback
*/
function deleteForm(url, dataObj, args, successCallback, errorCallback, completeCallback) {
doAjax(url, methods.DELETE_METHOD, dataObj, args, successCallback, errorCallback, completeCallback);
}
/**
* 修改
* @param url
* @param dataObj
* @param args
* @param successCallback
* @param errorCallback
* @param completeCallback
*/
function putJson(url, dataObj, args, successCallback, errorCallback, completeCallback) {
doAjax(url, methods.PUT_METHOD, dataObj, args, successCallback, errorCallback, completeCallback);
}
/**
* 查询
* @param url
* @param dataObj
* @param args
* @param successCallback
* @param errorCallback
* @param completeCallback
*/
function getForm(url, dataObj, args, successCallback, errorCallback, completeCallback) {
doAjax(url, methods.GET_METHOD, dataObj, args, successCallback, errorCallback, completeCallback);
}
/**
* 执行上传
* @param url
* @param method
* @param dataObj
* @param args
* @param successCallback
* @param errorCallback
* @param completeCallback
*/
function doAjax(url, method, dataObj, args, successCallback, errorCallback, completeCallback) {
var headers = {};
if (args != null && typeof (args.headers) != 'undefined' && args.headers != null) {
headers = args.headers;
}
wx.request({
url: url,
method: method,
data: dataObj,
header: headers,
dataType: 'json',
success: function (response) {
if (response.statusCode == 200) {
successCallback(response.statusCode, response.data, args);
} else {
if (errorCallback && typeof (errorCallback) == 'function') {
errorCallback(response.statusCode, response.data);
}
}
},
fail: function (response) {
console.log(response);
},
complete: function () {
if (completeCallback && typeof (completeCallback) == 'function') {
completeCallback();
}
}
})
}
/**
* 检测是路径参数有重复值
* @param pathArgArray
* @returns {boolean}
*/
function pathArgsHasSameValue(pathArgArray) {
var tempArgIndex = 0;
var tempArgs = pathArgArray[tempArgIndex];
for (var i = (tempArgIndex + 1), item; item = pathArgArray[i]; i++) {
if (tempArgs == item) {
throw new Error('参数' + item + '有重复值!!!');
}
if (i == pathArgArray.length - 1) {
tempArgs = pathArgArray[++tempArgIndex];
i = tempArgIndex;
continue;
}
}
}
/**
* 获取页面间传递的参数
* @param url
*/
function getParamsArg(url) {
var params = url.split('?')[1];
var paramsObj = {};
if (typeof (params) == 'undefined' || params == null) {
return paramsObj;
}
var paramsKVs = params.split('&');
for (var i = 0, item = null; item = paramsKVs[i++];) {
var kvs = item.split('=');
if (kvs.length == 1) {
paramsObj[kvs[0]] = null;
}
if (kvs.length == 2) {
paramsObj[kvs[0]] = decodeURI(kvs[1]);
}
}
return paramsObj;
}
/**
* 构建路径
* @param basePath 请求路径{参数},
* @param pathArgs 替换的路径参数不能重复
* @returns {*}
*/
function buildPath(basePath, pathArgs) {
var path = basePath;
if (!basePath || !(typeof (basePath) == 'string')) {
throw new Error('basePath必须为字符串!!!');
}
if (!pathArgs || !Array.isArray(pathArgs)) {
throw new Error('pathArgs必须为数组!!!');
}
var pathArgArray = basePath.match(/\{\w+\}/g);
if (!pathArgArray) {
return path;
}
pathArgsHasSameValue(pathArgArray);
for (var i = 0, item; item = pathArgArray[i]; i++) {
path = path.replace(item, pathArgs[i]);
}
return path;
}
/**
* 通过form对象上传文件
* @param url
* @param formData
* @param args
* @param successCallback
* @param errorCallback
* @param beforeCallback
* @param completeCallback
*/
function postFile(url, path, name, args, successCallback, errorCallback, completeCallback) {
var headers = {};
if (args != null && typeof (args.headers) != 'undefined' && args.headers != null) {
headers = args.headers;
}
wx.uploadFile({
filePath: path,
name: name,
url: url,
header: headers,
success: function (response) {
if (response.statusCode == 200) {
successCallback(response.statusCode, response.data, args);
} else {
if (errorCallback && typeof (errorCallback) == 'function') {
errorCallback(response.statusCode, response.data);
}
}
},
fail: function (response) {
console.log(response);
},
complete: function () {
if (completeCallback && typeof (completeCallback) == 'function') {
completeCallback();
}
}
})
};
/**
* xss 转义
* @param html
* @returns {string}
*/
function escape(html) {
return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
.replace(/</g, '&lt;').replace(/>/g, '&gt;')
.replace(/'/g, '&#39;').replace(/"/g, '&quot;');
}
module.exports.post = postJson;
module.exports.delete = deleteForm;
module.exports.put = putJson;
module.exports.get = getForm;
module.exports.params = getParamsArg;
module.exports.path = buildPath;
module.exports.escape = escape;
module.exports.file = postFile;

32
utils/util.js Normal file
View File

@ -0,0 +1,32 @@
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
/**
*
* @param {*} date
*/
const formatDate = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
return [year, month, day].map(formatNumber).join('-')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
module.exports = {
formatTime: formatTime,
formatDate: formatDate
}