Commit f09c2632 authored by liuyuping's avatar liuyuping

initial

parents
Pipeline #216 failed with stages
# Windows
[Dd]esktop.ini
Thumbs.db
$RECYCLE.BIN/
# macOS
.DS_Store
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
# Node.js
node_modules/
// app.js
App({
onLaunch() {
// 展示本地存储能力
const logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
// wx.login({
// success: res => {
// // 发送 res.code 到后台换取 openId, sessionKey, unionId
// }
// })
},
globalData: {
appBaseUrl: 'https://safe.c-icc.cn:8035',
appBaseUrlV2: 'https://safe.c-icc.cn:8036',
appBaseUrlV3: 'https://safe.c-icc.cn:8030',
userInfo: null,
Authorization: '',
curRole: '', // 运营商 企业管理 企业员工 政府 超级管理员
companyId: -1,
companyName: '',
currentEnter: {
},
currentHD: {},
currentLawItem: {},
currentAdviceItem: {},
currentCourse: {},
currentTrainImg: {}
}
})
{
"permission": {
"scope.userLocation": {
"desc": "您的位置将用于匹配企业信息与安全培训定位"
},
"scope.camera": {}
},
"pages": [
"pages/loginv2/loginv2",
"pages/addtrainimg/addtrainimg",
"pages/trainimg/trainimg",
"pages/trainimgitem/trainimgitem",
"pages/certify/certify",
"pages/trainimgenter/trainimgenter",
"pages/certifyenter/certifyenter",
"pages/hwapprovals/hwapprovals",
"pages/certifyitem/certifyitem",
"pages/addapproval/addapproval",
"pages/addcertify/addcertify",
"pages/hwapprovallist/hwapprovallist",
"pages/home/home",
"pages/enterprise/enterprise",
"pages/person/person"
],
"subpackages": [
{
"root": "packageA",
"pages": [
"pages/law/law",
"pages/lawItem/lawItem",
"pages/advice/advice",
"pages/adviceItem/adviceItem",
"pages/info/info"
],
"independent": true
},
{
"root": "packageB",
"pages": [
"pages/warn/warn",
"pages/teach/teach",
"pages/live/live",
"pages/course/course"
],
"independent": true
},
{
"root": "packageC",
"pages": [
"pages/exam/exam",
"pages/evaluate/evaluate",
"pages/testpaper/testpaper"
],
"independent": true
},
{
"root": "packageD",
"pages": [
"pages/dangerregister/dangerregister",
"pages/dangeredit/dangeredit",
"pages/dangerlist/dangerlist"
],
"independent": true
},
{
"root": "packageE",
"pages": [
"pages/login/login",
"pages/hwapproval/hwapproval",
"pages/sign/sign",
"pages/logs/logs",
"pages/index/index",
"pages/hwcatapproval/hwcatapproval"
],
"independent": true
}
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "安全生产管理平台",
"navigationBarTextStyle": "black"
},
"style": "v2",
"sitemapLocation": "sitemap.json"
}
\ No newline at end of file
/**app.wxss**/
.container {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 200rpx 0;
box-sizing: border-box;
}
// packageA/pages/advice/advice.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageA/pages/advice/advice.wxml-->
<text>packageA/pages/advice/advice.wxml</text>
/* packageA/pages/advice/advice.wxss */
\ No newline at end of file
// packageA/pages/adviceItem/adviceItem.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageA/pages/adviceItem/adviceItem.wxml-->
<text>packageA/pages/adviceItem/adviceItem.wxml</text>
/* packageA/pages/adviceItem/adviceItem.wxss */
\ No newline at end of file
// packageA/pages/info/info.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageA/pages/info/info.wxml-->
<text>packageA/pages/info/info.wxml</text>
/* packageA/pages/info/info.wxss */
\ No newline at end of file
// packageA/pages/law/law.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageA/pages/law/law.wxml-->
<text>packageA/pages/law/law.wxml</text>
/* packageA/pages/law/law.wxss */
\ No newline at end of file
// packageA/pages/lawItem/lawItem.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageA/pages/lawItem/lawItem.wxml-->
<text>packageA/pages/lawItem/lawItem.wxml</text>
/* packageA/pages/lawItem/lawItem.wxss */
\ No newline at end of file
// packageB/pages/course/course.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/course/course.wxml-->
<text>packageB/pages/course/course.wxml</text>
/* packageB/pages/course/course.wxss */
\ No newline at end of file
// packageB/pages/evaluate/evaluate.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/evaluate/evaluate.wxml-->
<text>packageB/pages/evaluate/evaluate.wxml</text>
/* packageB/pages/evaluate/evaluate.wxss */
\ No newline at end of file
// packageB/pages/exam/exam.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/exam/exam.wxml-->
<text>packageB/pages/exam/exam.wxml</text>
/* packageB/pages/exam/exam.wxss */
\ No newline at end of file
// packageB/pages/live/live.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/live/live.wxml-->
<text>packageB/pages/live/live.wxml</text>
/* packageB/pages/live/live.wxss */
\ No newline at end of file
// packageB/pages/teach/teach.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/teach/teach.wxml-->
<text>packageB/pages/teach/teach.wxml</text>
/* packageB/pages/teach/teach.wxss */
\ No newline at end of file
// packageB/pages/testpaper/testpaper.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/testpaper/testpaper.wxml-->
<text>packageB/pages/testpaper/testpaper.wxml</text>
/* packageB/pages/testpaper/testpaper.wxss */
\ No newline at end of file
// packageB/pages/warn/warn.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageB/pages/warn/warn.wxml-->
<text>packageB/pages/warn/warn.wxml</text>
/* packageB/pages/warn/warn.wxss */
\ No newline at end of file
// packageC/pages/evaluate/evaluate.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageC/pages/evaluate/evaluate.wxml-->
<text>packageC/pages/evaluate/evaluate.wxml</text>
/* packageC/pages/evaluate/evaluate.wxss */
\ No newline at end of file
// packageC/pages/exam/exam.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageC/pages/exam/exam.wxml-->
<text>packageC/pages/exam/exam.wxml</text>
/* packageC/pages/exam/exam.wxss */
\ No newline at end of file
// packageC/pages/testpaper/testpaper.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageC/pages/testpaper/testpaper.wxml-->
<text>packageC/pages/testpaper/testpaper.wxml</text>
/* packageC/pages/testpaper/testpaper.wxss */
\ No newline at end of file
// packageD/pages/dangeredit/dangeredit.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageD/pages/dangeredit/dangeredit.wxml-->
<text>packageD/pages/dangeredit/dangeredit.wxml</text>
/* packageD/pages/dangeredit/dangeredit.wxss */
\ No newline at end of file
// packageD/pages/dangerlist/dangerlist.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageD/pages/dangerlist/dangerlist.wxml-->
<text>packageD/pages/dangerlist/dangerlist.wxml</text>
/* packageD/pages/dangerlist/dangerlist.wxss */
\ No newline at end of file
// packageD/pages/dangerregister/dangerregister.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageD/pages/dangerregister/dangerregister.wxml-->
<text>packageD/pages/dangerregister/dangerregister.wxml</text>
/* packageD/pages/dangerregister/dangerregister.wxss */
\ No newline at end of file
// packageD/pages/enterprise/enterprise.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageD/pages/enterprise/enterprise.wxml-->
<text>packageD/pages/enterprise/enterprise.wxml</text>
/* packageD/pages/enterprise/enterprise.wxss */
\ No newline at end of file
// packageE/pages/hwapproval/hwapproval.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/hwapproval/hwapproval.wxml-->
<text>packageE/pages/hwapproval/hwapproval.wxml</text>
/* packageE/pages/hwapproval/hwapproval.wxss */
\ No newline at end of file
// packageE/pages/hwapprovallist/hwapprovallist.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/hwapprovallist/hwapprovallist.wxml-->
<text>packageE/pages/hwapprovallist/hwapprovallist.wxml</text>
/* packageE/pages/hwapprovallist/hwapprovallist.wxss */
\ No newline at end of file
// packageE/pages/hwcatapproval/hwcatapproval.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/hwcatapproval/hwcatapproval.wxml-->
<text>packageE/pages/hwcatapproval/hwcatapproval.wxml</text>
/* packageE/pages/hwcatapproval/hwcatapproval.wxss */
\ No newline at end of file
// packageE/pages/index/index.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/index/index.wxml-->
<text>packageE/pages/index/index.wxml</text>
/* packageE/pages/index/index.wxss */
\ No newline at end of file
// packageE/pages/login/login.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/login/login.wxml-->
<text>packageE/pages/login/login.wxml</text>
/* packageE/pages/login/login.wxss */
\ No newline at end of file
// packageE/pages/logs/logs.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/logs/logs.wxml-->
<text>packageE/pages/logs/logs.wxml</text>
/* packageE/pages/logs/logs.wxss */
\ No newline at end of file
// packageE/pages/person/person.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/person/person.wxml-->
<text>packageE/pages/person/person.wxml</text>
/* packageE/pages/person/person.wxss */
\ No newline at end of file
// packageE/pages/sign/sign.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--packageE/pages/sign/sign.wxml-->
<text>packageE/pages/sign/sign.wxml</text>
/* packageE/pages/sign/sign.wxss */
\ No newline at end of file
// pages/addapproval/addapproval.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
addapprovaliconImgUrl: 'http://39.102.232.151:8030/cover/添加证书icon.png',
approvalName: '',
uploadDate: '01:01:00',
validDate: '2021-09-09',
certifyFile: null,
fileName: '请选择要上传内容',
compnayId: '',
isShowImg: false,
showImgSrc: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
console.log(options, 'addapproval options')
this.data.companyId = options.companyId
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '新增危险备案'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
inputApprovalName(event) {
console.log(event, 'event event event')
this.data.approvalName = event.detail.value
},
inputJobTime(event) {
console.log(event, 'inputJobName inputJobName')
// this.data.validDate = event.detail.value
this.setData({
validDate: event.detail.value
})
},
inputUploadDate(event) {
console.log(event, 'inputUploadDate inputUploadDate')
// this.data.uploadDate = event.detail.value
this.setData({
uploadDate: event.detail.value + ":00"
})
},
chooseJobFile(event) {
console.log(event, 'chooseJobFile chooseJobFile')
wx.chooseMessageFile({
count: 1,
success: (res) => {
console.log(res, 'chhofhasdhf s')
this.data.certifyFile= res.tempFiles[0].path
this.setData({
fileName: res.tempFiles[0].name
})
}
})
},
uploadApprovalFile() {
if (!this.data.approvalName) {
wx.showToast({
title: '请输入备案名称',
})
return
}
if (!this.data.validDate) {
wx.showToast({
title: '请输入作业时间',
})
return
}
if (!this.data.uploadDate) {
wx.showToast({
title: '请输入上传时间',
})
return
}
if (!this.data.certifyFile) {
wx.showToast({
title: '请选择上传文件',
})
return
}
let formObj = {
name: this.data.approvalName,
time: this.data.validDate + ' ' +this.data.uploadDate,
companyId: this.data.companyId
}
console.log(formObj, 'this.formObj')
wx.uploadFile({
filePath: this.data.certifyFile,
name: 'file',
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport',
formData: formObj,
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, )
wx.navigateBack()
wx.showToast({
title: '上传成功',
})
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/addapproval/addapproval.wxml-->
<!--pages/addapproval/addapproval.wxml-->
<view>
<view class="approval-name-input-wrapper">
<view class="approval-name-input-title">备案名称:</view>
<input type="text"
class="approval-name-input"
placeholder="请输入备案名称"
bindinput="inputApprovalName"
/>
</view>
<view class="approval-work-date-wrapper">
<view class="approval-work-date-title">作业日期</view>
<picker
mode="date"
bindchange="inputJobTime"
>
<view class="approval-work-date-content">{{validDate}}</view>
</picker>
</view>
<view class="approval-upload-date-wrapper">
<view class="approval-upload-date-title">作业时间</view>
<picker
mode="time"
bindchange="inputUploadDate"
>
<view class="approval-upload-date-content">{{uploadDate}}</view>
</picker>
</view>
<view class="upload-content-wrapper">
<view class="upload-content-title">上传内容:</view>
<view class="upload-content" bindtap="chooseJobFile">
<image class="approval-icon-add-file" src="{{addapprovaliconImgUrl}}"></image>
<view class="upload-child-content">({{fileName}})</view>
</view>
</view>
<button class="upload-btn" bindtap="uploadApprovalFile">上传</button>
</view>
\ No newline at end of file
/* pages/addapproval/addapproval.wxss */
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.approval-type-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.approval-type-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.approval-type-child-wrpaper {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.approval-type-child {
width: 164rpx;
height: 49rpx;
background: #F2F4F6;
border-radius: 21rpx;
font-size: 26rpx;
font-family: "Source Han Sans CN";
font-weight: 400;
color: #666666;
display: flex;
align-items: center;
justify-content: center;
margin-right: 13rpx;
}
.approval-type-child:last-child {
margin-right: 0;
}
.approval-type-child-chosen {
border: 1rpx solid #090D9C;
color: #090D9C;
}
.approval-name-input-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.approval-name-input-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.approval-name-input {
flex-grow: 1;
display: flex;
justify-content: flex-end;
}
.approval-upload-date-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.approval-upload-date-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.approval-upload-date-content {
flex-grow: 1;
padding-right: 20rpx;
}
.approval-work-date-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.approval-work-date-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.approval-work-date-content {
flex-grow: 1;
padding-right: 20rpx;
}
.upload-content-wrapper {
width: 711rpx;
height: 386rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
margin: 21rpx auto;
padding-top: 24rpx;
display: flex;
flex-direction: column;
}
.upload-content-title {
width: 141rpx;
height: 31rpx;
font-size: 32rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #666666;
margin-left: 21rpx;
}
.upload-content {
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.approval-icon-add-file {
width: 87rpx;
height: 87rpx;
}
.upload-child-content {
font-size: 26rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #666666;
}
.upload-btn {
margin-top: 40rpx;
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
}
\ No newline at end of file
// pages/addcertify/addcertify.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
addcertifyiconImgUrl: 'http://39.102.232.151:8030/cover/添加证书icon.png',
certifytype: 1,
certifyName: '',
uploadDate: '2021-09-09',
validDate: '2021-09-09',
certifyFile: null,
fileName: '请选择要上传内容'
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.data.companyId = options.companyId
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '新增企业证书'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
taptype1() {
this.setData({
certifytype: 1
})
},
taptype2() {
this.setData({
certifytype: 2
})
},
taptype3() {
this.setData({
certifytype: 3
})
},
inputCertifyName(event) {
console.log(event, 'inputCertifyName')
this.data.certifyName = event.detail.value
},
inputUploadTime(event) {
console.log(event, 'inputUploadTime')
this.setData({
uploadDate: event.detail.value
})
},
inputValidTime(event) {
console.log(event, 'inputValidTime')
this.setData({
validDate: event.detail.value
})
},
chooseCertify(event) {
console.log(event, 'chooseCertify')
wx.chooseMessageFile({
count: 1,
success: (res) => {
console.log(res, 'chhofhasdhf s')
this.data.certifyFile = res.tempFiles[0].path
this.setData({
fileName: res.tempFiles[0].name
})
}
})
},
uploadCertify(event) {
console.log(event, 'uploadCertify')
if (!this.data.certifyName) {
wx.showToast({
title: '请输入证书名称',
})
return
}
if (!this.data.uploadDate) {
wx.showToast({
title: '请选择上传时间',
})
return
}
if (!this.data.validDate) {
wx.showToast({
title: '请选择有效时间',
})
return
}
if (!this.data.certifyFile) {
wx.showToast({
title: '请选择证书文件',
})
}
let formObj = {
category: this.data.certifytype=== 1? '应急预案' : (this.data.certifytype === 2?'双体系证书': '标准化'),
companyId: this.data.companyId,
expirationDate: this.data.validDate,
uploadDate: this.data.uploadDate,
name: this.data.certifyName
}
console.log(this.data.certifyFile)
console.log(formObj)
const uploadTask = wx.uploadFile({
filePath: this.data.certifyFile,
name: 'file',
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate',
formData: formObj,
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'uploadCertify')
if (res.statusCode === 201) {
wx.navigateBack()
wx.showToast({
title: '上传成功',
})
} else {
wx.showToast({
title: '上传失败',
icon: 'error'
})
}
},
fail: (res) => {
console.log(res, 'faile res uploadFile')
wx.showToast({
title: '上传失败',
icon: 'error'
})
}
})
uploadTask.onProgressUpdate(event => {
console.log(event, 'hehe onProgressUpdate')
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/addcertify/addcertify.wxml-->
<view>
<view class="certify-type-wrapper">
<view class="certify-type-title">证书类别:</view>
<view class="certify-type-child-wrpaper">
<view class="certify-type-child {{certifytype == 1? 'certify-type-child-chosen': ''}}" bindtap="taptype1">应急预案</view>
<view class="certify-type-child {{certifytype == 2? 'certify-type-child-chosen': ''}}" bindtap="taptype2">双体系</view>
<view class="certify-type-child {{certifytype == 3? 'certify-type-child-chosen': ''}}" bindtap="taptype3">标准化</view>
</view>
</view>
<view class="certify-name-input-wrapper">
<view class="certify-name-input-title">证书名称:</view>
<input type="text"
class="certify-name-input"
placeholder="请输入证书名称"
bindinput="inputCertifyName"
/>
</view>
<view class="certify-upload-date-wrapper">
<view class="certify-upload-date-title">上传时间</view>
<picker
mode="date"
bindchange="inputUploadTime"
>
<view class="certify-upload-date-content">{{uploadDate}}</view>
</picker>
</view>
<view class="certify-valid-date-wrapper">
<view class="certify-valid-date-title">有效时间</view>
<picker
mode="date"
bindchange="inputValidTime"
>
<view class="certify-valid-date-content">{{validDate}}</view>
</picker>
</view>
<view class="upload-content-wrapper">
<view class="upload-content-title">上传内容:</view>
<view class="upload-content" bindtap="chooseCertify">
<image class="certify-icon-add-file" src="{{addcertifyiconImgUrl}}"></image>
<view class="upload-child-content">({{fileName}})</view>
</view>
</view>
<button class="upload-btn" bindtap="uploadCertify">上传</button>
</view>
\ No newline at end of file
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.certify-type-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.certify-type-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.certify-type-child-wrpaper {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.certify-type-child {
width: 164rpx;
height: 49rpx;
background: #F2F4F6;
border-radius: 21rpx;
font-size: 26rpx;
font-family: "Source Han Sans CN";
font-weight: 400;
color: #666666;
display: flex;
align-items: center;
justify-content: center;
margin-right: 13rpx;
}
.certify-type-child:last-child {
margin-right: 0;
}
.certify-type-child-chosen {
border: 1rpx solid #090D9C;
color: #090D9C;
}
.certify-name-input-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.certify-name-input-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.certify-name-input {
flex-grow: 1;
display: flex;
justify-content: flex-end;
}
.certify-upload-date-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.certify-upload-date-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.certify-upload-date-content {
flex-grow: 1;
padding-right: 20rpx;
}
.certify-valid-date-wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 711rpx;
height: 85rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
align-items: center;
margin: 21rpx auto;
}
.certify-valid-date-title {
font-size: 32rpx;
font-family: 'PingFang SC1';
font-weight: 550;
margin-left: 21rpx;
margin-right: 28rpx;
color: #666666;
}
.certify-valid-date-content {
flex-grow: 1;
padding-right: 20rpx;
}
.upload-content-wrapper {
width: 711rpx;
height: 386rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 12rpx;
margin: 21rpx auto;
padding-top: 24rpx;
display: flex;
flex-direction: column;
}
.upload-content-title {
width: 141rpx;
height: 31rpx;
font-size: 32rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #666666;
margin-left: 21rpx;
}
.upload-content {
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.certify-icon-add-file {
width: 87rpx;
height: 87rpx;
}
.upload-child-content {
font-size: 26rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #666666;
}
.upload-btn {
margin-top: 40rpx;
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
}
\ No newline at end of file
// pages/addtrainimg/addtrainimg.js
const app = getApp();
function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'undefined' || time === null || time === 'null') {
return ''
} else if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['', '', '', '', '', '', ''][value ] }
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
Page({
/**
* 页面的初始数据
*/
data: {
briefIntroduction: '',
trainSum: 0,
trainLocation: '',
trainDate: '',
trainTime: '',
trainbeforeImg: '',
trainingImg: '',
trainafterImg: '',
trainbeforeImgBase64: '',
trainingImgBase64: '',
trainafterImgBase64: '',
trainbeforeImgExtension: '',
trainingImgExtension: '',
trainafterImgExtension: '',
trainbeforeImgLocation: '',
trainingImgLocation: '',
trainafterImgLocation: '',
isShootingNow: false,
isShootingBefore: false,
isShootinging: false,
isShootingAfter: false,
addbriefIntroductionIconImgUrl: 'http://39.102.232.151:8030/cover/添加证书icon.png',
companyId: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
console.log(options, 'addtrainimg options')
this.data.companyId = options.companyId
// 获取camera context
const cameraContext = wx.createCameraContext()
this.cameraContext = cameraContext
// console.log(this.cameraContext, 'this.cameraContext')
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '新增培训影像'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
inputBriefIntroduction(event) {
this.data.briefIntroduction = event.detail.value
},
inputTrainSum(event) {
console.log(event, 'inputTrainSum')
this.data.trainSum = event.detail.value
},
chosenTrainLocation(event) {
this.setData({
trainLocation: event.detail.value.join('-')
})
},
chosenTrainDate(event) {
this.setData({
trainDate: event.detail.value
})
},
chosenTrainTime(event) {
this.setData({
trainTime: event.detail.value + ":00"
})
},
takePhotoBefore() {
if (this.data.isShootingBefore === false ) {
this.setData({
isShootingBefore: true
})
return
}
let photo = {
quality: 'high',
success: (res) => {
this.setData({
trainbeforeImg: res.tempImagePath
})
// 获取定位
wx.getLocation({
type: 'wgs84',
altitude: false,
success: (res1) => {
this.data.trainbeforeImgLocation = res1.latitude + ',' + res1.longitude
}
})
const index = res.tempImagePath.indexOf('.')
this.data.trainbeforeImgExtension = res.tempImagePath.substr(index + 1)
this.data.trainbeforeImgTime = parseTime(new Date())
const fileSystemManager = wx.getFileSystemManager()
fileSystemManager.getFileInfo({
filePath: res.tempImagePath,
success: (res1) => {
fileSystemManager.readFile({
filePath: res.tempImagePath,
position: 0,
encoding: 'base64',
length: res1.size,
success: (res2) => {
this.data.trainbeforeImgBase64 = res2.data
}
})
}
})
},
complete: () => {
this.setData({
isShootingBefore: false
})
}
}
this.cameraContext.takePhoto(photo)
},
takePhotoing() {
if (this.data.isShootinging === false ) {
this.setData({
isShootinging: true
})
return
}
let photo = {
quality: 'high',
success: (res) => {
this.setData({
trainingImg: res.tempImagePath
})
// 获取定位
wx.getLocation({
type: 'wgs84',
altitude: false,
success: (res1) => {
this.data.trainingImgLocation = res1.latitude + ',' + res1.longitude
},
fail: () => {
this.data.trainingImgLocation = this.data.trainbeforeImgLocation
}
})
const index = res.tempImagePath.indexOf('.')
this.data.trainingImgExtension = res.tempImagePath.substr(index + 1)
this.data.trainingImgTime = parseTime(new Date())
const fileSystemManager = wx.getFileSystemManager()
fileSystemManager.getFileInfo({
filePath: res.tempImagePath,
success: (res1) => {
fileSystemManager.readFile({
filePath: res.tempImagePath,
position: 0,
encoding: 'base64',
length: res1.size,
success: (res2) => {
this.data.trainingImgBase64 = res2.data
}
})
}
})
},
complete: () => {
this.setData({
isShootinging: false
})
}
}
this.cameraContext.takePhoto(photo)
},
takePhotoAfter() {
if (this.data.isShootingAfter === false ) {
this.setData({
isShootingAfter: true
})
return
}
let photo = {
quality: 'high',
success: (res) => {
this.setData({
trainafterImg: res.tempImagePath
})
// 获取定位
wx.getLocation({
type: 'wgs84',
altitude: false,
success: (res1) => {
this.data.trainafterImgLocation = res1.latitude + ',' + res1.longitude
},
fail: () => {
this.data.trainafterImgLocation = this.data.trainbeforeImgLocation
}
})
const index = res.tempImagePath.indexOf('.')
this.data.trainafterImgExtension = res.tempImagePath.substr(index + 1)
this.data.trainafterImgTime = parseTime(new Date())
const fileSystemManager = wx.getFileSystemManager()
fileSystemManager.getFileInfo({
filePath: res.tempImagePath,
success: (res1) => {
fileSystemManager.readFile({
filePath: res.tempImagePath,
position: 0,
encoding: 'base64',
length: res1.size,
success: (res2) => {
this.data.trainafterImgBase64 = res2.data
}
})
}
})
},
complete: () => {
this.setData({
isShootingAfter: false
})
}
}
this.cameraContext.takePhoto(photo)
},
takePhoto() {
if (this.data.isShootingBefore) {
this.takePhotoBefore()
}
if (this.data.isShootinging) {
this.takePhotoing()
}
if (this.data.isShootingAfter) {
this.takePhotoAfter()
}
},
uploadPhoto() {
if (!this.data.briefIntroduction) {
wx.showToast({
title: '请输入简介',
icon: 'error'
})
return
}
if (!this.data.trainLocation) {
wx.showToast({
title: '请输入地点',
icon: 'error'
})
return
}
if (!this.data.trainDate) {
wx.showToast({
title: '请输入日期',
icon: 'error'
})
return
}
if (!this.data.trainTime) {
wx.showToast({
title: '请输入时间',
icon: 'error'
})
return
}
if (!this.data.trainbeforeImgBase64) {
wx.showToast({
title: '请输入培训前照片',
icon: 'error'
})
return
}
if (!this.data.trainingImgBase64) {
wx.showToast({
title: '请输入培训中照片',
icon: 'error'
})
return
}
if (!this.data.trainafterImgBase64) {
wx.showToast({
title: '请输入培训后照片',
icon: 'error'
})
return
}
if (!this.data.trainbeforeImgLocation) {
wx.showToast({
title: '请输入培训前定位',
icon: 'error'
})
return
}
if (!this.data.trainingImgLocation) {
wx.showToast({
title: '请输入培训中定位',
icon: 'error'
})
return
}
if (!this.data.trainafterImgLocation) {
wx.showToast({
title: '请输入培训后定位',
icon: 'error'
})
return
}
wx.showLoading({
title: '正在上传',
})
// wx.request
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/trainImage',
method: 'POST',
header: {
Authorization: app.globalData.Authorization
},
data: {
afterImgBase64: this.data.trainafterImgBase64,
afterImgExtention: this.data.trainafterImgExtension,
afterImgLocation: this.data.trainafterImgLocation,
beforeImgBase64: this.data.trainbeforeImgBase64,
beforeImgExtention: this.data.trainbeforeImgExtension,
beforeImgLocation: this.data.trainbeforeImgLocation,
briefIntroduction: this.data.briefIntroduction,
companyId: this.data.companyId,
location: this.data.trainLocation,
peopleNum: this.data.trainSum,
time: this.data.trainDate + ' ' + this.data.trainTime,
trainingImgBase64: this.data.trainingImgBase64,
trainingImgExtention: this.data.trainingImgExtension,
trainingImgLocation: this.data.trainingImgLocation
},
success: (res) => {
console.log(res, 'upload train img item')
wx.showToast({
title: '添加成功',
})
wx.navigateBack()
},
complete: () => {
wx.hideLoading()
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/addtrainimg/addtrainimg.wxml-->
<view class="add-train-img-wrapper">
<view class="add-train-img-brief-wrapper">
<view class="add-train-img-brief-title">培训影像简介</view>
<textarea
placeholder="请输入培训影像简介"
class="add-train-img-brief"
bindinput="inputBriefIntroduction"
></textarea>
</view>
<view
class="add-train-img-sum-wrapper"
>
<view class="add-train-img-sum-title">培训人数</view>
<input
class="add-train-img-input"
type="text"
placeholder="请输入培训人数"
type="number"
value="{{trainSum}}"
bindinput="inputTrainSum"></input>
</view>
<view class="add-train-img-location-wrapper">
<view class="add-train-img-location-title">培训地点</view>
<picker class="add-train-img-location" mode="region" level="sub-district"
bindchange="chosenTrainLocation"
><text wx:if="{{trainLocation}}">{{trainLocation}}</text><text wx:else>请选择培训地点</text></picker>
</view>
<view class="add-train-img-date-wrapper">
<view class="add-train-img-date-title">培训日期</view>
<picker class="add-train-img-date"
mode="date"
bindchange="chosenTrainDate"
><text wx:if="{{trainDate}}">{{trainDate}}</text><text wx:else>请选择培训日期</text></picker>
</view>
<view class="add-train-img-time-wrapper">
<view class="add-train-img-time-title">培训时间</view>
<picker
class="add-train-img-time"
mode="time"
bindchange="chosenTrainTime"
><text wx:if="{{trainTime}}">{{ trainTime }}</text><text wx:else>请选择培训时间</text></picker>
</view>
<view
class="add-train-img-shooting-wrapper">
<view class="add-train-img-shooting-title">培训前影像</view>
<view class="add-train-img-shooting">
<image
class="add-train-img-shooting-img" src="{{trainbeforeImg}}"></image>
<!-- <view wx:else style="width: 320rpx;height: 240rpx;display: flex;flex-direction: column;align-items: center;margin: 30rpx auto;">
<image
style="width: 90rpx;height: 90rpx;margin-top: 70rpx;"
src="{{addbriefIntroductionIconImgUrl}}"
bindtap="takePhotoBefore">
</image>
<view bindtap="takePhotoBefore">(请添加内容)</view>
</view> -->
<button class="add-train-img-shooting-btn"
bindtap="takePhotoBefore">培训前影像拍照</button>
</view>
</view>
<view
class="add-train-img-shooting-wrapper"
>
<view class="add-train-img-shooting-title">培训中影像</view>
<view class="add-train-img-shooting">
<image
class="add-train-img-shooting-img" src="{{trainingImg}}"></image>
<button class="add-train-img-shooting-btn"
bindtap="takePhotoing">培训中影像拍照</button>
</view>
</view>
<view
class="add-train-img-shooting-wrapper"
>
<view class="add-train-img-shooting-title">培训后影像</view>
<view class="add-train-img-shooting">
<image
class="add-train-img-shooting-img" src="{{trainafterImg}}"></image>
<button class="add-train-img-shooting-btn"
bindtap="takePhotoAfter">培训后影像拍照</button>
</view>
</view>
<button class="add-train-img-upload-btn"
bindtap="uploadPhoto"
>上传</button>
<view wx:if="{{isShootingBefore||isShootinging||isShootingAfter}}" class="camera-shooting-wrapper">
<camera flash="off" style="width: 100%;height: 100%;"></camera>
<view class="camera-shooting-btn">
<view class="camera-shooting-inner-btn"
bindtap="takePhoto"
></view>
</view>
</view>
</view>
\ No newline at end of file
/* pages/addtrainimg/addtrainimg.wxss */
.add-train-img-brief-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
}
.add-train-img-brief-title {
/* margin: 20rpx auto; */
}
.add-train-img-brief {
margin-left: 30rpx;
margin-top: 20rpx;
}
.add-train-img-sum-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
display: flex;
justify-content: space-between;
}
.add-train-img-shooting-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
}
.add-train-img-location-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
display: flex;
justify-content: space-between;
}
.add-train-img-location {
flex-basis: 60%;
}
.add-train-img-shooting-btn {
margin: 20rpx auto;
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
}
.add-train-img-upload-btn {
margin: 70rpx auto;
margin-top: 100rpx;
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
}
.camera-shooting-wrapper {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 999;
}
.camera-shooting-btn {
position: absolute;
bottom: 30rpx;
left: 50%;
transform: translateX(-50%);
width: 110rpx;
height: 110rpx;
background-color: #eee;
border-radius: 50%;
}
.camera-shooting-inner-btn {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
background-color: #fff;
width: 77rpx;
height: 77rpx;
}
.add-train-img-date-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
display: flex;
justify-content: space-between;
}
.add-train-img-date {
flex-basis: 60%;
}
.add-train-img-time-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-sizing: border-box;
box-shadow: 0 0 9rpx 1rpx #eee;
display: flex;
justify-content: space-between;
}
.add-train-img-time {
flex-basis: 60%;
}
\ No newline at end of file
// pages/advice/advice.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
adviceList: [
],
curPage: 0,
curPageSize: 10,
isPullDown: false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/notice/findOwnTag',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
page: this.data.curPage,
size: this.data.curPageSize,
sort: 'noticeId,desc'
},
success: (res) => {
console.log(res, 'app.globalData.appBaseUrlV2')
this.setData({
adviceList: res.data.content
})
},
complete: (res) => {}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '通知公告'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 点击跳转通知子项
*/
clickadvice(event) {
console.log(event.target.dataset.index)
app.globalData.currentAdviceItem = this.data.adviceList[event.target.dataset.index]
this.data.adviceList[event.target.dataset.index].isRead = true
this.setData({
adviceList: this.data.adviceList
})
wx.navigateTo({
url: '/pages/adviceItem/adviceItem',
success: (res) => {
res.eventChannel.emit('acceptDataFromOpenerPage1', {
adviceId: this.data.adviceList[event.target.dataset.index].noticeId
})
}
})
},
pullDownRefresh() {
this.data.curPageSize += 10
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/notice/findOwnTag',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
page: this.data.curPage,
size: this.data.curPageSize,
sort: 'noticeId,desc'
},
success: (res) => {
this.setData({
isPullDown: false,
adviceList: [...res.data.content]
})
},
complete: (res) => {}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/advice/advice.wxml-->
<view class="advice-page-wrapper">
<scroll-view scroll-y="true" class="advice-list-scroll"
refresher-enabled="false"
refresher-threshold="30"
refresher-default-style="black"
refresher-triggered="{{isPullDown}}"
bindrefresherrefresh="pullDownRefresh"
>
<view wx:for="{{adviceList}}" class="advice-item-wrapper" wx:key="adviceId" data-index="{{index}}" bindtap="clickadvice">
<view class="hasRead" wx:if="{{item.currentUserRead}}" data-index="{{index}}">已读</view>
<view class="noRead" wx:else data-index="{{index}}" data-index="{{index}}">未读</view>
<view class="advice-title" data-index="{{index}}">{{item.noticeTitle}}</view>
<view class="advice-down" data-index="{{index}}">
<view class="advice-depart" data-index="{{index}}">{{item.noticePublisher}}</view>
<view class="advice-time" data-index="{{index}}">{{item.createTime}}</view>
</view>
</view>
</scroll-view>
</view>
/* pages/advice/advice.wxss *//* pages/advice/advice.wxss */
.advice-page-wrapper {
width: 100vw;
height: 100vh;
}
.advice-list-scroll {
width: 100vw;
height: 100vh;
padding: 10rpx;
box-sizing: border-box;
}
.advice-item-wrapper {
width: 710rpx;
min-height: 158rpx;
margin: 30rpx auto;
border-radius: 10rpx;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1.5rpx -1.5rpx 1.5rpx 1.5rpx #eee;
}
.hasRead {
width: 74rpx;
height: 32rpx;
opacity: 0.3;
background: #c2c6cc;
color: rgb(0, 146, 254, .6);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 500;
line-height: 46rpx;
display: flex;
align-items: center;
justify-content: center;
margin: 0 0 9rpx 16rpx;
}
.noRead {
width: 74rpx;
height: 32rpx;
background: linear-gradient(180deg, #4589FA, #455FFA);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #ffffff;
line-height: 46rpx;
display: flex;
align-items: center;
justify-content: center;
margin: 0 0 9rpx 16rpx;
}
.advice-title {
min-height: 60rpx;
overflow: hidden;
text-overflow: ellipsis;
padding: 5rpx 18rpx;
font-size: 26rpx;
font-family: "PingFang SC";
font-weight: 540;
color: #333333;
line-height: 50rpx;
}
.advice-down {
display: flex;
justify-content: space-between;
padding: 5rpx 18rpx;
font-size: 21rpx;
line-height: 50rpx;
color: #999999;
font-weight: 500;
}
// pages/adviceItem/adviceItem.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
title: '',
depart: '',
time: '',
strips: [],
content: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const eventChannel = this.getOpenerEventChannel()
eventChannel.on('acceptDataFromOpenerPage1', (data) => {
console.log(data.adviceId)
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/notice/findOwn',
method: 'get',
data: {
noticeId: data.adviceId
},
success: (res) => {
console.log(res)
/**
* createBy
* createTIme
* noticeContent
* noticePublisher
* noticeTitle
* updateBy
* updateTime
*/
/**
* title: '',
depart: '',
time: '',
strips: [],
content
*/
this.setData({
title: res.noticeTitle,
depart: res.noticePublisher,
time: res.updateTime,
content: res.noticeContent
})
wx.setNavigationBarTitle({
title: res.noticeTitle
})
},
fail: () => {},
complete: () => {}
})
})
// this.setData({
// title: app.globalData.currentAdviceItem.title,
// depart: app.globalData.currentAdviceItem.depart,
// time: app.globalData.currentAdviceItem.time,
// strips: app.globalData.currentAdviceItem.strips
// })
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/adviceItem/adviceItem.wxml-->
<view class="advice-item-total">
<view class="advice-item-title">{{title}}</view>
<view class="advice-depart-time-wrapper">
<view class="advice-depart">{{depart}}</view>
<view class="advice-time">{{time}}</view>
</view>
<!-- <view wx:for="{{strips}}" class="advice-strips-item-wrapper">
{{item.content}}
</view> -->
<view>
<rich-text
nodes="{{ content }}"
></rich-text>
</view>
</view>
\ No newline at end of file
/* pages/adviceItem/adviceItem.wxss */
.advice-item-title {
font-size: 34rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 39rpx;
margin: 29rpx 0 33rpx 22rpx;
}
.advice-depart-time-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
font-size: 24rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #999999;
line-height: 39rpx;
margin-bottom: 30rpx;
}
.advice-depart {
margin: 0 23rpx;
}
.advice-strips-item-wrapper {
text-indent: 50rpx;
font-family: 'PingFang-SC-Medium';
font-size: 26rpx;
color: #333333;
padding: 0 25rpx;
margin-bottom: 45rpx;
line-height: 46rpx;
}
\ No newline at end of file
// pages/certify/certify.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
certifySerchIcon: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
certifyList: [
],
curRole: '',
isShowImg: false,
showImgSrc: '',
companyId: -1,
type: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
curRole: app.globalData.curRole
})
this.data.companyId = options.companyId
this.data.type = options.type
console.log(options, 'onloadOption in certify')
if (this.data.type === '1') {
//应急预案
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '应急预案'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '2') {
// 双体系
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '双体系证书'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '3') {
// 标准化
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '标准化'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '企业证书管理'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
if (this.data.type === '1') {
//应急预案
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '应急预案'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '2') {
// 双体系
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '双体系证书'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '3') {
// 标准化
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '标准化'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
}
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
navigateToCertify() {
wx.navigateTo({
url: '/pages/certifyitem /certifyitem',
success: function(event) {}
})
},
pullDownRefresh() {
console.log('pullDownRefresh pullDownRefresh pullDOwnRefresh')
setTimeout(() => {
this.setData({
isPullDown: false
})
}, 500)
},
addEnterpriseCertify() {
wx.navigateTo({
url: '/pages/addcertify/addcertify',
})
},
viewFile(event) {
console.log(event, 'viewFile viewFile')
console.log(event.currentTarget.dataset.index, 'event.target.dataset.index')
const tofilePath = this.data.certifyList[event.target.dataset.index].filepath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const resultFilePath = tofilePath.substr(index3)
console.log(app.globalData.appBaseUrlV3 + resultFilePath, 'resultFilePath')
if (!resultFilePath.endsWith('.pdf')) {
wx.previewImage({
urls: [app.globalData.appBaseUrlV3 + resultFilePath],
})
} else {
wx.showLoading({
title: '正在加载',
})
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
success: (res) => {
console.log(res, 'realdownloadfile')
if (res.tempFilePath.endsWith('.pdf')) {
// this.setData({})
wx.openDocument({
filePath: res.tempFilePath,
showMenu: true
})
} else {
// this.setData({
// isShowImg: true,
// showImgSrc: res.tempFilePath
// })
wx.previewImage({
urls: [res.tempFilePath],
})
}
},
complete: () => {
console.log('调用了吗 调用了吗')
wx.hideLoading()
},
fail: () => {
console.log('fail fail fail')
}
})
}
},
viewCertify(event) {
console.log(event, 'viewFile viewFile')
console.log(event.currentTarget.dataset.index, 'event.target.dataset.index')
const tofilePath = this.data.certifyList[event.target.dataset.index].filepath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const resultFilePath = tofilePath.substr(index3)
console.log(app.globalData.appBaseUrlV3 + resultFilePath, 'resultFilePath')
if (!resultFilePath.endsWith('.pdf')) {
wx.previewImage({
urls: [app.globalData.appBaseUrlV3 + resultFilePath],
})
} else {
wx.showLoading({
title: '正在加载',
})
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
success: (res) => {
console.log(res, 'realdownloadfile')
if (res.tempFilePath.endsWith('.pdf')) {
// this.setData({})
wx.openDocument({
filePath: res.tempFilePath,
showMenu: true
})
} else {
// this.setData({
// isShowImg: true,
// showImgSrc: res.tempFilePath
// })
wx.previewImage({
urls: [res.tempFilePath],
})
}
},
complete: () => {
console.log('调用了吗 调用了吗')
wx.hideLoading()
},
fail: () => {
console.log('fail fail fail')
}
})
}
},
deleteCertify(event) {
wx.showModal({
title: '提示',
content: '是否删除所选项',
success: (res) => {
if (res.confirm) {
wx.showLoading({
title: '正在删除',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate',
method: 'DELETE',
data: [this.data.certifyList[event.target.dataset.index].id],
header: {
Authorization: app.globalData.Authorization
},
success: (resd) => {
console.log(resd, 'enterpriseCertificate delete')
if (resd.statusCode === 204) {
wx.showToast({
title: '删除成功',
})
if (this.data.type === '1') {
//应急预案
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '应急预案'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '2') {
// 双体系
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '双体系证书'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '3') {
// 标准化
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '标准化'
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
}
}
},
complete: () => {
wx.hideLoading()
}
})
}
}
})
//this.data.certifyList[event.target.dataset.index]
},
download(event) {
const tofilePath = this.data.certifyList[event.target.dataset.index].filepath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const index4 = tofilePath.indexOf('\\', index3 + 1)
const picFilePath = tofilePath.substr(index4 + 1)
const index5 = picFilePath.indexOf('.')
const picFilePath2 = picFilePath.substr(index5)
const resultFilePath = tofilePath.substr(index3)
console.log(app.globalData.appBaseUrlV3 + resultFilePath, 'resultFilePath')
wx.showLoading({
title: '正在加载',
})
console.log(picFilePath, 'picFilePath picFilePath')
console.log(picFilePath2, 'picFilePath2 picFilePath2')
console.log(`${wx.env.USER_DATA_PATH}`)
const myPath = new Date().getTime() + picFilePath2
const myPath2 = `${wx.env.USER_DATA_PATH}/${myPath}`
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
filePath: myPath2,
success: (res) => {
console.log(res, 'realdownloadfile')
wx.showToast({
title: '下载成功',
icon: 'success',
duration: 1500
})
wx.hideLoading()
// wx.saveFile({
// tempFilePath: res.tempFilePath,
// success: (res1) => {
// console.log(res1, 'tempFielPath tempFilePath')
// wx.showToast({
// title: '下载成功',
// })
// },
// fail: (res1) => {
// wx.showToast({
// title: '下载失败',
// })
// }
// })
},
complete: () => {
console.log('调用了吗 调用了吗')
// wx.hideLoading()
},
fail: () => {
console.log('fail fail fail')
wx.showToast({
title: '下载失败',
icon: 'error'
})
wx.hideLoading()
}
})
},
hideImageShow() {
this.setData({
isShowImg: false
})
},
navigateToAddCertify() {
if (app.globalData.curRole === '企业管理') {
wx.navigateTo({
url: '/pages/addcertify/addcertify?companyId=' + this.data.companyId,
})
} else if (app.globalData.curRole) {
wx.showToast({
title: '不具备权限',
})
}
},
searchCertify(event) {
console.log(event, 'searchCertify searchCertify')
if (this.data.type === 1) {}
if (this.data.type === '1') {
//应急预案
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '应急预案',
certificateName: event.detail.value
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '2') {
// 双体系
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '双体系证书',
certificateName: event.detail.value
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
} else if (this.data.type === '3') {
// 标准化
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
method: 'GET',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: this.data.companyId,
category: '标准化',
certificateName: event.detail.value
},
success: (res) => {
console.log(res, 'api/enterpriseCertificate/page')
this.setData({
certifyList: [...res.data.content.map(item => {
return {
type: item.category,
name: item.name,
uploadDate: item.uploadDate,
validDate: item.expirationDate,
id: item.id,
filepath: item.filePath
}
})]
})
}
})
}
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/certify/certify.wxml-->
<view class="certify-wrapper">
<view class="certify-tools-wrapper">
<input
class="certify-input-wrapper"
placeholder="请输入证书名称搜索"
type="text"
confirm-type="search"
bindconfirm="searchCertify"
>
<image src="{{certifySerchIcon}}" class="certify-search-icon"></image>
</input>
<view class="navigateToAddCertify" wx:if="{{curRole === '企业管理'}}" bindtap="navigateToAddCertify">新增</view>
</view>
<scroll-view
class="certify-scroll-wrapper"
scroll-y="true"
>
<view wx:for="{{certifyList}}" class="certify-item"
>
<view class="top-wrapper" data-index="{{index}}" bindtap="viewFile">
<view class="dec-region"></view>
<view class="certify-des-item-total-wrapper">
<view class="certify-des-item-wrapper">
<view class="certify-des-item-title">证书类别:</view>
<view class="certify-des-item-content">{{item.type}}</view>
</view>
<view class="certify-des-item-wrapper">
<view class="certify-des-item-title">证书名称:</view>
<view class="certify-des-item-content">{{item.name}}</view>
</view >
<view class="certify-des-item-wrapper">
<view class="certify-des-item-title">上传日期:</view>
<view class="certify-des-item-time">{{item.uploadDate}}</view>
</view>
<view class="certify-des-item-wrapper">
<view class="certify-des-item-title">有效日期:</view>
<view class="certify-des-item-time">{{item.validDate}}</view>
</view>
<view class="train-img-tools-wrapper">
<view class="train-img-tools-view"
data-index="{{index}}"
bindtap="viewCertify"
>查看</view>
<view class="train-img-tools-delete" wx:if="{{curRole === '企业管理'}}"
data-index="{{index}}"
bindtap="deleteCertify">删除</view>
</view>
</view>
</view>
<!-- <view class="certify-item-tools-wrapper">
<button class="certify-item-view"
data-index="{{index}}"
bindtap="viewFile">查看</button>
<button class="certify-item-downlaod"
data-index="{{index}}"
bindtap="download">下载</button>
</view> -->
</view>
</scroll-view>
<view class="img-file-show" wx:if="{{isShowImg}}" bindtap="hideImageShow">
<image src="{{showImgSrc}}" class="show-image"></image>
</view>
</view>
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.certify-wrapper {
padding-top: 18rpx;
box-sizing: border-box;
background-color: #F4F4F5;
width: 100vw;
height: 100vh;
}
.certify-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.certify-input-wrapper {
width: 569rpx;
height: 67rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 34rpx;
position: relative;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
padding-left: 50rpx;
background-color: #FAFAFA;
margin-left: 22rpx;
margin-right: 11rpx;
}
.navigateToAddCertify {
width: 129rpx;
height: 63rpx;
background: #FAFAFA;
border: 1px solid #090D9C;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 19rpx;
}
.certify-scroll-wrapper {
margin-top: 20rpx;
height: calc(100vh - 107rpx);
}
.certify-item {
width: 706rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
margin: 22rpx auto;
background-color: #ffffff;
padding: 10rpx 0;
}
.top-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.dec-region {
width: 11rpx;
height: 29rpx;
background: #090D9C;
margin-left: 22rpx;
margin-right: 12rpx;
margin-top: 23rpx;
}
.certify-des-item-total-wrapper {
padding-top: 15rpx;
flex-grow: 1;
}
.certify-des-item-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
margin-bottom: 12rpx;
}
.certify-des-item-title {
font-size: 30rpx;
font-family: "PingFang SC1";
color: #333333;
margin-right: 20rpx;
font-weight: 550;
}
.certify-des-item-content {
font-size: 30rpx;
color: #090D9C;
font-family: "PingFang SC1";
font-weight: 550;
}
.certify-des-item-time {
color: #666666;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
}
.certify-item-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
padding-bottom: 3rpx;
}
.certify-item-view {
width: 135rpx!important;
height: 53rpx!important;
background: #090D9C;
border: 1rpx solid #090D9C;
border-radius: 8rpx;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
padding: 0!important;
margin-right: 20rpx!important;
margin-top: 0!important;
margin-bottom: 0!important;
}
.certify-item-downlaod {
width: 135rpx!important;
height: 53rpx!important;
background: #FFFFFF;
border: 1rpx solid #090D9C;
border-radius: 8rpx;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
display: flex;
align-items: center;
justify-content: center;
padding: 0!important;
margin-right: 20rpx!important;
margin-left: 0!important;
margin-top: 0!important;
margin-bottom: 0!important;
}
.img-file-show {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 9999;
background-color: #808080;
}
.show-image {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.train-img-tools-wrapper {
display: flex;
justify-content: flex-end;
}
.train-img-tools-view {
padding: 15rpx 25rpx;
background-color: #1f208c;
color: white;
font-size: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
margin-left: 20rpx;
border-radius: 5rpx;
}
.train-img-tools-delete {
padding: 15rpx 25rpx;
background-color: #d80000;
color: white;
font-size: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
margin-left: 20rpx;
border-radius: 5rpx;
}
\ No newline at end of file
// pages/certifyEnter/certifyenter.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
enterSearchImgUrl: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
certifyenterImgUrl: 'http://39.102.232.151:8030/cover/证书企业icon.png',
enters: [
],
curRole: '',
companyName: '',
emergency: 0,
dualSystem: 0,
standardization: 0
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 根据 curRole 进行请求
// this.data.curRole = app.globalData.curRole
this.setData({
curRole: app.globalData.curRole
})
console.log(this.data.curRole, 'this.data.curRole')
if (this.data.curRole === '政府') {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
this.setData({
enters: [...res.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
} else if (this.data.curRole === '运营商') {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
this.setData({
enters: [...res.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
} else if (this.data.curRole === '企业管理') {
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany/query',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: app.globalData.companyId
},
success: (res) =>{
console.log(res.data, 'thCompany/query')
if (res.data && res.data.length > 0) {
console.log(this.data, 'this.data')
this.setData({
companyName: res.data[0].companyName
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyName: res.data[0].companyName
},
success: (res1)=> {
console.log(res1, 'api/enterpriseCertificate/apgeEnterprise')
this.setData({
enters: [...res1.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
}
}
})
// wx.request({
// url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
// method: 'GET',
// data: {
// companyId: app.globalData.companyId,
// category: '双体系证书'
// },
// header: {
// Authorization: app.globalData.Authorization
// },
// success(res) {
// console.log(res.data, '双体系证书, enterpriseCertificate/page')
// this.setData({
// dualSystem: res.data.content.length
// })
// }
// })
// wx.request({
// url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
// method: 'GET',
// data: {
// companyId: app.globalData.companyId,
// category: '应急预案'
// },
// header: {
// Authorization: app.globalData.Authorization
// },
// success(res) {
// console.log(res.data, '应急预案, enterpriseCertificate/page')
// this.setData({
// emergency: res.data.content.length
// })
// }
// })
// wx.request({
// url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/page',
// method: 'GET',
// data: {
// companyId: app.globalData.companyId,
// category: '应急预案'
// },
// header: {
// Authorization: app.globalData.Authorization
// },
// success(res) {
// console.log(res.data, '应急预案, enterpriseCertificate/page')
// this.setData({
// emergency: res.data.content.length
// })
// }
// })
} else if (this.data.curRole === '超级管理员') {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
this.setData({
enters: [...res.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: "企业证书管理",
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff'
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 跳转到应急预案
*/
tapToEmergency(event) {
console.log(event, 'tapToEmergency')
wx.navigateTo({
url: '/pages/certify/certify?type=1&companyId='+event.currentTarget.dataset.index.companyId,
})
},
/**
* 跳转到双体系
*/
tapToDualSystem(event) {
console.log(event, 'tapToDualSystem')
wx.navigateTo({
url: '/pages/certify/certify?type=2&companyId='+event.currentTarget.dataset.index.companyId,
})
},
/**
* 跳转到标准化
*/
tapToStandardization(event) {
console.log(event, 'tapToStandardization')
wx.navigateTo({
url: '/pages/certify/certify?type=3&companyId='+event.currentTarget.dataset.index.companyId,
})
},
/**
* 搜索企业
*/
searchEnters(event) {
console.log(event.detail.value, 'searchEnters')
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
enterpriseName: event.detail.value
},
success: (res) => {
this.setData({
enters: [...res.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/certifyEnter/certifyenter.wxml-->
<view class="certify-enter-wrapper">
<view class="certify-tools-wrapper" wx:if="{{curRole !== '企业管理'}}">
<input type="text" class="enter-name-search-bar" placeholder="请输入企业名称"
confirm-type="search"
bindconfirm="searchEnters"
>
<image class="certify-enter-search-img" src="{{enterSearchImgUrl}}" alt="error">
</image>
</input>
</view>
<scroll-view
scroll-y="true"
class="enters">
<view wx:for="{{enters}}" class="enters-item">
<view class="enter-certify-title-wrapper">
<image src="{{certifyenterImgUrl}}" class="certify-enter-icon"></image>
<view class="certify-enter-name">{{item.companyName}}</view>
</view>
<view class="enter-certify-sum-wrapper">
<view class="enter-certify-child-sum"
data-index="{{item}}"
bindtap="tapToEmergency">
<view class="certify-child-sum-degree">{{item.emergencyPlan}}</view>
<view class="certify-child-sum-degree-title">应急预案证书数量</view>
</view>
<view class="enter-certify-child-sum"
data-index="{{item}}"
bindtap="tapToDualSystem">
<view class="certify-child-sum-degree">{{
item.dualSystem
}}</view>
<view class="certify-child-sum-degree-title">双体系证书数量</view>
</view>
<view class="enter-certify-child-sum"
data-index="{{item}}"
bindtap="tapToStandardization">
<view class="certify-child-sum-degree">{{item.standardization}}</view>
<view class="certify-child-sum-degree-title">标准化证书数量</view>
</view>
</view>
</view>
</scroll-view>
</view>
/* pages/certifyEnter/certifyenter.wxss */
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.certify-enter-wrapper {
padding-top: 18rpx;
box-sizing: border-box;
width: 100vw;
height: 100vh;
background-color: #F4F4F5;
}
.certify-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
/* height: 69rpx;
margin-left: 40rpx;
padding-left: 30rpx; */
}
.enter-name-search-bar {
box-sizing: border-box;
padding-left: 80rpx;
position: relative;
background-color: #FAFAFA;
border-radius: 34rpx;
height: 69rpx;
width: 663rpx;
margin-left: 40rpx;
margin-right: 11rpx;
}
.certify-enter-search-img {
position: absolute;
top: 0;
left: 10rpx;
width: 69rpx;
height: 69rpx;
/* transform: translate(50%, 50%); */
transform: scale(0.8);
display: flex;
align-items: center;
justify-content: center;
}
.navigateToAddCertify {
width: 129rpx;
height: 63rpx;
background: #FAFAFA;
border: 1rpx solid #090D9C;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
font-family: "PingFang SC";
font-weight: 500;
color: #090D9C;
line-height: 23rpx;
}
.enters {
box-sizing: border-box;
height: calc(100vh - 87rpx);
}
.enters-item {
width: 706rpx;
height: 213rpx;
margin: 23rpx auto;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
display: flex;
flex-direction: column;
}
.enter-certify-title-wrapper {
font-size: 34rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #333333;
flex-grow: 0;
flex-shrink: 0;
display: flex;
flex-direction: row;
margin-top: 24rpx;
}
.certifyicon {
font-family: 'certifyicon'!important;
font-size: 16rpx;
font-style: normal;
width: 40rpx;
height: 40rpx;
}
.certify-enter-icon {
width: 45rpx;
height: 45rpx;
margin-left: 20rpx;
margin-right: 11rpx;
}
.certify-enter-name {
width: 630rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enter-certify-sum-wrapper {
flex-grow: 1;
flex-shrink: 0;
display: flex;
flex-direction: row;
justify-content: flex-start;
padding-bottom: 35rpx;
margin-top: 13rpx;
}
.enter-certify-child-sum {
flex-basis: 33%;
text-align: center;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.certify-child-sum-degree {
font-size: 42rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #090D9C;
margin-bottom: 20rpx;
}
.certify-child-sum-degree-title {
font-size: 26rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #333333;
}
\ No newline at end of file
// pages/certifyitem/certifyitem.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
<!--pages/certifyitem/certifyitem.wxml-->
<text>pages/certifyitem/certifyitem.wxml</text>
// pages/course/course.js
const app = getApp()
import * as echarts from '../ec-canvas/echarts'
let curIndex = 0
/**
* 初始化图表
*/
function initChart(canvas, width, height, dpr){
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr
});
canvas.setChart(chart)
const option = {
title: {
text: app.globalData.currentCourse.courses[curIndex].process + '%',
left: 'center',
top: 'center'
},
color: ['#090D9C', '#F4F4F5'],
series: [
{
type: 'pie',
radius: ['48%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
borderColor: '#fff',
borderWidth: 2
},
labelLine: {
show: false
},
data: [
{
value: app.globalData.currentCourse.courses[curIndex].process
},
{
value: 100 - app.globalData.currentCourse.courses[curIndex].process
}
]
}
]
}
curIndex++
chart.setOption(option)
return chart
}
Page({
/**
* 页面的初始数据
*/
data: {
curCourse: app.globalData.currentCourse.title,
curCoursePic: 'https://img0.baidu.com/it/u=2265254049,1802113800&fm=26&fmt=auto&gp=0.jpg',
courseVideoSrc: 'http://39.102.232.151:8030/video/8.mp4',
courseVideoPlay: 'data:image/png;base64,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',
animationDisappear: {},
courses: [],
ec: {
onInit: initChart
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
courseVideoSrc: app.globalData.currentCourse.courses ? app.globalData.currentCourse.courses[0]: '',
curCourse: app.globalData.currentCourse.title,
courses: app.globalData.currentCourse.courses,
curCoursePic: app.globalData.currentCourse.cover
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '在线培训'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
this.videoCV = wx.createVideoContext('course')
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 点击播放
*/
playvideo(event) {
const repAnimation = wx.createAnimation({
duration: 50,
timingFunction: 'step-start'
})
this.repAnimation = repAnimation
repAnimation.translateX('-100%').step()
this.setData({
animationDisappear: repAnimation.export(),
})
console.log(this.videoCV)
this.videoCV.play()
},
/**
* 观看时间更新
*/
videoUpdate(event) {
console.log(event.detail, '视频继续播放')
},
/**
* 展示章节
*/
showArticle(event) {
// console.log(event.target.dataset.index, 'heheheh')
if (this.data.courses[event.target.dataset.index].fileType === 'mp4' || this.data.courses[event.target.dataset.index].fileType === 'wmv') {
this.setData({
courseVideoSrc: this.data.courses[event.target.dataset.index].fileUrl
})
}
}
})
\ No newline at end of file
{
"usingComponents": {
"ec-canvas": "../ec-canvas/ec-canvas"
}
}
\ No newline at end of file
<!--pages/course/course.wxml-->
<view class="course-wrapper">
<view class="course-title">当前课程: {{curCourse}}</view>
<view class="video-wrapper">
<video id="course" show-center-play-btn="{{false}}" src="{{courseVideoSrc}}" bindtimeupdate="videoUpdate"></video>
<image class="video-cover" mode="scaleToFill" src="{{curCoursePic}}" animation="{{animationDisappear}}"></image>
<view class="mask-video" animation="{{animationDisappear}}">
<image class="paly-video-btn" src="{{courseVideoPlay}}" bindtap="playvideo">
</image>
</view>
</view>
<view class="artiles-title">章节学习进度</view>
<scroll-view scroll-y="{{true}}" class="article-wrapper">
<view wx:for="{{courses}}" class="article-list-warpper" bindtap="showArticle" data-index="{{index}}">
<view class="left-wrapper" data-index="{{index}}">
<view class="article-name-wrapper" data-index="{{index}}">章节:<text class="toright" data-index="{{index}}">第 {{index}} 章</text></view>
<view class="artilce-title-wrapper">课程名称:<text class="toright" data-index="{{index}}">{{item.title}}</text></view>
</view>
<view class="right-wrapper" data-index="{{index}}">
<ec-canvas ec="{{ ec }}" data-index="{{index}}"></ec-canvas>
</view>
</view>
</scroll-view>
</view>
/* pages/course/course.wxss */
.course-wrapper {
width: 100vw;
height: 100vh;
box-sizing: border-box;
}
.course-title {
height: 29rpx;
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin: 20rpx 0 30rpx 30rpx;
}
.video-wrapper {
position: relative;
width: 710rpx;
height: 288rpx;
border-radius: 10rpx;
margin: 0 auto;
box-sizing: border-box;
overflow: hidden;
}
#course {
width: 100%;
height: 100%;
}
.video-cover {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.video-play-cover {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.mask-video {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0, .2);
}
.paly-video-btn {
position: absolute;
left: 50%;
top: 50%;
width: 84rpx;
height: 84rpx;
transform: translate(-50%, -50%);
}
.artiles-title {
height: 30rpx;
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 23rpx;
margin: 30rpx 0 20rpx 30rpx;
}
.article-wrapper {
height: calc(100vh - 450rpx);
margin: 0 8rpx;
}
.article-list-warpper {
width: 710rpx;
height: 208rpx;
margin: 21rpx 19rpx;
box-sizing: border-box;
display: flex;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee;
}
.left-wrapper {
width: 510rpx;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
padding-left: 20rpx;
}
.article-name-wrapper {
height: 40rpx;
}
.course-degree {
font-size: 32rpx;
}
.artilce-title-wrapper {
height: 40rpx;
}
.toright {
margin-left: 20rpx;
}
.right-wrapper {
width: 200rpx;
height: 100%;
}
\ No newline at end of file
// pages/dangeredit/dangeredit.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
// 企业id
companyId: app.globalData.currentEnter.companyId,
// 隐患验收人
hdAcceptancePerson: "",
// 隐患id
hdId: -1,
// 隐患描述
hdDesc: "",
// 检查日期
hdInspectDate: '',
// 检查专家
hdInspectExpert: '',
// 隐患级别 1 2
hdLevel: 1,
// 隐患名称
hdName: '',
// 隐患图片
hdPic: null,
// 隐患整改日期
hdRectificationDate: '',
// 隐患整改图片
hdRectificationPic: null,
// 隐患整改建议
hdRectificationSug: '',
// 隐患状态 0 正在整改 1 整改完毕
hdStatus: 0,
// 隐患预览图片
imgsrcurl: '',
// 整改预览照片
imgrecturl: '',
// 隐患图片文件路径
hdFilePath: '',
// 整改图片文件路径
rectFilePath: '',
// 放大图片的路径
enlargeUrl: '',
topAnimation: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const animation = wx.createAnimation({
delay: 10,
timingFunction: 'linear'
})
this.animation = animation
this.data.companyId = app.globalData.currentEnter.companyId
this.setData(
app.globalData.currentHD
)
// console.log(app.globalData.currentHD, 'currentHD')
// 调用接口 获取图片
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'get',
data: {
companyId: app.globalData.currentEnter.companyId,
hdId: app.globalData.currentHD.hdId,
page: 0,
size: 2000,
sort: 'hdId,asc'
},
success: (res) => {
if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
if (res.data.content && res.data.content[0] && res.data.content[0].hdPic) {
this.setData({
imgsrcurl: 'data:image/jpg;base64,' + res.data.content[0].hdPic
})
}
if (res.data.content && res.data.content[0] && res.data.content[0].hdRectificationPic) {
this.setData({
imgrecturl: 'data:image/jpg;base64,' + res.data.content[0].hdRectificationPic
})
}
}
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '编辑隐患',
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 拍摄整改照片
*/
takePhoto() {
wx.chooseImage({
success: (res) => {
this.data.rectFilePath = res.tempFilePaths[0]
wx.getFileSystemManager().readFile({
filePath: res.tempFilePaths[0], // 选择图片返回的相对路径
encoding: 'base64', // 编码格式
success: res1 => { // 成功的回调
this.setData({
imgrecturl: 'data:image/png;base64,' + res1.data
})
}
})
}
})
},
/**
* 输入整改日期
*/
inputRectDate(event) {
this.setData({
hdRectificationDate: event.detail.value + ' 00:00:00'
})
},
/**
* 输入验收人
*/
inputAcceptancePer(event) {
this.data.hdAcceptancePerson = event.detail.value
},
/**
* 输入隐患状态
*/
inputRectStatus(event) {
this.data.hdStatus = event.detail.value
},
/**
* 提交修改
*/
submitEdit() {
if (this.data.rectFilePath) {
wx.showLoading({
title: '上传中',
})
let formData = {}
formData = {...this.data}
delete formData.hdPic
delete formData.hdRectificationPic
delete formData.imgsrcurl
delete formData.imgrecturl
delete formData.hdFilePath
delete formData.rectFilePath
if (!formData.hdInspectDate) {
delete formData.hdInspectDate
}
if (!formData.hdRectificationDate) {
delete formData.hdRectificationDate
}
console.log('整改日期:' + this.data.rectFilePath)
console.log('整改日期2:' + this.data.hdRectificationDate)
wx.uploadFile({
filePath: this.data.rectFilePath,
name: 'hdRectificationPic',
url: app.globalData.appBaseUrl + '/api/thHiddenDanger/update',
formData: formData,
success: (res) => {
console.log(res, '文件编辑上传')
wx.hideLoading()
if (res.statusCode === 204) {
wx.showToast({
title: '编辑成功',
icon: 'success'
})
wx.navigateBack()
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
}
},
fail: () => {
wx.hideLoading()
}
})
}
else {
wx.showLoading({
title: '上传中',
})
let formData = {}
formData = {...this.data}
delete formData.hdPic
delete formData.hdRectificationPic
delete formData.imgsrcurl
delete formData.imgrecturl
delete formData.hdFilePath
delete formData.rectFilePath
if (!formData.hdInspectDate) {
delete formData.hdInspectDate
}
if (!formData.hdRectificationDate) {
delete formData.hdRectificationDate
}
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger/update',
method: 'POST',
header: {
'content-type': 'multipart/form-data; boundary=XXX'
},
data: this.formatFormData(formData),
success: (res) => {
console.log(res, '上传成功了吗afhdhsfhhdsfhadsf')
wx.showToast({
title: '编辑成功',
icon: 'success'
})
wx.navigateBack()
},
fail: () => {},
complete: () => {
wx.hideLoading()
}
})
}
},
// 格式化 multipart/formdata
formatFormData(formdata) {
let dataString = '\r\n--XXX'
for (const key in formdata) {
dataString += `\r\nContent-Disposition: form-data; name="${key}"\r\n\r\n${formdata[key]}\r\n--XXX`
}
return dataString
},
toEnlargePicByHiddenPic() {
this.animation.bottom(0).step()
this.setData({
topAnimation: this.animation.export(),
enlargeUrl: this.data.imgsrcurl
})
// toEnlargePicByRectPic
},
toEnlargePicByRectPic() {
this.animation.bottom(0).step()
this.setData({
topAnimation: this.animation.export(),
enlargeUrl: this.data.imgrecturl
})
},
toCancelEnlargePic() {
this.animation.bottom('-100%').step()
this.setData({
topAnimation: this.animation.export()
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/dangeredit/dangeredit.wxml-->
<view class="danger-edit-wrapper">
<scroll-view
scroll-y="true"
class="danger-form-wrapper">
<!-- <view class="danger-order">
<text>序号:</text>
<input type="text" disabled="true" />
</view> -->
<view class="danger-check-date">
<text>检查日期:</text>
<picker class="danger-pick-date" disabled="true" mode="date" value="{{hdInspectDate}}" bindchange="">
<view class="current-picker">
当前选择: {{hdInspectDate}}
</view>
</picker>
</view>
<view class="danger-expert">
<text>检查专家:</text>
<input type="text" disabled="true" placeholder="请输入专家名称" value="{{hdInspectExpert}}" bindinput="" />
</view>
<view class="danger-name">
<text>隐患名称:</text>
<textarea type="text" disabled="true" placeholder="请输入隐患名称" value="{{hdName}}" bindinput="" maxlength="-1" />
</view>
<!-- <view class="danger-type">
<text>隐患类型:</text>
<radio-group bindchange="">
<radio color="#1d2089" disabled="true" checked="{{hdLevel===1}}" value="1" >一般隐患</radio>
<radio color="#1d2089" disabled="true" checked="{{hdLevel===2}}" value="2" >重大隐患</radio>
</radio-group>
</view> -->
<view class="danger-rect">
<text>整改建议:</text>
<textarea disabled="true" maxlength="-1" bindinput="" value="{{hdRectificationSug}}"></textarea>
</view>
<view class="hdPic-preview">
<text>隐患照片预览:</text>
<image mode="aspectFit" src="{{imgsrcurl}}"
bindtap="toEnlargePicByHiddenPic"></image>
</view>
<view class="danger-img">
<text>整改照片</text>
<!-- <camera device-position="back" flash="off" style="width:100%;height:300px;"></camera> -->
<image mode="aspectFit" src="{{imgrecturl}}" bindtap="toEnlargePicByRectPic"></image>
<button type="primary" bindtap="takePhoto" style="background-color: #1d2089;">拍照</button>
</view>
<!-- <view class="danger-preview">
<text>整改照片预览:</text>
</view> -->
<view class="danger-rect-date">
<text>整改日期:</text>
<picker class="danger-pick-date" mode="date" bindchange="inputRectDate" value="{{hdRectificationDate}}">
<view class="current-picker">
当前选择: {{hdRectificationDate ? hdRectificationDate : ''}}
</view>
</picker>
</view>
<view class="danger-recept-per">
<text>验收人:</text>
<input type="text" placeholder="请输入验收人" value="{{hdAcceptancePerson}}" bindinput="inputAcceptancePer" />
</view>
<!-- <view class="rect-img">
<text>整改照片</text>
<button type="primary" bindtap="takePhoto2">拍照</button>
</view>
<view class="rect-preview">
<text>整改照片预览:</text>
<image mode="widthFix" src="{{imgrecturl}}"></image>
</view> -->
<view class="danger-status">
<text>隐患状态:</text>
<radio-group bindchange="inputRectStatus">
<radio checked="{{hdStatus===0}}" value="0" color="#1d2089">正在整改</radio>
<radio checked="{{hdStatus===1}}" value="1" color="#1d2089">整改完毕</radio>
</radio-group>
</view>
<view class="danger-submit">
<button type="primary" bindtap="submitEdit" style="background-color: #1d2089;">提交修改</button>
</view>
</scroll-view>
<view class="enlarge-pic-wrapper" animation="{{topAnimation}}">
<image
src="{{enlargeUrl}}"
mode="aspectFit"
class="enlarge-pic"
bindtap="toCancelEnlargePic"
></image>
</view>
</view>
/* pages/dangeredit/dangeredit.wxss */
/* pages/dangerregister/dangerregister.wxss */
.danger-edit-wrapper {
width: 100vw;
height: 100vh;
position: relative;
box-sizing: border-box;
}
.danger-form-wrapper {
position: absolute;
height: 100vh;
width: 100vw;
margin: 0 auto;
padding-top: 2vh;
padding-bottom: 2vh;
}
.danger-order {
display: flex;
margin: 3vh 2vw;
background-color: white;
padding: 1vh 1vw;
}
.danger-order text {
flex-grow: 0;
flex-shrink: 0;
}
.danger-order input {
flex-grow: 1;
flex-shrink: 0;
}
.danger-check-date {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-check-date .danger-pick-date {
flex: 1;
text-align: right;
}
.danger-expert {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-name {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-type {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
}
.danger-rect {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.hdPic-preview {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.hdPic-preview image {
width: 100%;
}
.danger-img {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-preview {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-preview image {
width: 100%;
}
.danger-rect-date {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.danger-recept-per {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.rect-img {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
}
.rect-preview {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
}
.danger-status {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
border-radius: 5rpx;
}
.enlarge-pic-wrapper {
position: absolute;
bottom: -100%;
width: 100vw;
height: 100vh;
background-color: black;
display: flex;
align-items: center;
justify-content: center;
}
.enlarge-pic {
width: 100vw;
height: 100vh;
}
\ No newline at end of file
const app = getApp()
// pages/dangerlist/dangerlist.js
Page({
/**
* 页面的初始数据
*/
data: {
dglist: [],
curEnterName: '',
leftMove: {},
topAnimation: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const animation = wx.createAnimation({
delay: 20,
timingFunction: 'linear'
})
this.animation = animation
this.setData({
curEnterName: app.globalData.currentEnter.companyName
})
// console.log('dgonload')
wx.showLoading({
title: '正在加载隐患列表',
})
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'GET',
data: {
companyId: app.globalData.currentEnter.companyId,
sort: 'hdId,asc',
page: 0,
size: 99999
},
success: (res) => {
console.log(res, '获取当前企业的隐患')
if (res.statusCode === 200) {
this.setData({
dglist: [...res.data.content]
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
wx.showToast({
title: '获取失败',
icon: 'error',
duration: 2000
})
}
wx.hideLoading()
},
fail: () => {
wx.hideLoading()
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
// console.log('dgonready')
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
// console.log('dgonshow')
wx.setNavigationBarTitle({
title: app.globalData.currentEnter.companyName,
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff'
})
wx.showLoading({
title: '正在加载隐患列表',
})
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'GET',
data: {
companyId: app.globalData.currentEnter.companyId,
sort: 'hdId,asc',
page: 0,
size: 99999
},
success: (res) => {
console.log(res, '获取当前企业的隐患')
if (res.statusCode === 200) {
this.setData({
dglist: [...res.data.content]
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
wx.showToast({
title: '获取失败',
icon: 'error',
duration: 2000
})
}
wx.hideLoading()
},
fail: () => {
wx.hideLoading()
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
// console.log('dgonhide')
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
// console.log('dgonupload')
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
// console.log('dgonpulldown')
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
// console.log('dgonreachBottom')
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
// console.log('dgonshareappmessage')
},
/**
* 新增隐患
*/
addNewHD(event) {
console.log(event, 'hehe')
wx.navigateTo({
url: '/pages/dangerregister/dangerregister',
})
},
/**
* 编辑隐患
*/
editHD(event) {
console.log(event.target.dataset.index)
// event.target.dateset.index
app.globalData.currentHD = {...this.data.dglist[event.target.dataset.index]}
// console.log(app.globalData.currentHD)
wx.navigateTo({
url: '/pages/dangeredit/dangeredit',
})
// this.animation.translateX('50rpx').step()
// this.setData({
// leftMove: this.animation.export()
// })
},
cancelToDelete() {
this.animation.bottom('-100%').step()
this.setData({
topAnimation: this.animation.export()
})
},
confirmToDelete() {
wx.showLoading({
title: '正在删除',
})
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'DELETE',
data: [this.data.dglist[this.deleteIndex].hdId],
success: (res) => {
// console.log(res, 'hehehheeheh')
if (res.statusCode === 200) {
wx.showToast({
title: '删除成功',
icon: 'success'
})
this.animation.bottom('-100%').step()
this.setData({
topAnimation: this.animation.export()
})
wx.showLoading({
title: '正在加载隐患列表',
})
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'GET',
data: {
companyId: app.globalData.currentEnter.companyId,
sort: 'hdId,asc',
page: 0,
size: 99999
},
success: (res) => {
console.log(res, '获取当前企业的隐患')
if (res.statusCode === 200) {
this.setData({
dglist: [...res.data.content]
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
wx.showToast({
title: '获取失败',
icon: 'error',
duration: 2000
})
}
wx.hideLoading()
},
fail: () => {
wx.hideLoading()
}
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
wx.showToast({
title: '删除失败',
icon: 'success'
})
}
},
fail: () => {
wx.showToast({
title: '删除失败',
})
},
complete: () => {
wx.hideLoading()
}
})
},
/**
* 删除隐患
*/
deleteHD(event) {
console.log(event.target.dataset.index)
this.deleteIndex = event.target.dataset.index
this.animation.bottom(0).step()
this.setData({
topAnimation: this.animation.export()
})
// event.target.dateset.index
},
/**
* 新增按钮开启
*/
addBtnTouchStart(event) {
const animation = wx.createAnimation({
delay: 0,
duration: 400,
timingFunction: 'ease'
})
this.animation = animation
animation.translateX('-20rpx').step()
this.setData({
leftMove: animation.export()
})
// setTimeout(() => {
// animation.translateX('50rpx').step()
// this.setData({
// leftMove: animation
// })
// }, 400)
},
addBtnTouchEnd() {
this.animation.translateX('0rpx').step()
this.setData({
leftMove: this.animation.export()
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/dangerlist/dangerlist.wxml-->
<view class="dangerlist-wrapper">
<button class="add-btn"
animation="{{leftMove}}"
bindtouchstart="addBtnTouchStart"
bindtouchend="addBtnTouchEnd"
bindtap="addNewHD">新增</button>
<scroll-view scroll-y="true" class="com-danger-list-scroll">
<view wx:for="{{dglist}}" class="enterprise-dg-item" wx:key="hdId">
<view class="hd-name-expert" wx:if="{{item.hdStatus === 1}}">{{item.hdName}}</view>
<view class="hd-name-expoer-to-green" wx:else>{{item.hdName}}</view>
<button type="default" class="editBtn" size="mini" bindtap="editHD" data-index="{{index}}">编辑</button>
<button type="warn" class="delBtn" size="mini" data-index="{{index}}" bindtap="deleteHD">删除</button>
</view>
<view wx:if="{{dglist.length === 0}}" class="no-hd">暂无隐患</view>
</scroll-view>
<view class="btn-to-confirm" animation="{{topAnimation}}">
<view class="btn-to-confirm-center">
<view class="btn-to-confirm-title">此操作将删除所选项,确认删除?</view>
<view class="change-password-btns-wrapper">
<view class="cancel-change-password" bindtap="cancelToDelete">取消</view>
<view class="confirm-change-password" bindtap="confirmToDelete">确认</view>
</view>
</view>
</view>
</view>
/* pages/dangerlist/dangerlist.wxss */
.dangerlist-wrapper {
width: 100vw;
height: 100vh;
position: relative;
padding-top: 120rpx;
box-sizing: border-box;
}
.btn-to-confirm {
position: absolute;
width: 100%;
height: 100%;
bottom: -100%;
background: #eee;
display: flex;
align-items: center;
justify-content: center;
}
.btn-to-confirm-center {
font-size: 20rpx;
border-radius: 30rpx;
display: flex;
flex-direction: column;
align-items: center;
background-color: white;
padding: 20rpx 0 0 0;
}
.btn-to-confirm-title {
font-size: 45rpx;
color: red;
display: flex;
justify-content: center;
line-height: 45rpx;
padding: 5rpx;
margin: 50rpx auto;
}
.change-password-btns-wrapper {
/* position: absolute;
bottom: 0; */
height: 110rpx;
width: 100%;
background-color: #B3B3B3;
border-radius: 0 0 30rpx 30rpx;
display: flex;
}
.cancel-change-password {
flex-basis: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 46rpx;
background-color: #C1C1C1;
border-radius: 0 0 0 30rpx;
}
.confirm-change-password {
flex-basis: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 46rpx;
border-left: 2rpx solid #000000;
}
button.add-btn {
position: absolute;
right: -20rpx;
top: 20rpx;
width: 180rpx!important;
height: 80rpx!important;
border-radius: 16rpx;
background-color: #090D9C!important;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
padding: 0!important;
transition: all 1s linear;
}
.com-danger-list-scroll {
width: 700rpx;
height: 85vh;
padding: 3rpx;
padding-left: 30rpx;
}
.cur-enter-name {
/* margin: 5vh auto; */
padding: 5vw 5vh;
font-size: 22px;
font-weight: bold;
}
.danger-tools-wrapper {
width: 70vw;
height: 10vh;
margin: 5vh auto;
border: 1px dashed black;
display: flex;
justify-content: flex-start;
align-items: center;
border-radius: 5px;
}
.danger-tools-wrapper button {
background-color: #1d2089!important;
}
.enterprise-dg-item {
width: 600rpx;
height: 80rpx;
display: flex;
justify-content: flex-end;
align-items: center;
padding: 10rpx;
background-color: white;
margin: 20rpx auto;
border-radius: 5px;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee;
}
.hd-name-expert {
width: 350rpx;
line-height: 80rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.hd-name-expoer-to-green {
width: 350rpx;
line-height: 80rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: rgb(0, 128, 0);
}
.hd-tools {
width: 30vw;
display: flex;
flex-direction: column;
justify-content: space-between;
/* align-items: flex-start; */
}
.hd-tools-edit {
text-align: right;
}
.hd-tools-edit button {
color: #1d2089!important;
}
.hd-tools-delete button {
/* background-color: ; */
}
.hd-tools-delete {
text-align: right;
}
.no-hd {
text-align: center;
}
.editBtn {
color: #1d2089!important;
}
// pages/dangerregister/dangerregister.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
// 企业id
companyId: app.globalData.currentEnter.companyId,
// 隐患验收人
hdAcceptancePerson: "",
// 隐患描述
hdDesc: "",
// 检查日期
hdInspectDate: '',
// 检查专家
hdInspectExpert: '',
// 隐患级别 1 2
hdLevel: 1,
// 隐患名称
hdName: '',
// 隐患图片
hdPic: null,
// 隐患整改日期
hdRectificationDate: '',
// 隐患整改图片
hdRectificationPic: null,
// 隐患整改建议
hdRectificationSug: '',
// 隐患状态 0 正在整改 1 整改完毕
hdStatus: 0,
// 隐患预览图片
imgsrcurl: '',
// 整改预览照片
imgrecturl: '',
// 隐患图片文件路径
hdFilePath: '',
// 整改图片文件路径
rectFilePath: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.data.companyId = app.globalData.currentEnter.companyId
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '新增隐患',
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 拍照
*/
takePhoto() {
// const ctx = wx.createCameraContext()
// ctx.takePhoto({
// quality: 'high',
// success: (res) => {
// this.setData({
// imgsrc: res.tempImagePath
// })
// }
// })
wx.chooseImage({
success: (res) => {
this.data.hdFilePath = res.tempFilePaths[0]
wx.getFileSystemManager().readFile({
filePath: res.tempFilePaths[0], // 选择图片返回的相对路径
encoding: 'base64', //编码格式
success: res1 => { // 成功的回调
// console.log('data:image/png;base64, ' + res1.data)
// this.imgsrc = 'data:image/png;base64,' + res1.data
this.setData({
imgsrcurl: 'data:image/png;base64,' + res1.data
})
}
})
// wx.uploadFile()
}
})
},
takePhoto2() {
wx.chooseImage({
success: (res) => {
this.data.rectFilePath = res.tempFilePaths[0]
wx.getFileSystemManager().readFile({
filePath: res.tempFilePaths[0], // 选择图片返回的相对路径
encoding: 'base64', //编码格式
success: res1 => { // 成功的回调
// console.log('data:image/png;base64, ' + res1.data)
// this.imgsrc = 'data:image/png;base64,' + res1.data
this.setData({
imgrecturl: 'data:image/png;base64,' + res1.data
})
}
})
// wx.uploadFile()
}
})
},
// 选择检查日期
selectCheckDate(event) {
this.setData({
hdInspectDate: event.detail.value
})
},
// 输入检查专家
inputHdInspectExpert(event) {
this.data.hdInspectExpert = event.detail.value
},
// 输入隐患名称
inputHdName(event) {
this.data.hdName = event.detail.value
},
// 输入隐患类型
inputHDType(event) {
console.log(event, 'hdTypeInput')
this.data.hdLevel = event.detail.value
},
// 输入整改建议
inputRectSug(event) {
console.log(event, '请输入整改建议')
this.data.hdRectificationSug = event.detail.value
},
// 输入整改日期
inputRectDate(event) {
console.log(event, 'heheh')
this.setData({
hdRectificationDate: event.detail.value
})
},
// 输入验收人
inputHdAcceptancePerson(event) {
this.data.hdAcceptancePerson = event.detail.value
},
// 隐患状态
inputHDStatus(event) {
this.data.hdStatus = event.detail.value;
},
// 提交隐患
submitDanger() {
if (this.data.hdFilePath) {
wx.showLoading({
title: '上传中',
})
let formData = {}
formData = {...this.data}
delete formData.hdPic
delete formData.hdRectificationPic
delete formData.imgsrcurl
delete formData.imgrecturl
delete formData.hdFilePath
delete formData.rectFilePath
if (formData.hdInspectDate) {
formData.hdInspectDate += ' 00:00:00'
} else {
delete formData.hdInspectDate
}
if (formData.hdRectificationDate) {
formData.hdRectificationDate += ' 00:00:00'
} else {
delete formData.hdRectificationDate
}
wx.uploadFile({
filePath: this.data.hdFilePath,
name: 'hdPic',
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
formData: formData,
success: (res) => {
console.log(res, '文件上传')
wx.hideLoading()
if (res.statusCode === 201) {
wx.showToast({
title: '上传成功',
icon: 'success'
})
wx.navigateBack()
// const hdId = JSON.parse(res.data).hdId
// 进行 整改图片编辑
// if (this.data.rectFilePath) {
// wx.uploadFile({
// filePath: this.data.rectFilePath,
// name: 'hdRectificationPic',
// url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
// formData: {
// hdId: hdId,
// companyId: this.data.companyId
// },
// success: (res) => {
// console.log(res, '文件整改')
// }
// })
// }
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
}
},
fail: () => {
wx.hideLoading()
}
})
} else {
wx.showLoading({
title: '上传中'
})
let formData = {}
formData = {...this.data}
delete formData.hdPic
delete formData.hdRectificationPic
delete formData.imgsrcurl
delete formData.imgrecturl
delete formData.hdFilePath
delete formData.rectFilePath
if (formData.hdInspectDate) {
formData.hdInspectDate += ' 00:00:00'
} else {
delete formData.hdInspectDate
}
if (formData.hdRectificationDate) {
formData.hdRectificationDate += ' 00:00:00'
} else {
delete formData.hdRectificationDate
}
wx.request({
url: app.globalData.appBaseUrl + '/api/thHiddenDanger',
method: 'POST',
header: {
'content-type': 'multipart/form-data; boundary=XXX'
},
data: this.formatFormData(formData),
success: (res) => {
console.log(res, '上传成功了吗afhdhsfhhdsfhadsf')
},
fail: () => {},
complete: () => {
wx.hideLoading()
}
})
}
// wx.hideLoading()
},
// 格式化 multipart/formdata
formatFormData(formdata) {
let dataString = '\r\n--XXX'
for (const key in formdata) {
dataString += `\r\nContent-Disposition: form-data; name="${key}"\r\n\r\n${formdata[key]}\r\n--XXX`
}
return dataString
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/dangerregister/dangerregister.wxml-->
<view class="danger-register-wrapper">
<view class="danger-form-wrapper">
<!-- <view class="danger-order">
<text>序号:</text>
<input type="text" disabled="true" />
</view> -->
<view class="danger-check-date">
<text>检查日期:</text>
<picker class="danger-pick-date" mode="date" value="{{hdInspectDate}}" bindchange="selectCheckDate">
<view class="current-picker">
当前选择: {{hdInspectDate}}
</view>
</picker>
</view>
<view class="danger-expert">
<text>检查专家:</text>
<input type="text" placeholder="请输入专家名称" bindinput="inputHdInspectExpert" />
</view>
<view class="danger-name">
<text>隐患名称:</text>
<textarea type="text" placeholder="请输入隐患名称" bindinput="inputHdName" maxlength="-1"/>
</view>
<view class="danger-type">
<text>隐患类型:</text>
<radio-group bindchange="inputHDType">
<radio checked="{{true}}" value="1" color="#1d2089">一般隐患</radio>
<radio checked="{{false}}" value="2" color="#1d2089">重大隐患</radio>
</radio-group>
</view>
<view class="danger-rect">
<text>整改建议:</text>
<textarea maxlength="-1" bindinput="inputRectSug" value="{{}}"></textarea>
</view>
<view class="danger-img">
<text>隐患照片</text>
<!-- <camera device-position="back" flash="off" style="width:100%;height:300px;"></camera> -->
<image mode="aspectFit" src="{{imgsrcurl}}"></image>
<button type="primary" bindtap="takePhoto">拍照</button>
</view>
<!-- <view class="danger-preview">
<text>隐患照片预览:</text>
</view> -->
<view class="danger-rect-date">
<text>整改日期:</text>
<picker class="danger-pick-date" mode="date" bindchange="inputRectDate" value="{{hdRectificationDate}}">
<view class="current-picker">
当前选择: {{hdRectificationDate}}
</view>
</picker>
</view>
<view class="danger-recept-per">
<text>验收人:</text>
<input type="text" placeholder="请输入验收人" value="{{}}" bindinput="inputHdAcceptancePerson" />
</view>
<!-- <view class="rect-img">
<text>整改照片</text>
<button type="primary" bindtap="takePhoto2">拍照</button>
</view>
<view class="rect-preview">
<text>整改照片预览:</text>
<image mode="widthFix" src="{{imgrecturl}}"></image>
</view> -->
<view class="danger-status">
<text>隐患状态:</text>
<radio-group bindchange="inputHDStatus">
<radio checked="{{true}}" value="0" color="#1d2089">正在整改</radio>
<radio checked="{{false}}" value="1" color="#1d2089">整改完毕</radio>
</radio-group>
</view>
<view class="danger-submit">
<button type="primary" bindtap="submitDanger">提交</button>
</view>
</view>
</view>
/* pages/dangerregister/dangerregister.wxss */
.danger-register-wrapper {
width: 100%;
height: 100%;
}
.danger-form-wrapper {
width: 100vw;
margin: 0 auto;
/* background-color: #eee; */
padding-top: 2vh;
padding-bottom: 2vh;
}
.danger-order {
display: flex;
margin: 3vh 2vw;
background-color: white;
padding: 1vh 1vw;
}
.danger-order text {
flex-grow: 0;
flex-shrink: 0;
}
.danger-order input {
flex-grow: 1;
flex-shrink: 0;
}
.danger-check-date {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-check-date .danger-pick-date {
flex: 1;
text-align: right;
}
.danger-expert {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-name {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-type {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-rect {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-img {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-img button {
background-color: #1d2089!important;
}
.danger-preview {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-preview image{
width: 100%;
}
.danger-rect-date {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-recept-per {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.rect-img {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
}
.rect-preview {
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 1vw;
}
.danger-status {
display: flex;
background-color: white;
margin: 3vh 5vw;
justify-content: space-between;
padding: 1vh 2vw;
border-radius: 5px;
box-shadow: 1rpx 1rpx 0.5rpx 0.5rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.danger-submit button {
background-color: #1d2089!important;
}
\ No newline at end of file
import WxCanvas from './wx-canvas';
import * as echarts from './echarts';
let ctx;
function compareVersion(v1, v2) {
v1 = v1.split('.')
v2 = v2.split('.')
const len = Math.max(v1.length, v2.length)
while (v1.length < len) {
v1.push('0')
}
while (v2.length < len) {
v2.push('0')
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i])
const num2 = parseInt(v2[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
Component({
properties: {
canvasId: {
type: String,
value: 'ec-canvas'
},
ec: {
type: Object
},
forceUseOldCanvas: {
type: Boolean,
value: false
}
},
data: {
isUseNewCanvas: false
},
ready: function () {
// Disable prograssive because drawImage doesn't support DOM as parameter
// See https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html
echarts.registerPreprocessor(option => {
if (option && option.series) {
if (option.series.length > 0) {
option.series.forEach(series => {
series.progressive = 0;
});
}
else if (typeof option.series === 'object') {
option.series.progressive = 0;
}
}
});
if (!this.data.ec) {
console.warn('组件需绑定 ec 变量,例:<ec-canvas id="mychart-dom-bar" '
+ 'canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>');
return;
}
if (!this.data.ec.lazyLoad) {
this.init();
}
},
methods: {
init: function (callback) {
const version = wx.getSystemInfoSync().SDKVersion
const canUseNewCanvas = compareVersion(version, '2.9.0') >= 0;
const forceUseOldCanvas = this.data.forceUseOldCanvas;
const isUseNewCanvas = canUseNewCanvas && !forceUseOldCanvas;
this.setData({ isUseNewCanvas });
if (forceUseOldCanvas && canUseNewCanvas) {
console.warn('开发者强制使用旧canvas,建议关闭');
}
if (isUseNewCanvas) {
// console.log('微信基础库版本大于2.9.0,开始使用<canvas type="2d"/>');
// 2.9.0 可以使用 <canvas type="2d"></canvas>
this.initByNewWay(callback);
} else {
const isValid = compareVersion(version, '1.9.91') >= 0
if (!isValid) {
console.error('微信基础库版本过低,需大于等于 1.9.91。'
+ '参见:https://github.com/ecomfe/echarts-for-weixin'
+ '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82');
return;
} else {
console.warn('建议将微信基础库调整大于等于2.9.0版本。升级后绘图将有更好性能');
this.initByOldWay(callback);
}
}
},
initByOldWay(callback) {
// 1.9.91 <= version < 2.9.0:原来的方式初始化
ctx = wx.createCanvasContext(this.data.canvasId, this);
const canvas = new WxCanvas(ctx, this.data.canvasId, false);
echarts.setCanvasCreator(() => {
return canvas;
});
// const canvasDpr = wx.getSystemInfoSync().pixelRatio // 微信旧的canvas不能传入dpr
const canvasDpr = 1
var query = wx.createSelectorQuery().in(this);
query.select('.ec-canvas').boundingClientRect(res => {
if (typeof callback === 'function') {
this.chart = callback(canvas, res.width, res.height, canvasDpr);
}
else if (this.data.ec && typeof this.data.ec.onInit === 'function') {
this.chart = this.data.ec.onInit(canvas, res.width, res.height, canvasDpr);
}
else {
this.triggerEvent('init', {
canvas: canvas,
width: res.width,
height: res.height,
canvasDpr: canvasDpr // 增加了dpr,可方便外面echarts.init
});
}
}).exec();
},
initByNewWay(callback) {
// version >= 2.9.0:使用新的方式初始化
const query = wx.createSelectorQuery().in(this)
query
.select('.ec-canvas')
.fields({ node: true, size: true })
.exec(res => {
const canvasNode = res[0].node
this.canvasNode = canvasNode
const canvasDpr = wx.getSystemInfoSync().pixelRatio
const canvasWidth = res[0].width
const canvasHeight = res[0].height
const ctx = canvasNode.getContext('2d')
const canvas = new WxCanvas(ctx, this.data.canvasId, true, canvasNode)
echarts.setCanvasCreator(() => {
return canvas
})
if (typeof callback === 'function') {
this.chart = callback(canvas, canvasWidth, canvasHeight, canvasDpr)
} else if (this.data.ec && typeof this.data.ec.onInit === 'function') {
this.chart = this.data.ec.onInit(canvas, canvasWidth, canvasHeight, canvasDpr)
} else {
this.triggerEvent('init', {
canvas: canvas,
width: canvasWidth,
height: canvasHeight,
dpr: canvasDpr
})
}
})
},
canvasToTempFilePath(opt) {
if (this.data.isUseNewCanvas) {
// 新版
const query = wx.createSelectorQuery().in(this)
query
.select('.ec-canvas')
.fields({ node: true, size: true })
.exec(res => {
const canvasNode = res[0].node
opt.canvas = canvasNode
wx.canvasToTempFilePath(opt)
})
} else {
// 旧的
if (!opt.canvasId) {
opt.canvasId = this.data.canvasId;
}
ctx.draw(true, () => {
wx.canvasToTempFilePath(opt, this);
});
}
},
touchStart(e) {
if (this.chart && e.touches.length > 0) {
var touch = e.touches[0];
var handler = this.chart.getZr().handler;
handler.dispatch('mousedown', {
zrX: touch.x,
zrY: touch.y
});
handler.dispatch('mousemove', {
zrX: touch.x,
zrY: touch.y
});
handler.processGesture(wrapTouch(e), 'start');
}
},
touchMove(e) {
if (this.chart && e.touches.length > 0) {
var touch = e.touches[0];
var handler = this.chart.getZr().handler;
handler.dispatch('mousemove', {
zrX: touch.x,
zrY: touch.y
});
handler.processGesture(wrapTouch(e), 'change');
}
},
touchEnd(e) {
if (this.chart) {
const touch = e.changedTouches ? e.changedTouches[0] : {};
var handler = this.chart.getZr().handler;
handler.dispatch('mouseup', {
zrX: touch.x,
zrY: touch.y
});
handler.dispatch('click', {
zrX: touch.x,
zrY: touch.y
});
handler.processGesture(wrapTouch(e), 'end');
}
}
}
});
function wrapTouch(event) {
for (let i = 0; i < event.touches.length; ++i) {
const touch = event.touches[i];
touch.offsetX = touch.x;
touch.offsetY = touch.y;
}
return event;
}
{
"component": true,
"usingComponents": {}
}
\ No newline at end of file
<!-- 新的:接口对其了H5 -->
<canvas wx:if="{{isUseNewCanvas}}" type="2d" class="ec-canvas" canvas-id="{{ canvasId }}" bindinit="init" bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}"></canvas>
<!-- 旧的 -->
<canvas wx:else class="ec-canvas" canvas-id="{{ canvasId }}" bindinit="init" bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}"></canvas>
.ec-canvas {
width: 100%;
height: 100%;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
export default class WxCanvas {
constructor(ctx, canvasId, isNew, canvasNode) {
this.ctx = ctx;
this.canvasId = canvasId;
this.chart = null;
this.isNew = isNew
if (isNew) {
this.canvasNode = canvasNode;
}
else {
this._initStyle(ctx);
}
// this._initCanvas(zrender, ctx);
this._initEvent();
}
getContext(contextType) {
if (contextType === '2d') {
return this.ctx;
}
}
// canvasToTempFilePath(opt) {
// if (!opt.canvasId) {
// opt.canvasId = this.canvasId;
// }
// return wx.canvasToTempFilePath(opt, this);
// }
setChart(chart) {
this.chart = chart;
}
attachEvent() {
// noop
}
detachEvent() {
// noop
}
_initCanvas(zrender, ctx) {
zrender.util.getContext = function () {
return ctx;
};
zrender.util.$override('measureText', function (text, font) {
ctx.font = font || '12px sans-serif';
return ctx.measureText(text);
});
}
_initStyle(ctx) {
ctx.createRadialGradient = () => {
return ctx.createCircularGradient(arguments);
};
}
_initEvent() {
this.event = {};
const eventNames = [{
wxName: 'touchStart',
ecName: 'mousedown'
}, {
wxName: 'touchMove',
ecName: 'mousemove'
}, {
wxName: 'touchEnd',
ecName: 'mouseup'
}, {
wxName: 'touchEnd',
ecName: 'click'
}];
eventNames.forEach(name => {
this.event[name.wxName] = e => {
const touch = e.touches[0];
this.chart.getZr().handler.dispatch(name.ecName, {
zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
zrY: name.wxName === 'tap' ? touch.clientY : touch.y
});
};
});
}
set width(w) {
if (this.canvasNode) this.canvasNode.width = w
}
set height(h) {
if (this.canvasNode) this.canvasNode.height = h
}
get width() {
if (this.canvasNode)
return this.canvasNode.width
return 0
}
get height() {
if (this.canvasNode)
return this.canvasNode.height
return 0
}
}
const app = getApp()
// pages/enterprise/enterprises.js
Page({
/**
* 页面的初始数据
*/
data: {
enterprises: [],
inputEnterName: '',
orienterprises: [],
animationope: {},
enternameUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAATBJREFUWEdjZBhgwDjA9jMMPgf49b6vZ/j/v4GSkPn3/6/jllLRA8SYgRECMAcYKnC8IMYAdDXnH/yQoIoDcjwESbb/ybvfDBtOfWEYdQDVQgAUpKfv/ECJClMVDjAflzgoCv4zMOBMgIyMjAc2FQs2wgzFmQhBaYDaDmBkYHBgYGRsINoBpKZCQonQr+fd/1EHkBQCoCAlFSCXA7497/aD9G8uEXIE0SRHASxOkR0RYMYD5oIswiUOy4ZUccCzd39RLJISYgbzcYlTNQRIDX70XEBxCAx5B6B7gKxESE5RTNVEiC+10zwXDPk0MJoLKM4FlKaBoeMAcFMcGfz/32CsxPGe1BAAqT9774cgqMrFqhfU30CSA7WMwE0yanRGSHYstGk2+LpmJPuEQg0DHgIApKUsP22DHJIAAAAASUVORK5CYII=',
enterImgUrl: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
animationSearch: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '企业列表'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
wx.showLoading({
title: '正在获取企业信息',
})
// 验证获取企业信息
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany',
method: 'GET',
data: {
page: 0,
size: 50,
companyName: '威海',
sort: 'companyId,desc',
animationsearch: {},
animationlist: {}
},
success: (res) => {
if (res.statusCode === 200) {
console.log(res.data.content)
this.setData({
enterprises: [...res.data.content]
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
}
wx.hideLoading()
},
fail: () => {
wx.hideLoading()
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
// this.animate1.top('50%').scale(0.9).step()
// this.animate2.opacity(0).step()
// this.setData({
// animationsearch: this.animate1.export(),
// animationlist: this.animate2.export()
// })
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 输入企业信息
*/
enterNameInput(event) {
this.inputEnterName = event.detail.value
},
/**
* 触摸面板 搜索企业信息
*/
enterNameConfirm(event) {
wx.showLoading({
title: '正在获取企业信息',
})
// 验证获取企业信息
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany',
method: 'GET',
data: {
page: 0,
size: 50,
companyName: this.inputEnterName,
sort: 'companyId,desc'
},
success: (res) => {
if (res.statusCode === 200) {
this.setData({
enterprises: [...res.data.content]
})
} else if (res.statusCode === 401) {
wx.redirectTo({
url: '/pages/login/login',
})
} else {
}
wx.hideLoading()
},
fail: () => {
wx.hideLoading()
}
})
},
focusInputName(event) {
let repheight = 0
wx.getSystemInfoAsync({
success: (result) => {
repheight = result.windowHeight
},
})
this.repheight = repheight
console.log(this.repheight, 'this.repheight')
// animationsearch
//animationlist
const repAnimation = wx.createAnimation({
duration: 40,
timingFunction: 'linear'
})
this.animate1 = repAnimation
// repAnimation.translateY(-repheight/2 + 'px').scale(1).step()
repAnimation.top(0).scale(1.0).step()
this.setData({
animationsearch: repAnimation.export()
})
const tempAnimation = wx.createAnimation({
durartion: 400,
timingFunction: 'linear'
})
this.animate2 = tempAnimation
tempAnimation.opacity(1).step()
this.setData({
animationlist: tempAnimation.export()
})
},
blurInputName(event) {
},
/**
* 隐患管理
*/
dgregister(event) {
// app.globalData.currentEnter.index = event.target.dataset.index
// wx.navigateTo({
// url: '/pages/dangerregister/dangerregister',
// success: function(event) {
// }
// })
// app.globalData.currentEnter = {...this.enterprises[event.target.dataset.index]}
console.log(event.target.dataset.index, 'sssssssssssss')
app.globalData.currentEnter = {... this.data.enterprises[event.target.dataset.index]}
wx.navigateTo({
url: '/pages/dangerlist/dangerlist',
success: function(event) {
}
})
},
/**
* 风险管理
*/
dgrisk: function(event) {
},
/**
* 企业触摸触发
*/
comTouchStart(event) {
this.curComIndex = event.target.dataset.index
this.timestart = new Date().getMilliseconds()
},
comTap(event) {
if (this.curComIndex === event.target.dataset.index) {
console.log('这里执行了吗');
this.timeend = new Date().getMilliseconds()
console.log(this.timeend)
console.log(this.timestart)
if (this.timeend - this.timestart > 50) {
console.log('这里执行了吗');
}
}
},
/**
* 触摸离开
*/
comTouchEnd(event) {
console.log(event, 'ehehehhe')
if (this.curComIndex === event.target.dataset.index) {
console.log('这里执行了吗');
this.timeend = new Date().getMilliseconds()
console.log(this.timeend)
console.log(this.timestart)
if (Math.abs(this.timeend - this.timestart) > 300) {
console.log('这里执行了吗');
const repAnimation = wx.createAnimation({
duration: 400,
timingFunction: 'linear'
})
this.tempAnimate = repAnimation
repAnimation.translateY('0rpx').step()
this.setData({
animationope: repAnimation.export()
})
}
}
},
comLongTouch(event) {
this.curComIndex = event.target.dataset.index
const repAnimation = wx.createAnimation({
duration: 200,
timingFunction: 'linear'
})
this.tempAnimate = repAnimation
repAnimation.translateY('0rpx').step()
this.setData({
animationope: repAnimation.export()
})
},
removeanimate() {
this.tempAnimate.translateY('100%').step()
this.setData({
animationope: this.tempAnimate.export()
})
},
searchInputFocus(event) {
const repAnimation = wx.createAnimation({
duration: 50,
timingFunction: 'step-start'
})
this.repAnimation = repAnimation
repAnimation.width('100%').step()
this.setData({
animationSearch: repAnimation.export()
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/enterprise/enterprises.wxml-->
<view class="enterprises-wrapper">
<scroll-view animation="{{animationlist}}" scroll-y="true" class="scroll-view">
<view wx:for="{{enterprises}}" class="enterprise-line" wx:key="companyId" data-index="{{index}}"
bindtap="dgregister">
<view class="company-name" data-index="{{index}}" >
<image class="enternameimg" data-index="{{index}}" src="{{enternameUrl}}"></image>
{{item.companyName}}
</view>
<view class="company-per" data-index="{{index}}" >
企业负责人: {{item.companyChargePer}}
</view>
<view class="compnay-tel" data-index="{{index}}" >
企业负责人联系方式: {{item.companyChargeTel}}
</view>
<!-- <view class="company-name-per">
<view class="enterprise-name">{{item.companyName}}</view>
<!-- <view class="enterprise-per">{{item.companyChargePer}}</view> -->
<!-- <view class="company-btn-to-hd">
<view class="enterprise-btn1"><button class="enterprise-btn11" type="primary" size="mini" bindtap="dgregister" data-index="{{index}}">隐患管理</button></view>
</view> -->
</view>
</scroll-view>
<view class="search-wrapper">
<input type="text" class="enter-name-input" placeholder="请输入企业名称"
confirm-type="search"
bindconfirm="enterNameConfirm"
bindinput="enterNameInput"
bindfocus="focusInputName"
bindblur="blurInputName"
animation="{{animationSearch}}"
bindfocus="searchInputFocus">
<image class="enter-img" src="{{enterImgUrl}}" alt="error"></image>
</input>
</view>
<view class="enter-operate" animation="{{animationope}}" bindtap="removeanimate">
<view class="mask-operate"></view>
<view class="operate-btn" bindtap="dgregister">隐患管理</view>
</view>
</view>
/* pages/enterprise/enterprises.wxss */
.enterprises-wrapper {
width: 100vw;
height: 100vh;
overflow: hidden;
position: relative;
}
.search-wrapper {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 710rpx;
height: 68rpx;
background-color: #F4F4F5;
border-radius: 34rpx;
overflow: hidden;
position: absolute;
left: 20rpx;
/* top: 50%; */
top: 70rpx;
transform: translateY(-50%);
}
.search-wrapper .enter-name-input {
/* width: 100%; */
width: 230rpx;
border-radius: 34rpx;
height: 100%;
position: relative;
padding-left: 70rpx;
background-color: #F4F4F5;
}
.search-wrapper .enter-name-input::placeholder {
color: red;
}
.search-wrapper .enter-img {
position: absolute;
left: 6rpx;
bottom: 4rpx;
width: 60rpx;
height: 60rpx;
}
.search-wrapper .btn-search {
background-color: #1d2089;
}
.scroll-view {
opacity: 1;
position: absolute;
left: 0;
top: 160rpx;
right: 0;
bottom: 0;
}
.enterprise-line {
width: 90vw;
min-height: 100rpx;
margin: 20rpx auto;
padding: 10rpx 20rpx;
background-color: white;
/* display: flex;
justify-content: space-between; */
border-radius: 5px;
box-shadow: 1rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 0.5rpx 0.5rpx #eee;
}
.company-name {
font-size: 36rpx;
line-height: 29rpx;
height: 50rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.company-per {
margin-top: 15rpx;
padding: 10rpx 20rpx;
padding-left: 52rpx;
font-size: 24rpx;
line-height: 24rpx;
color: #666666;
}
.compnay-tel {
padding: 10rpx 20rpx;
padding-left: 52rpx;
font-size: 24rpx;
line-height: 24rpx;
color: #666666;
}
.enternameimg {
width: 45rpx;
height: 45rpx;
position: relative;
transform: translateY(6rpx);
}
.company-btn-to-hd {
text-align: right;
width: 30vw;
flex-grow: 0;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: flex-end;
}
.enterprise-btn11 {
background: #1d2089!important;
}
.enter-operate {
position: absolute;
width: 100vw;
height: 100vh;
/* display: flex;
flex-direction: column;
justify-content: flex-end; */
transform: translateY(100%);
}
.mask-operate {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
flex: 1;
background-color: rgba(0,0,0, .1);
}
.operate-btn {
height: 80rpx;
color: #1d2089;
background-color: #eee;
text-align: center;
width: 100%;
line-height: 80rpx;
position: absolute;
right: 0;
left: 0;
bottom: 0rpx;
}
// pages/evaluate/evaluate.js
Page({
/**
* 页面的初始数据
*/
data: {
grayStar: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAuhJREFUWEftlz1oFEEUx9/LWuhZWRmwEMRYeFh4++bYVJpGEWPjFwliIYKNgpUaMaIgBNTKj0YEEQsTNWChgrGKndmZ4YIBJUI8UqnVgZgi3m6eTLiDy3l7s9mRGMSBhWXnvff/8Z83c3MIq2zgKuOBfw9Ia70VAG4z8w9mHhBCfHZx3dkhrfVdZj5tIBDxge/7J/8a0MTExDbP86YbARYWFnYXi8W3WaGcHFJKDQHAxSbxZ0R0dMWBwjDs7Ojo+NJKmJl7hBDjWaAyO6S1vsLMVxOAXgsh9q0YkFIqBwBz7QSzupTJoXbuNECOE1HPcl1KBVQul9dWKpUtzLz4AMCtlEIDzDwDADNxHM8EQfDdlvcbkNa614giohGuA5j3dbZilvmImc2huQhoHgNbLBZfNOYtAZJS3kPEU47Cy01/SEQn6klLgJRSTwHgyHIrOsZrIqKWQFLKw4g4DABrHEXSpptl7BdCjLYEMh/DMDzged4wM69PWzVLHCLOxXHc37aH6oWVUnsAYAQANmQRS5FTAYA+InrTHJu47cMw3IWII4jYmUIgdQgzf2XmvqQf4LbnkNY6YGbj1ObUiu0DZxGxz/f9d0lh1oNRSrnTLB8ibnOBYuZPZpmEEKV2daxAJrnWU2MuQACwt1XPpO6hxkCllLnzmLtP5sHMF4QQN2wFUjmktR5l5kO2Ypb5x0R0zFYjFZCUctq1hxDxg+/7+T8CpJRiW6E080RkNcAaoJTaAQDv0wjaYqrV6vbu7u6PTrtMSnkcER9ZxK4hYpx0pa3n1s6gJ65A1xHxfKsizHwzl8sN5vP5n7XjIYeI55LAEHHI9/1LTkBKqZcAsL+pyJ0oigaTboBTU1Mb5+fnzwDAYFPeKyLqdQKSUjY6dD+KostBEHyz9YuZL5VKXXEcm3+1Z2vxz4nooBPQ5OTkpmq12uV5XrlQKMymAWmOUUoVACAAgDEiMtfXxGHdZVkAXHL+A9ncW3UO/QKKjCQ0t+MyGQAAAABJRU5ErkJggg==',
yelloStar: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAyFJREFUWEftlj9oE2EYxp83aXMXdXEQCw5CsB0sDopDF8mlFUWti/9IESHttUWo4KRWrCgIBXXSuoi5VgVttAUHFayDubMgHRTBQVFIpZM6CdrS5Ei+V65ajW2S73ontYi3HOR73uf58X7fd3kJS+yhJcaDfw+I0/o6m3AZwCQHuVvd0j/up+u+O2Rb7VeYucuBIKA/pBn6XwPKjnbUUUG8LQYQQmjhxgHLK5SvDuVMvRfAyTnhQ4pmHFh0IE4namwKfigVLJhi4VjS9ALluUM5q+0MmM6WCmXGIzVm7Fg0IH7eucyeLExVCvTaJU8dqtSdWUgCzJBmxBbaJVdAnE6odpAiQaqKiAJHGHzJVRCjGxAZCgQy1VPZDO289UVWNw8oP9rR7ISCOMKMCIAIEUWYOSwzq7ROoLwAjwOcAVNm5k2UUTXjfnHdb0BZs+0qgTr9BC+0loDrIc1oLdrqXxY5U78LYP9CTX3pCS+UqLG5NFC6dR9RcJDBVb5CXBY728hcaFFiA8MlgZwfs6a+OwAMMrDcpa8nGQFTAmipeIZmnbNW2zZiSgFY6SlNXvSZieNqtP/xXGnZaz/9pDVKAUoRqEbu717B4I8sOF7uD7jid8hOtzcIcIoIa91HllcyYyIAiodiybFyKumH0bb0jYKRIqDODxQD7wKEeChqvKz8vXKR8uNMjbiQlpVwgberTfPPjOszVCzMmboz8zizj/dH4ITSaFyQGUi3zDHIWfowGHtlZpL124pmHJR5uAMydWdM9XWGALxWNKP+TwGxzMjNuqIZ0gZIBTkrsQEcfOUmUKohWq9Ek2983TLb1A8xcLNimOBzCKJQbqT9WcsUV2LJO76AsqZ+noDjpU34YmjV1x6qH7Kd9ZnRdip/rDwY9Spa8pQvoJylPwBjV7EJgfqq1XAPNfSVnAB5rH21Pc1HQOgprmPGQzVmNPsCKu4QAdfsPJ1esTX5SXpenMnBStQGEOxixtHver6naP17fAHxs8Nrsrl8LQS/DzcZE25A5mrsp62bIAINopAfUZtuZHwBeQHwUyO99n7MvdT+B5J17Rt8DiM07n1e9QAAAABJRU5ErkJggg==',
headPotraitPic: 'data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAQ4BDgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2uiiivOPpwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBKKUdarz3ltbozT3EMYHdnAosTzIsUVg3ni/w/af6/VrUeoVwx/SsO8+KXhi2Yg3ry4/55xk00hc6O6pK8ruPjdo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rwzqVzuwyQsF/wB48CvmbB3FmJJY5JNKlHqFR6B06CgU6iuhIxCigUVWw9gooooAKKKKAGkZFdV8NNefQ9diDOfs9yRHID0Hoa5eruhadPqmqW9raKWd3Gcfwj1rOSuhwZ9QRuHVXBBB5GO9PNVrGH7PaQxE5KKFJ9wKsL901xHTFhRRRQUFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAp6np9tqVnJbXkayROMEMOn0968D8deE7nw5fMyoZLFz+7lH8j719EVU1PT7fUrOS1vI1kideh/mPerhNxeplKB8sg9adXTeOvCNx4cvmaMb7GQ5jk9B6GuYWuta6mDVmLR0oopiRCrmK5jmBIZWDDHsc19VaJci90ayuc7i8K5+uK+Vpl+Q+or6S+G0nm+CNMOc4TGT7Gsaq0NoHQvGJoZYGA2yKVIPuDXytfwG11a9tzx5crL+RNfVsJ2uDXzX8Q4RbeNtTA4VpN351NDqOojoPgbffY/HUMTHC3UbRn+Yr6WHevk74bsR430jacZm/SvrEdTWsx4fqh1FAoqDqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACgdDRQKBGT4sk8rwxq7/3bOT/0E18cnBcMOhGf1r7D8YRGfwtrESnBa0kA/BDXx8y4Qj0GK1gclbdHqHwIt92p6jOP4IgteyKc8V5D8AZFFxqqE8lFH616/naa5Kq1Kp7HnfxuujB4YggAGZ5gG/CvEF5/CvZPj2P+JLpp7ef/AErxpeRW9FaGc2PooorYzCiiigYUUUUAFFHHen2kMt3dw2tvGZJpCAqikBLpVjdarqCWdlEXldsDjge5r37wR4Rt/DVmpwHvXH7yQj9Kb8PfCcPhvTg8iiS+lG6R/T2FdYTuzXLUqX0RvThpdiUUUViWFFFFBQUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooCxR1bTbfVLKS1vEDxOMcjp9Pevnrxj4cuPDepvBJloGJ8uT+8K+k6wfGPhuDxHpE1tJhZwCYn9D/wDXrWlPldmZTh1Pm1TmlqxqdjPpd5La3UZSWNip96rLXSc6Y2QZQgV9GfC4bPAunKeu3P4V87dfl/D8a+l/B9mbLwzp0J6iFcj3rGq9DWmbAbmvnL4nsJPGeoMP7+K+jFHNfMvjK4+1eJtSlz96ZvyqaS1KqPQs/DhGbxppIwzbZxgD0r63Xoa+V/gtbPeeP7JQTtjy5P0r6pXqa2kPD9RRRQKKg6gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooEVdTgN1p13ApwZYXQH6givjS8iaG5uInBVkcqc98GvtQcnFfLHxY0Y6N4zvU6pcH7Sv0b/wCvmtYHPWXUvfA27EPiyS2c4+0QNt+q817sRnivlvwxqB0nxDYXyMR5Ugz9Dwa+oY5UnhjmQgo6hgR7iueqrsimzjPjFYfbPBNxIq7pLeVJR7Dof518/wAXIr6tv7VLzTbi1nGY5VKsD7jFfMWs6ZNpGrXdjcD54ZCBnuM8Gqoy6BJFOiiitzIKKKKYBR+NFNPek3YSDG44HXsK9y+GHgtdJtk1O/XN7InyKw+4p/rXJ/CjwcNTn/tS/T/RYj+6U/xEd69txhTzx2rnqVG9EbQjrcbRRSVz2NkhaKKKBhRRRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPPPix4S/tey/tGzUfbIB84A++v8AjXiRypIIwRxX1eQCCDjpjB7ivBfip4abR9ZN3bR4srkluOit3Fb0Z9GYTglqjE8C6dFqniiwt7hwsRk3NnvjnFfSwVUAVeFUYAr5W066eyvYbmPIeJgyn+Yr6X8NatDrekQXlu3DDDD+6e4orJhB2DxDeLp+iXt2zbRFET+OMCvmGR/OkkkY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/OtTvXM1Z2OmOquLRRRSGFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKABaiuYEubeWGYBopFKsD71LRTi7CaufMnivSH0TXLmzKnYjEofUHpXXfAzxAdH8R/YpXxbXvy89m7Vt/HLSTJY2upwL/AKsmOTA5weleRW0720iTRkiSMhlI7EHIrqg7o578sj7VBzSisHwRrC674asb5W3NJGA/+8Otb9I64u6EooopFhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXh/wC0ZrjAadokDcZFxP6eij+Zr252CIzN91Rk/Svkbx3rJ13xTqF91jMhWLn+BeB/KqiYVXZGNbQvc3EUMQy8jBFHuTivTbL4Ry/bIxfXwFsvLBF5PtWP8HtKF/4lW5kXMVoC/sW7GvdxWdWdtEY04p6shsbeKzs4baBQscahVAGKnooHesNzoQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGd4i01NW0W7snAPmpgf73avmK9ga2nlt5QVdGKkH1r6urwL4xaUNP8VGeMARXS7xj171tRl0MKkdbnc/s8a4WW90aQ/Kg86LJ/Aiva6+RfAerSaJ4o0+7UkJ5gSTnHB4r63iYPGrDowBFas0oyurMfRRRUnQFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUCgDkvihrH9i+Cd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QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFA6GgBrsEjZm+6ASa+MtYnNzrmozn/lpO7fqa+v/EE62uhalcSfcjgcn/vk18aKcySkdAe/6VcTlrPoevfAi1/datdf7Sxflz/WvVfWuB+CkHk+FppQMLLcNgfTj+ld+Dmuaq7ysOlsFFIOhpazNAooopgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVk+IfEOnaBbiXUpvL3cIg5L/AEFFm9hNpbmtRXI6V8Q9A1BvLF35MmcYmUr+tdTb3ENxGHgnilQ942DD9Kbi0SpJ7EtFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKa7Kis0jBVHcnArlPEPj/RNIZolnN3cqD8kQz+Z6Cmot7EuaR1tVbvUbOz/AOPu7ghyMje4Xj8a8Q8QfE/W9QZk04pp8J7qNzf99dvwriLy6u7ovLeTtO5OSznJNaqi2Zusj6tt5Yp4Vlt5FkjboynINPryT4D3d9IuoQTbmtVVWUt2Y8YFet1nKPK7Fwd9QoooqSwooooAKKKKACiiigBR1r59+LkPleNrxsYEiq4+mK+ghXh/xsQjxPE5Bw0CgHHBrWluY1dil8FZvJ8f2XON4ZT78V9RA18l/DKVovG+ksP+eoX86+ta2kXQ2CiiipOgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKB3ooFAHM/EiUQeBtbfv9ldM/Wvk1OGOe5zX1H8ZHC/DvVh/E2xfzYV8tkneSOtaROOrufQXwkhMfge0LdXd3H4k/wD167Bfumuc+HEYj8D6Quc5hz+pro1+6a457s1p/CFFFFIoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8Y+OGm3v9sW2oIrGz8ry+OQrDOfzr2emXMEVxE0U8aSIwwVddyn6irhLldyJx5lY+Tm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KKKKACiiigAooooASpbVtkwJ6Hio6VBlsDrWdWKlBpji9TbtHEdzG56A11kbBlBHIIrjU+7XQaJdeZGY26qOPevk8TTvqjLF021zGsOlApBS1wHnFa8hE9u8Z7iuYiZra4yeCprrhWPrFgXJmhA3dwO9dNGaXuvY68NVSvCWzNO1nSePch57ipVrkIpZYX+VnQira6ncbMMwJHenKhd6McsI27xeh0nFZ+o6gsCFY2BfHQHpWJJezyDDyH8DioANxyaulh3c0p4OzvIWSR5ZGZzkmpol2rTI0AOTzU3avVo0eXVnW7JWQlV9QuBaWU9w7ALFGznJ44GasV518bfEI0zw01jEf3158uR2Xvmu6lBykkYzdkfPurXr6hql3dOSTNKzj6Zr1n9m/TPMudS1FlBCfuwT1zXjMQO7AGT0A96+pPg9oTaF4Oto5lCz3B86Qe5/+tXtLRGEFeVztqKKKk7AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBOxrx342+Bzdq3iDTUzcRgLcRKPvKP4/qOhr2KmSxLNE6SKGRgVYHuKaZnOKkj4qVSkwdDhlbIPcEV7p8LvGK61Z/2feyf6fAMAt/GnauK+K/gd/DmqyXtnGTpdw5ZTj/AFbd1NcPpt3Np91HdWrlJYyCrA9eabipI5U3Bn1WtFcz4E8UweJdMD5CXcfyyx55+o/SulrlcXF6m8ZKSFooopFBRRRQAUUUUAFS2bbbhCfXFRUA4OR1FS1dAdHRUNq/mQKxPOKmrz2rOxYUUUUgCiiigAooooAKKKKACiiigAooooAbUF+cW71ZrO1VyFVR3FXSXvEt2M1aKO1Fd8RBRRRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq3Zw4BZx16CmWcQYlmHA6VcBAViTivMxWIv7kDanDqxQwXqalglaNw6HBFZc0m9+tSwT8BX/AANc08G/ZqQ+ZS91naaddC4i/wBodRVwVyFrO8EgeM8j9a6Swu0uUyDhu4rxatHl1PNxFBwd1sWxSYpRRXOzlK8ttFKc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89+K52EfNW14hfEcag8E81jQDL8V62Ag+ZHqYRWp3Lg6U5aaKd619hHY1EoooqhieleafF77lj/vNXplcJ8WLNptGSaMKWifJPcD2rGurwZ04KSjWjc8pt/9cv1FdF2rmlO0gg8iuht5BJCjDnivOgfZU2SUUGha1NgooooAKKKKACiiigAooooABVPUbgRRFAcuafd3IgQgfePTFYkkjSOWY5NZzkloZTqW0Qzkn3NerfDjwybOIahep++kGYx/dX/GuX8BeGZNVu1up1K2kbA8j75HavY4VCRhFAAAxgV04el9pnzuZYu/7uD9SQDilpB0pa7DxAFFAopjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApD0NLRQhM+V/jGMfEjVD6bP/QRTPhQf+K0sv8Adb+Vanx6gRPHksqAL58aMw9wKwvhpOIPGWnZDHcxUY9wf8KuS91nDa0j6NWlpvelriOgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoHHIoopWuC0NOJ1ddwP4VWvI/4xTLJwjkN3q66hkIryJXoVtNjqj78TLop7ptYim4r1ozUldHPJa2EoooqiQooooAKKKKACiiigZ5N8dpVMulwg/MAzkfXivLEUu6oOdxA/HNehfG6YP4htIwR8kAzjsSSf8ACuO8K2hvfEWm2y9ZLhAD+Oa7qatFHLPc+sPDkZh0DTYSD+7t0T8hWj2o+VFVUACgAcCo5JVUVhWrRhdtnZTi7IWVwg96qxI0suxASx6UM29vXNbmj2ZjBkcfMentXzOPxftNiqs1Tj5mjbxCOJV9BUtAorwmePJ3ClpDUU8ghjZmPAFKKu7BFNuyMHW5t91tGMLVW1XqajmfzJXY9zVmIYQV9JllK8r9j2YpQgkSUZoor6MAooooGFZ2tWK6hYT28mdsikVo0nXrQ0mrMItxd0fOF3A1tdTQSKQY2KkHr1q/pE3WMn6V1PxQ0M29yNThAEcmFcDsfWuFgcxtuWvJnFwlY+vwVdVYKSOjoqG1nWeMEfeHUVP1q07nopiUUUUxhRRRQAUU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s5UdGHQ145BM0c6SoSrqwIYcEYq5rmVjjjeMrM+rh0PP/wBelrnfAuvRa7ocM6585AEkVjzkd66KuKSs7G6dwooopDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKcg3NgU2rFouZDWVWfJBsqCuy3FHsQCuh0axEa+bIMuemRWRp8Pn3SIR8vU11kYCptWvlcTWbZliqnKuRCr3pTQKDXAeciKaVIYi8hAArmb+9a6mPB2dFFWdbuvNk8pT8q1Jo1kHbzZBwOgNdcIqnG73O6lBUo88tygllOy5WJqPsVzjiFq6xQBSUvrDF9dl2OQe3kjGZI2A9xUYXBrsmVWGGUEe4rC1u2WFldFAUnBAFaUq3O7M3o4vnlZlOFEIJ4JqYd6r2xAYirVfV4HllTTR0SVmIKWigdDXeSFFFFAwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjtRRQBmeIdKi1nRbuwmC4nQoCwyAexr5Q8VeHr7w7q0tjfxMu3/VyY+Vx6g19gkZ69K4X4r+Co/FejGWHK6nbDdAc/K3sa0izlrQ+0jwrwD4mk8OaoHdibORtsy45x619B2lzFeWsdxburxSKGVh3FfLmpWM+m3clpdJ5dxGdrjtmuw+G3jN9Fvfsmoyyvp8vGQc+U3+FYVafVGdOR7zRTIpFljWSNgyOoZSO4p9YG4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFIAooopgFFFFABRRRQAVbsRy5+lVKu2HR/wAK5cX/AA2aUviNvRP+Pk/Sujrm9E/4+z9K6SvksR8RxYr4wNNY4Rj6DNOpkgzG49RiskcsdzkJDukcnnJrrLWMRwIoHGK5WRDHKVccg11NpKssKlSDx2rqqL3Ud2JTcVbYlqlNqVvFMI2LZPcdqszSCOJmJGAK5V8NK5X+JuPes6dPmTuY4ehzptnXr8y5zkGs/W4w9o5IzjFW7QFbdAeoFRaj/wAeb/SopvlmRT92ojmIvvirtUU4YGrqdK+syuV4tHry7jqKKK9ckKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkxS0lArXPFv2gvDtmlouuQrsu5GEbhfuv749fevDos/w/KMZNfRP7Qn/IoxHv5wr52U/uzjI4rVu8bHHZRbsfTvg6JofDeno7lj5Skk/StntWN4Lcv4W05mJJMK8mtfNcD6mkQooopFBRRRTAKKKKACiiigAooooAKKKha5gUkGeLI7FhRZvYTdiaioftcH/PeL/voUouYScebF/30KVn2FzIlopEIYZDoQfQ5pcj1FOzHzIKKQfpS0DCiiigAooUEg4/nSZwMnAHqTRYVxaKiNzCuQZoff5h/jR9qg/57Q/99CjlbFdEtFU59VsIGAlvLdcjP3xVc+INIX72o2w+sgoSfYfMjUornLvxv4etciTVLdiBuwpzWTP8UfD8cTGM3ErDoqpimoN9BOSO6orzTS/i1Y3Wo+Vc2UtvbH5RKXzj3bivR7W4huYEmgkWSJwCrr3FNxa3BNPYfRRRUlBRRRQAVesejVRq5YsAXB7iuXF3dNpF03Zm3oX/AB9t9K6TFcrp04t7kMeh4NdSjBlyDkGvk68feucmLT57i0UUVgcaMXVrEnMsYz68dayo5poQVR3T2yRXXYHSqz2MEjZaMGuiFXTU7KWJsuWepzb3UzqQ8jEemau6PYmVvNlXEangEdTWqunWynIiX8eatIoVcDoKbrK1kOpiFy2hoKvHFVdR/wCPST6VbHSqOsSeXZv6kYFY01eSOalrNHNL94VdXoapJ98VdXoa+symLs2exIcKKBRXsCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA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CkdT/wCgpB/3zT4PghqRbMmr26gf9M+te7AAdqb3Ip2D2jPLNM+Cmjxx/wDEwvLmWY9fKOB+VdXongHw3pMySwadE0qdJX5J/CunpyrkUIlyYIAqjaNv+yOgpe/WiigncDSUvFHFMaCikPXilQE9altIuFNy2QnNOReadtpVGBUSn2Oqlhne8hwAFH0ozxS1lex3JWAUUUUigooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApMUtFABRRRQAmKTHfFOpMUXJcU9xrRgimCPHSpaB0NWptGToRfQjwaTHFTYppWqVQxeEiyL3pKl2j0o2CnzmcsI+hDjFCjg1MIwQeaZ5RB68U1NGTw0huBR9Kk2e4pPL9xT50P6vOwyinbaAhwaXMiVQl2G0q0u00BcVXMgdGSWwlGKTDf3TRg+hpcyI9nLsFAowfQ0YPoapSSD2cuwYpMUvTqSKPxNHMieV9hMUoAo49aPxo5g5X2Cij8aUD2oUkhqEn0Eopdp9KXYaOZD9nLsNopcH0pEDHtT5kHs5dgopdpp3lmlzxK9jPsMFFO2YpNpqeaLD2M+wtNFP2ml2UcyKWHmRijr0pxQ04LRzIFhpkeaTr0qXyhQIh60udF/VJEeKBmpdopdvtS9oWsI+rIcH3peR0GampQvpS9oWsJFbkKIxHNKIh1JqU0VLqNmkcPCIzYKXFKKdtqbm0YqIlKtJSjoaRQlFFFAwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooATFLRRQAZooooAQUtFFABRRRQAUUUUAJiloooATAowKWigBKKMUYoFZBRRijFAWQYHpRgUYoxTuTyIMD0owPSloo5mHIhMD0paTFGKVx8qFzSUYoxQOyDj0ooxRii4WQYpaKKBhSYpaKAExS0UUAFJilooATFLRRQAmKWiigAozRRQAUmKWigBMUtFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k='
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '学习评价'
})
wx.setNavigationBarColor({
backgroundColor: '#0A0B9F',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/evaluate/evaluate.wxml-->
<view class="evaluate-wrapper">
<view class="card-wrapper">
<view class="nickname-wrapper">相善若水</view>
<view class="nickname-interface">当前用户名称</view>
<view class="person-image-wrapper">
<image class="person-image" src="{{headPotraitPic}}"></image>
</view>
<view class="entry-belong-to">所属企业</view>
<view class="entry-name">威海华发房地产开发有限公司</view>
<view class="study-info">学习情况</view>
<view class="complete-class">完成<span class="complete-degree">2</span>课程/共<span class="complete-degree">10</span>课程</view>
<view class="complete-percent">完成百分比: <span class="complete-degree">20%</span></view>
<view class="evaluate-star">评价: <image class="star-for-evaluate" src="{{yelloStar}}"></image><image class="star-for-evaluate" src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{grayStar}}"></image></view>
<view class="study-info to-top-margin">考试情况</view>
<view class="complete-class">完成<span class="complete-degree">2</span>课程/共<span class="complete-degree">10</span>课程</view>
<view class="complete-percent">完成百分比: <span class="complete-degree">20%</span></view>
<view class="evaluate-star">评价: <image class="star-for-evaluate" src="{{yelloStar}}"></image><image class="star-for-evaluate" src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{yelloStar}}"></image><image class="star-for-evaluate"src="{{grayStar}}"></image></view>
</view>
<view class="bgcolor-cover"></view>
</view>
\ No newline at end of file
.evaluate-wrapper {}
.card-wrapper {
width: 690rpx;
min-height: 740rpx;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
margin: 131rpx auto 0;
position: relative;
box-sizing: border-box;
padding-top: 78rpx;
}
.person-image {
position: absolute;
left: 50%;
top: -70rpx;
transform: translateX(-50%);
width: 142rpx;
height: 143rpx;
border-radius: 10rpx;
overflow: hidden;
}
.person-image {
border-radius: 10rpx;
}
.nickname-wrapper {
font-size: 36rpx;
font-family: 'Adobe Heiti Std';
font-weight: normal;
color: #333333;
text-align: center;
}
.nickname-interface {
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 400;
color: #999999;
text-align: center;
}
.entry-belong-to {
position: relative;
font-size: 34rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 39rpx;
margin: 10rpx 38rpx;
}
.entry-belong-to::before {
content: '';
display: block;
position: absolute;
left: -20rpx;
top: 50%;
width: 11rpx;
height: 29rpx;
background: #090D9C;
transform: translatey(-50%);
}
.entry-name {
margin: 10rpx 38rpx;
font-family: 'PingFang-SC-Medium';
font-size: 30rpx;
padding: 10rpx 0rpx;
}
.study-info {
position: relative;
font-size: 34rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 39rpx;
margin: 10rpx 38rpx;
}
.study-info::before {
content: '';
display: block;
position: absolute;
left: -20rpx;
top: 50%;
width: 11rpx;
height: 29rpx;
background: #090D9C;
transform: translatey(-50%);
}
.complete-percent {
margin: 10rpx 38rpx;
}
.complete-class {
margin-left: 38rpx;
font-family: 'PingFang-SC-Medium';
font-size: 30rpx;
}
.complete-degree {
color: #090D9C;
font-family: 'PingFang-SC-Medium';
font-size: 38rpx;
margin: 0 10rpx;
}
.complete-percent {
margin-left: 38rpx;
}
.evaluate-star {
margin: 10rpx 38rpx;
display: flex;
}
.star-for-evaluate {
width: 41rpx;
height: 39rpx;
}
.to-top-margin {
margin-top: 50rpx;
}
.bgcolor-cover {
position: absolute;
left: 0;
right: 0;
top: 0;
width: 100%;
height: 640rpx;
background-color: #090D9C;
z-index: -1;
border-radius: 0 0 70rpx 70rpx;
}
\ No newline at end of file
// pages/exam/exam.js
Page({
/**
* 页面的初始数据
*/
data: {
searchIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAeCAYAAADU8sWcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3OUEyMURGNjE1M0IxMUVDQTdBRjk3NTlCRkY2MTk5QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3OUEyMURGNzE1M0IxMUVDQTdBRjk3NTlCRkY2MTk5QSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjc5QTIxREY0MTUzQjExRUNBN0FGOTc1OUJGRjYxOTlBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjc5QTIxREY1MTUzQjExRUNBN0FGOTc1OUJGRjYxOTlBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+4+94kQAAAydJREFUeNq8l2tozXEYx885Y4whG5l70lBjm8vcX4iySBpKUW7thcILvNCWXDMrXpGEvOCVkrTSmJI7Iy/mEsXI3Vgzu5TbtjOfR99z+jnOzs7sHE99Or/zP//z/z6/5/f7Pc/z9xYUFHiisNEwHjJhOPSFLvADPsFzqIBHUFVcXNwazUO97YhPgcUwDXo4139CCyRCgnP9A1yFM/C2PSfaEk+G9ZAHXeE73INyeAGfoRm6QxpkwEwYY8+EGjgGJTjg74j4UNgJWdAE5+C0QvuX8fDfn4WFhRaBGbAcJsqJU3CYe76F+68vjPA+Cb+BLfb8toRDnGiB6ww3wiFFZhlslmMRxZNgG6RDJWyCGxDV5nGc+A4nGe5S5BZBfjgHXPF87ehq2AqvPZ0wHLjAx345sMqWAgd84cRHwVKND8JLT2ysBMqgG6zUBv1D3DbGQh2lW3Cxo6GOMHvb6cehAaZCtjt7GwyA6fp+NlbCjgPvNXuzOZpsUDwbhsE7uOuJj11SUsrRxg6KZ2j8UJkrHvZKaXiQQei9AfHBzg3xMsuQVRqnBULvUyo1q4ujuB23Rid1B8MeyL0JcRT3Os/3u+KBGfeLo7iV3z6hEfY5mSw9juK91Ac0qey2BsQrdNGKSUqcxDPlgBWo6kCdN/En8FRhme0mgRjafGmVa6LBsFvqu6zvS9zdGAvjTE9WJ/RVOv7QwlJqbQ+MhBWxmj3CvflYqw1nKbbSba0C4tYWHdXYqs/czjqgArIBxoHl9xPurEPreZnangTV83n/6gDCSeqC8qRxAD6GNpShbdQRLYH9eTusc85ntMLWGxSp6/U51Sw53OF3zTbFHqhXI7gGZqmBvAa16s1CBa1JGAIL1Db1VCEpVQRzraHgvt3MviGavt3WfbWSj4X/C9xXl1OjCmgNyEC9VGQ5KfSKtc4IVSI4ifFe5ZDb1idyvT6al4YUnf1c1f1Ie6BR5/g83EGg2YnMBC1Ff3VLO/i9zhvl61Ki0uNYGAGpzuuSlcpn8FjZy9/GXsjRkqbKgaJoxSO1SR3ZjFlaAmvdbvo8/9Fw9IH5oBxf+0uAAQADzexIIUoooQAAAABJRU5ErkJggg==',
animationSearch: {},
examList: [
{
coverPic: 'http://39.102.232.151:8030/cover/exam1.jpg',
examName: '安全内容考试(一)',
isExamed: true,
score: 80
},
{
coverPic: 'http://39.102.232.151:8030/cover/exam2.jpg',
examName: '安全内容考试(二)',
isExamed: false,
score: 0
}
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '在线考试'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 搜索框focus
*/
searchFocus(event) {
const repAnimation = wx.createAnimation({
duration: 50,
timingFunction: 'step-start'
})
this.repAnimation = repAnimation
repAnimation.translateX('0rpx').width('100%').step()
this.setData({
animationSearch: repAnimation.export()
})
},
/**
* 搜索考试内容
*/
searchExam() {
},
/**
* 跳转到考试试题
*/
LinkToTestPaper() {
wx.navigateTo({
url: '/pages/testpaper/testpaper',
success: function(event) {}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/exam/exam.wxml-->
<view class="exam-total-wrapper">
<view class="search-total-wrapper">
<input type="text" class="search-input"
placeholder="搜索考试课程内容"
confirm-type="search"
animation="{{animationSearch}}"
bindfocus="searchFocus"
bindconfirm="searchExam">
<image class="search-icon-img" src="{{searchIcon}}"></image>
</input>
</view>
<scroll-view scroll-y="true" class="exam-scroll-wrapper">
<view wx:for="{{examList}}" class="exam-list-wrapper">
<image src="{{item.coverPic}}" class="exam-cover"></image>
<view class="down-wrapper">
<view class="down-title">{{item.examName}}</view>
<view class="exam-score-wrapper">
<view class="exam-score" wx:if="{{item.isExamed}}">
已考试: {{item.score}}分
</view>
<view wx:else class="no-exam">还未考试</view>
</view>
<button class="startExamBtn" bindtap="LinkToTestPaper">开始考试</button>
</view>
</view>
</scroll-view>
</view>
\ No newline at end of file
/* pages/exam/exam.wxss */
.exam-total-wrapper {
width: 100vw;
height: 100vh;
box-sizing: border-box;
}
.search-total-wrapper {
width: 711rpx;
height: 67rpx;
margin: 20rpx auto;
background: #F4F4F5;
border-radius: 34rpx;
position: relative;
display: flex;
justify-content: center;
overflow: hidden;
}
.search-input {
width: 290rpx;
height: 67rpx;
box-sizing: border-box;
border-radius: 34rpx;
position: relative;
padding-left: 53rpx;
/* margin: 0 auto; */
/* padding-right: 34rpx; */
}
.search-input::placeholder {
color: #090D9C;
}
.search-icon-img {
position: absolute;
left: 10rpx;
top: 50%;
/* transform: translateY(-50%) scale(1.4); */
transform: translateY(-50%) scale(0.9);
width: 40rpx;
height: 40rpx;
}
.exam-scroll-wrapper {
height: calc(100vh - 110rpx);
}
.exam-list-wrapper {
width: 710rpx;
height: 360rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee;
border-radius: 20rpx;
overflow: hidden;
}
.exam-cover {
width: 710rpx;
height: 290rpx;
border-radius: 20rpx;
}
.down-wrapper {
display: flex;
justify-content: flex-start;
padding: 0 15rpx;
/* align-items: center; */
}
.exam-score-wrapper {
flex: 1;
}
.down-title {
/* flex: 1; */
margin-top: 10rpx;
}
.exam-score-wrapper {
flex: 1;
/* text-align: right; */
display: flex;
justify-content: flex-end;
align-items: center;
margin-right: 10rpx;
}
.exam-score {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: 530;
color: #1DCC24;
line-height: 36rpx;
letter-spacing: 1rpx;
}
.no-exam {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: 530;
color: #999999;
letter-spacing: 1rpx;
}
.startExamBtn {
width: 146rpx!important;
height: 43rpx!important;
background: #090D9C;
border-radius: 8rpx!important;
color: #fff!important;
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: bold;
white-space: nowrap;
padding: 0!important;
margin: 10rpx 0 0 0 !important;
display: flex;
align-items: center;
justify-content: center;
/* line-height: 43rpx!important; */
/* display: flex;
align-items: center; */
}
\ No newline at end of file
// pages/home/home.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
topNavHeight: 40,
// topPersonWidth: 20,
topPersonHeight: 20,
topStatusBar: 20,
personCenterImgSrc: 'http://39.102.232.151:8030/cover/人像icon.png'
// topNavWidth:
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// wx.getSystemInfoAsync({
// success: (result) => {
// console.log(result, 'result result')
// },
// })
console.log(app.globalData.userInfo, 'app.globalData.userInfo')
// tag 企业管理
const sysInfo = wx.getSystemInfoSync()
const rect = wx.getMenuButtonBoundingClientRect()
console.log(sysInfo)
console.log(rect)
let toGetHeight = 0
toGetHeight = (rect.top - sysInfo.statusBarHeight) * 2 + sysInfo.statusBarHeight + rect.height
this.setData({
topNavHeight: toGetHeight,
topPersonHeight: rect.height - 2 * (rect.top - sysInfo.statusBarHeight),
topStatusBar: sysInfo.statusBarHeight
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '安全生产管理平台'
})
wx.setNavigationBarColor({
backgroundColor: '#ffffff',
frontColor: '#000000'
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 跳转到法律法规
*/
linkToLaw() {
wx.navigateTo(
{
url: '/pages/law/law',
success: function(event) {
console.log('跳转成功', event)
}
}
)
},
/**
* 跳转到通知通告
*/
linkToAdvice() {
wx.navigateTo({
url: '/pages/advice/advice',
success: function(event) {
}
})
},
/**
* 跳转到信息推送
*/
linkToInfo() {
wx.navigateTo({
url: '/pages/info/info',
success: function(event) {}
})
},
/**
* 跳转警示教育
*/
LinkToWarn() {
wx.navigateTo({
url: '/pages/warn/warn',
success: function(event) {}
})
},
/**
* 跳转到在线直播
*/
LinkToLive() {
wx.navigateTo({
url: '/pages/live/live',
success: function(event) {}
})
},
/**
* 跳转到在线培训
*/
LinkToTeach() {
wx.navigateTo({
url: '/pages/teach/teach',
success: function(event) {}
})
},
/**
* 跳转到在线考试
*/
LinkToExam() {
wx.navigateTo({
url: '/pages/exam/exam',
success: function(event) {}
})
},
/**
* 跳转到学习评价
*/
LinkToEvaluate() {
wx.navigateTo({
url: '/pages/evaluate/evaluate',
success: function(event) {}
})
},
/**
* 跳转到隐患管理
*/
LinkToHD() {
wx.navigateTo({
url: '/pages/enterprise/enterprise',
success: function(event) {}
})
},
/**
* 跳转到危险作业审批
*/
LinkToHWApproval() {
// wx.navigateTo({
// url: '/pages/hwapproval/hwapproval',
// success: function(event) {}
// })
if (app.globalData.userInfo.tag === '企业员工') {
wx.showToast({
title: '不具备权限',
icon: 'error'
})
return
}
wx.navigateTo({
url: '/pages/hwapprovallist/hwapprovallist',
success: function(event) {}
})
},
/**
* 跳转到企业证书管理
*/
LinkToCertify() {
if (app.globalData.userInfo.tag === '企业员工') {
wx.showToast({
title: '不具备权限',
icon: 'error'
})
return
}
wx.navigateTo({
url: '/pages/certifyenter/certifyenter',
success: function(event) {}
})
},
/**
* 跳转到影像管理
*/
LinkToPortrait() {
// wx.navigateTo({
// url: '/pages/portrait/portrait',
// success: function(event) {}
// })
if (app.globalData.userInfo.tag === '企业员工') {
wx.showToast({
title: '不具备权限',
icon: 'error'
})
return
}
wx.navigateTo({
url: '/pages/trainimgenter/trainimgenter',
success: function(event) {}
})
},
/**
* 跳转到个人中心
*/
LinkToPersonCenter() {
wx.navigateTo({
url: '/pages/person/person',
success: function(event) {}
})
}
})
\ No newline at end of file
{
"usingComponents": {},
"navigationStyle": "custom",
"navigationBarTitleText": "警示教育"
}
\ No newline at end of file
<!--pages/home/home.wxml-->
<view class="home-wrapper">
<view style="height:{{topNavHeight}}px;" class="top-navigation-bar">
<view style="height:{{topStatusBar}}px;"></view>
<view style="height: calc(100% - {{topStatusBar}}px);position: relative;">
<view class="top-navigation-title">安全生产管理平台</view>
<image src="{{personCenterImgSrc}}" style="height: {{topPersonHeight}}px;width: {{topPersonHeight}}px;left: 62rpx;" class="top-navigation-to-person" bindtap="LinkToPersonCenter"></image>
</view>
</view>
<view style="height:{{topNavHeight}}px;"></view>
<view class="row">
<view class="info-card law-wrapper" bindtap="linkToLaw">
<view class="info-card-title">法律法规</view>
<view class="info-card-icon law-icon"></view>
</view>
<view class="info-card info-right advice-wrapper" bindtap="linkToAdvice">
<view class="info-card-title">通知公告</view>
<view class="info-card-icon advice-icon"></view>
</view>
</view>
<view class="row">
<view class="info-card info-wrapper" bindtap="linkToInfo">
<view class="info-card-title">信息推送</view>
<view class="info-card-icon info-icon"></view>
</view>
<view class="info-card info-right warn-wrapper" bindtap="LinkToWarn">
<view class="info-card-title">警示教育</view>
<view class="info-card-icon warn-icon"></view>
</view>
</view>
<view class="row">
<view class="info-card live-wrapper" bindtap="LinkToLive">
<view class="info-card-title">在线直播</view>
<view class="info-card-icon live-icon"></view>
</view>
<view class="info-card info-right teach-wrapper" bindtap="LinkToTeach">
<view class="info-card-title">在线培训</view>
<view class="info-card-icon teach-icon"></view>
</view>
</view>
<view class="row">
<view class="info-card exam-wrapper" bindtap="LinkToExam">
<view class="info-card-title">在线考试</view>
<view class="info-card-icon exam-icon"></view>
</view>
<view class="info-card info-right evaluate-wrapper" bindtap="LinkToEvaluate">
<view class="info-card-title">学习评价</view>
<view class="info-card-icon evaluate-icon"></view>
</view>
</view>
<view class="row">
<view class="info-card hd-wrapper" bindtap="LinkToHD">
<view class="info-card-title">隐患管理</view>
<view class="info-card-icon hd-icon"></view>
</view>
<!-- <view class="info-card info-right person-wrapper" bindtap="LinkToPersonCenter">
<view class="info-card-title">个人中心</view>
<view class="info-card-icon person-icon"></view>
</view> -->
<view class="info-card info-right danger-work-wrapper" bindtap="LinkToHWApproval">
<view class="info-card-title">危险作业备案</view>
<view class="info-card-icon danger-work-icon"></view>
</view>
</view>
<view class="row">
<!-- <view class="info-card danger-work-wrapper" bindtap="LinkToHWApproval">
<view class="info-card-title">危险作业审批</view>
<view class="info-card-icon danger-work-icon"></view>
</view> -->
<view class="info-card person-wrapper" bindtap="LinkToCertify">
<view class="info-card-title">企业证书管理</view>
<view class="info-card-icon certificate-icon"></view>
</view>
<view class="info-card info-right person-wrapper" bindtap="LinkToPortrait">
<view class="info-card-title">培训影像管理</view>
<view class="info-card-icon image-icon"></view>
</view>
</view>
</view>
This source diff could not be displayed because it is too large. You can view the blob instead.
// pages/hwapproval/hwapproval.js
let secureSupervisorContext = null;
let isButtonDown = false;
let sarrx = [];
let sarry = [];
let sarrz = [];
let ssarrx = [];
let ssarry = [];
let ssarrz = [];
let canvasw = 0;
let canvash = 0;
let supervisorContext = null;
wx.getSystemInfo({
success: function (res) {
canvasw = res.windowWidth * 700 / 750; // 设备宽度
canvash = res.windowWidth * 250 / 750;
}
});
Page({
/**
* 页面的初始数据
*/
data: {
unitNamePic: '',
reportDate: '',
reserveDate: '',
secureSupervisorSignDate: '',
supervisorSignDate: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const SelectQuery = wx.createSelectorQuery()
const canvasElement = SelectQuery.select('#toSign')
canvasElement.context(res => {
secureSupervisorContext = res.context
})
const canvasSuperVisor = SelectQuery.select('#toSign2')
canvasSuperVisor.context(res => {
supervisorContext = res.context
})
SelectQuery.exec((res) => {
console.log(res, 'xixixixi')
})
},
canvasIdErrorCallback: function(e) {
console.log(e.detail.errMsg)
},
canvasStartSign: function(event) {
isButtonDown = true;
sarrz.push(0);
sarrx.push(event.changedTouches[0].x);
sarry.push(event.changedTouches[0].y);
},
canvasStartSupervisorSign: function(event) {
isButtonDown = true;
ssarrz.push(0);
ssarrx.push(event.changedTouches[0].x);
ssarry.push(event.changedTouches[0].y)
},
canvasMoveSign: function(event) {
if (isButtonDown) {
sarrz.push(1)
sarrx.push(event.changedTouches[0].x);
sarry.push(event.changedTouches[0].y);
}
for (let i = 0; i < sarrx.length; i++) {
if (sarrz[i] == 0) {
secureSupervisorContext.moveTo(sarrx[i], sarry[i])
} else {
secureSupervisorContext.lineTo(sarrx[i],sarry[i])
}
}
secureSupervisorContext.clearRect(0, 0, canvasw, canvash);
secureSupervisorContext.setStrokeStyle('#000000');
secureSupervisorContext.setLineWidth(4);
secureSupervisorContext.setLineCap('round');
secureSupervisorContext.setLineJoin('round');
secureSupervisorContext.stroke();
secureSupervisorContext.draw(false);
},
canvasMoveSupervisorSign: function(event) {
if (isButtonDown) {
ssarrz.push(1)
ssarrx.push(event.changedTouches[0].x);
ssarry.push(event.changedTouches[0].y);
}
for (let i = 0; i < ssarrx.length; i++) {
if (ssarrz[i] == 0) {
supervisorContext.moveTo(ssarrx[i], ssarry[i])
} else {
supervisorContext.lineTo(ssarrx[i],ssarry[i])
}
}
supervisorContext.clearRect(0, 0, canvasw, canvash);
supervisorContext.setStrokeStyle('#000000');
supervisorContext.setLineWidth(4);
supervisorContext.setLineCap('round');
supervisorContext.setLineJoin('round');
supervisorContext.stroke();
supervisorContext.draw(false);
},
canvasEndSign: function(event) {
isButtonDown = false
},
cleardraw: function() {
// 清除画布
sarrx = []
sarry = []
sarrz = []
secureSupervisorContext.clearRect(0, 0, canvasw, canvash)
secureSupervisorContext.draw(true)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '危险作业报告单'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
sarrx = []
sarry = []
sarrz = []
ssarrx = []
ssarry = []
ssarrz = []
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 选择报告日期
*/
pickReportDate(event) {
console.log(event, '报告日期')
this.setData({
reportDate: event.detail.value
})
},
/**
* 输入作业名称
*/
inputWorkName(event) {
console.log(event, '输入作业名称')
},
/**
* 输入预定作业时间
*/
pickReverseDate(event) {
console.log(event)
this.setData({
reserveDate: event.detail.value
})
},
/**
* 输入作业内容
*/
inputWorkContent(event) {
console.log(event, 'work Content')
},
/**
* 输入作业分析
*/
inputWorkAnalysis(event) {
console.log(event, 'work analysis')
},
/**
* 企业安全主管意见
*/
inputSecureSupervisorOpinion(event) {
console.log(event, 'secure supervisor opinion')
},
/**
* 输入安全措施
*/
inputSecureMeasures(event) {
console.log(event, 'heheh')
},
/**
* 单位盖章
*/
phoneUnit(event) {
wx.chooseImage({
success: (res) => {
// this.data.rectFilePath = res.tempFilePaths[0]
wx.getFileSystemManager().readFile({
filePath: res.tempFilePaths[0], // 选择图片返回的相对路径
encoding: 'base64', // 编码格式
success: res1 => { // 成功的回调
this.setData({
unitNamePic: 'data:image/png;base64,' + res1.data
})
}
})
}
})
},
/**
* 企业安全主管意见及签字的日期选择
*/
enterSecureSignDate(event) {
console.log(event, 'hehehe')
this.setData({
secureSupervisorSignDate: event.detail.value
})
},
/**
* 企业主管意见及签字
*/
enterSignDate(event) {
console.log(event, 'xixixi')
this.setData({
supervisorSignDate: event.detail.value
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/hwapproval/hwapproval.wxml-->
<view class="hwapproval-wrapper">
<view class="unit-name-wrapper">
<view class="unit-name-title">单位名称(盖章)</view>
<image mode="aspectFit" class="unit-name-pic" src="{{unitNamePic}}"></image>
<button class="unit-name-photo" bindtap="phoneUnit">点击拍照</button>
</view>
<view class="report-date-wrapper">
<view class="report-date-title">报告日期</view>
<picker header-text="选择日期" mode="date" bindchange="pickReportDate" class="pick-date">选择日期{{' ' + reportDate}}</picker>
</view>
<view class="work-name-wrapper">
<view class="work-name-title">作业名称</view>
<input class="work-name-input" type="text" bindinput="inputWorkName" placeholder="请输入作业名称"></input>
</view>
<view class="reserve-work-date-wrapper">
<view class="reserve-work-date-title">预定作业时间</view>
<picker header-text="选择预定作业时间" mode="date" bindchange="pickReverseDate" class="reverse-date">选择预定作业时间{{' ' + reserveDate}}</picker>
</view>
<view class="work-content-wrapper">
<view class="work-content-title">作业内容</view>
<textarea class="work-content-input" maxlength="-1" bindinput="inputWorkContent"></textarea>
</view>
<view class="work-risk-analysis-wrapper">
<view class="work-risk-analysis-title">作业风险分析</view>
<textarea class="work-risk-analysis-input" maxlength="-1" bindinput="inputWorkAnalysis"></textarea>
</view>
<view class="secure-measures-wrapper">
<view class="secure-measures-title">安全措施</view>
<textarea class="secure-measures-input" maxlength="-1"
bindinput="inputSecureMeasures"></textarea>
</view>
<view class="work-unit-wrapper">
<view class="work-unit-title">作业单位</view>
<input class="work-unit-input" type="text" placeholder="请输入作业单位" bindinput="inputWorkUnit"></input>
</view>
<view class="work-charger-wrapper">
<view class="work-charger-title">作业负责人</view>
<input class="work-charger-input" type="text" placeholder="请输入作业负责人" bindinput="inputWorkCharger"></input>
</view>
<view class="enter-secure-supervisor-opinion-wrapper">
<view class="enter-secure-supervisor-opinion-title">企业安全主管意见及签字</view>
<textarea class="enter-secure-supervisor-opinion-input" maxlength="-1" bindinput="inputSecureSupervisorOpinion"></textarea>
<canvas class="enter-secure-supervisor-sign" id="toSign" canvas-id="toSignCanvas" disable-scroll="true"
bindtouchstart="canvasStartSign" bindtouchmove="canvasMoveSign" bindtouchend="canvasEndSign" touchcancel="canvasEndSign" binderror="canvasIdErrorCallback"></canvas>
<view class="enter-secure-supervisor-sign-date">
<picker header-text="选择日期" mode="date" bindchange="enterSecureSignDate" class="pick-supervisor-sign-date">选择日期{{' ' + secureSupervisorSignDate}}</picker>
</view>
</view>
<view class="enter-supervisor-opinion-wrapper">
<view class="enter-supervisor-opinion-title">企业主管意见及签字</view>
<textarea class="enter-supervisor-opinion-input" maxlength="-1" bindinput="inputEnterSupervisorOpinion"></textarea>
<canvas class="enter-supervisor-sign" id="toSign2" canvas-id="toSignCanvas2" disable-scroll="true"
bindtouchstart="canvasStartSupervisorSign" bindtouchmove="canvasMoveSupervisorSign" bindtouchend="canvasEndSign" touchcancel="canvasEndSign" binderror="canvasIdErrorCallback"
></canvas>
<view class="enter-supervisor-sign-date">
<picker header-text="选择日期" mode="date" bindchange="enterSignDate" class="pick-enter-supervisor-sign-date">选择日期{{' ' + supervisorSignDate}}</picker>
</view>
</view>
<button class="submitSupervisorOpinion">提交</button>
</view>
/* pages/hwapproval/hwapproval.wxss */
.hwapproval-wrapper {
position: relative;
}
.unit-name-wrapper {
width: 710rpx;
height: 350px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.unit-name-title {
padding: 15rpx 0 15rpx 20rpx;
}
.unit-name-pic {
position: relative;
width: 100%!important;
box-sizing: border-box;
}
.unit-name-photo {
border-radius: 20rpx;
background-color: #090D9C;
color: white;
}
.report-date-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.report-date-title {
position: relative;
margin-left: 20rpx;
}
.pick-date {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-name-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-name-title {
position: relative;
margin-left: 20rpx;
}
.work-name-input {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.reserve-work-date-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.reserve-work-date-title {
position: relative;
margin-left: 20rpx;
}
.reverse-date {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-content-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.work-content-title {
padding: 15rpx 0 0 20rpx;
}
.work-content-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.work-risk-analysis-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.work-risk-analysis-title {
padding: 15rpx 0 0 20rpx;
}
.work-risk-analysis-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.secure-measures-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.secure-measures-title {
padding: 15rpx 0 0 20rpx;
}
.secure-measures-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.work-unit-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-unit-title {
position: relative;
margin-left: 20rpx;
}
.work-unit-input {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-charger-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-charger-title {
position: relative;
margin-left: 20rpx;
}
.work-charger-input{
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.enter-secure-supervisor-opinion-wrapper {
width: 710rpx;
height: 580rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.enter-secure-supervisor-opinion-title {
padding: 15rpx 0 0 20rpx;
}
.enter-secure-supervisor-opinion-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.enter-secure-supervisor-sign {
width: 700rpx!important;
height: 250rpx!important;
box-sizing: border-box;
margin: 0 auto;
border: 1rpx solid #090D9C;
border-radius: 20rpx;
}
.pick-supervisor-sign-date {
margin-left: 20rpx;
}
.enter-supervisor-opinion-wrapper {
width: 710rpx;
height: 580rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.enter-supervisor-opinion-title {
padding: 15rpx 0 0 20rpx;
}
.enter-supervisor-opinion-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.enter-supervisor-sign {
width: 700rpx!important;
height: 250rpx!important;
box-sizing: border-box;
margin: 0 auto;
border: 1rpx solid #090D9C;
border-radius: 20rpx;
}
.enter-supervisor-sign-date {
position: relative;
}
.pick-enter-supervisor-sign-date {
margin-left: 20rpx;
}
.submitSupervisorOpinion {
border-radius: 20rpx;
background-color: #090D9C;
color: white;
margin-bottom: 15rpx;
}
\ No newline at end of file
// pages/hwapprovallist/hwapprovallist.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
hwapprovalSerchIcon: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
approvalenterImgUrl: 'http://39.102.232.151:8030/cover/证书企业icon.png',
approvalList: [
],
companyId: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.data.companyId = options.companyId
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
page: 0,
size: 10
},
success: async (res) => {
console.log(res, 'wx.request')
let result = [...res.data.content]
let proArr = []
result.forEach(item => {
proArr.push(new Promise((resolve, reject) => {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: item.enterpriseId
},
success: (res1) => {
item.approvalSum = res1.data.content.length
resolve()
},
fail: () => {
reject()
}
})
}))
})
await Promise.all(proArr)
this.setData({
approvalList: result.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
approvalSum: item.approvalSum
}
})
})
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '危险作业审批'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 选择开始日期
*/
selectStartDate(event) {
this.setData({
curSelectStartDate: event.detail.value
})
},
selectEndDate(event) {
this.setData({
curSelectEndDate: event.detail.value
})
},
jumpToCat(event) {
wx.navigateTo({
url: '/pages/hwcatapproval/hwcatapproval?id=123'
})
},
searchEnter(event) {
// event.detail.value
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
page: 0,
size: 10,
enterpriseName: event.detail.value
},
success: async ( res ) => {
console.log(res, 'helloworld')
let result = [...res.data.content]
let proArr = []
result.forEach(item => {
proArr.push(new Promise((resolve, reject) => {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: item.enterpriseId
},
success: (res1) => {
item.approvalSum = res1.data.content.length
resolve()
},
fail: () => {
reject()
}
})
}))
})
await Promise.all(proArr)
this.setData({
approvalList: result.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
approvalSum: item.approvalSum
}
})
})
}
})
},
toAddApproval() {
if (app.globalData.curRole !== '企业管理') {
wx.showToast({
title: '不具备权限',
icon: 'error'
})
return
}
wx.navigateTo({
url: '/pages/addapproval/addapproval?companyId=' + this.data.companyId
})
},
tohwapprovals(event) {
console.log(event.target.dataset.index.companyId, 'hehehehe')
console.log(app.globalData.curRole, 'app.globalData.curRole')
if (app.globalData.curRole === '企业管理') {
wx.navigateTo({
url: '/pages/hwapprovals/hwapprovals?companyId=' + event.target.dataset.index.companyId,
})
} else {
wx.showToast({
title: '不具备权限',
})
}
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/hwapprovallist/hwapprovallist.wxml-->
<view class="approval-total-wrapper">
<view class="approval-tools-wrapper">
<input
class="approval-input-wrapper"
placeholder="请输入公司名称搜索"
type="text"
confirm-type="search"
bindconfirm="searchEnter"
>
<image src="{{hwapprovalSerchIcon}}" class="approval-search-icon"></image>
</input>
<!-- <view class="navigateToAddApproval" bindtap="toAddApproval">新增</view> -->
</view>
<scroll-view
class="approval-scroll"
scroll-y="true"
>
<view wx:for="{{approvalList}}" class="approval-enter">
<view class="approval-enter-title-wrapper">
<view>
<image src="{{approvalenterImgUrl}}" class="approval-enter-img-icon"></image>
</view>
<view class="approval-enter-title-icon">{{item.companyName}}</view>
</view>
<view class="approval-enter-content-wrapper">
<view class="approval-enter-content-title">危险作业备案信息数量</view>
<view class="approval-enter-content-degree">{{item.approvalSum}}</view>
<view class="approval-enter-content-navigator" data-index="{{item}}"
bindtap="tohwapprovals"
>查看详情</view>
</view>
</view>
</scroll-view>
</view>
/* pages/hwapprovallist/hwapprovallist.wxss */
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.approval-total-wrapper {
padding-top: 18rpx;
box-sizing: border-box;
width: 100vw;
height: 100vh;
background-color: #F4F4F5;
}
.approval-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.approval-input-wrapper {
width: 569rpx;
height: 67rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 34rpx;
position: relative;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
padding-left: 50rpx;
background-color: #FAFAFA;
margin-left: 22rpx;
margin-right: 11rpx;
}
.navigateToAddApproval {
width: 129rpx;
height: 63rpx;
background: #FAFAFA;
border: 1px solid #090D9C;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 19rpx;
}
.approval-scroll {
width: 100%;
margin-top: 15rpx;
height: calc(100vh - 108rpx);
box-sizing: border-box;
}
.approval-enter {
width: 709rpx;
height: 162rpx;
margin: 23rpx auto;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
padding-top: 30rpx;
}
.approval-enter-title-wrapper {
font-size: 34rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #333333;
display: flex;
}
.approval-enter-img-icon {
width: 45rpx;
height: 45rpx;
margin-left: 23rpx;
margin-right: 11rpx;
}
.approval-enter-content-wrapper {
display: flex;
justify-content: flex-start;
align-items: center;
margin-top: 33rpx;
}
.approval-enter-content-title {
font-size: 34rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
margin-left: 82rpx;
}
.approval-enter-content-degree {
font-size: 46rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #090D9C;
margin-left: 32rpx;
}
.approval-enter-content-navigator {
font-size: 24rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
display: flex;
justify-content: center;
align-items: center;
border: 1rpx solid #090D9C;
margin-left: 60rpx;
padding: 12rpx 18rpx 12rpx 11rpx;
border-radius: 8rpx;
}
\ No newline at end of file
// pages/approval/approval.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
approvalSerchIcon: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
approvalList: [
],
companyId: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.data.companyId = options.companyId
console.log(options, 'options in hwapprovals')
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
data: {
companyId: this.data.companyId
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'api/dangerJobRepost')
this.setData({
approvalList: [...res.data.content.map(item => {
return {
name: item.name,
uploadDate: item.uploadDate,
validDate: item.time,
id: item.id,
filePath: item.filePath,
companyId: item.companyId
}
})]
})
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '危险作业备案'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
data: {
companyId: this.data.companyId
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'api/dangerJobRepost')
this.setData({
approvalList: [...res.data.content.map(item => {
return {
name: item.name,
uploadDate: item.uploadDate,
validDate: item.time,
id: item.id,
filePath: item.filePath,
companyId: item.companyId
}
})]
})
}
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
navigateToapproval() {
wx.navigateTo({
url: '/pages/approvalitem /approvalitem',
success: function(event) {}
})
},
pullDownRefresh() {
console.log('pullDownRefresh pullDownRefresh pullDOwnRefresh')
setTimeout(() => {
this.setData({
isPullDown: false
})
}, 500)
},
addEnterpriseapproval() {
if (app.globalData.curRole === '企业管理') {
wx.navigateTo({
url: '/pages/addapproval/addapproval?companyId=' + this.data.companyId,
})
} else {
wx.showToast({
title: '不具备权限',
})
}
},
searchApproval(event) {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
data: {
companyId: this.data.companyId,
jobName: event.detail.value
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
this.setData({
approvalList: [...res.data.content.map(item => {
return {
name: item.name,
uploadDate: item.uploadDate,
validDate: item.time,
id: item.id,
filePath: item.filePath,
companyId: item.companyId
}
})]
})
}
})
},
viewFile(event) {
console.log(event, 'event event')
const tofilePath = event.currentTarget.dataset.index.filePath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const resultFilePath = tofilePath.substr(index3)
if (!resultFilePath.endsWith('.pdf')) {
wx.previewImage({
urls: [app.globalData.appBaseUrlV3 + resultFilePath],
})
} else {
wx.showLoading({
title: '正在加载',
})
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
success: (res) => {
console.log(res, 'realdownloadfile')
if (res.tempFilePath.endsWith('.pdf')) {
// this.setData({})
wx.openDocument({
filePath: res.tempFilePath,
showMenu: true
})
} else {
// this.setData({
// isShowImg: true,
// showImgSrc: res.tempFilePath
// })
wx.previewImage({
urls: [res.tempFilePath],
})
}
},
complete: () => {
console.log('调用了吗 调用了吗')
wx.hideLoading()
},
fail: (res) => {
console.log('fail fail fail ', res)
console.log('fail fail fail')
}
})
}
},
viewWork(event) {
const tofilePath = event.currentTarget.dataset.index.filePath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const resultFilePath = tofilePath.substr(index3)
if (!resultFilePath.endsWith('.pdf')) {
wx.previewImage({
urls: [app.globalData.appBaseUrlV3 + resultFilePath],
})
} else {
wx.showLoading({
title: '正在加载',
})
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
success: (res) => {
console.log(res, 'realdownloadfile')
if (res.tempFilePath.endsWith('.pdf')) {
// this.setData({})
wx.openDocument({
filePath: res.tempFilePath,
showMenu: true
})
} else {
// this.setData({
// isShowImg: true,
// showImgSrc: res.tempFilePath
// })
wx.previewImage({
urls: [res.tempFilePath],
})
}
},
complete: () => {
console.log('调用了吗 调用了吗')
wx.hideLoading()
},
fail: (res) => {
console.log('fail fail fail ', res)
console.log('fail fail fail')
}
})
}
},
deleteWork(event) {
//event.currentTarget.dataset.index.id
wx.showModal({
title: '提示',
content: '是否删除所选项',
success: (res) => {
if (res.confirm) {
wx.showLoading({
title: '正在删除',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport',
method: 'DELETE',
header: {
Authorization: app.globalData.Authorization
},
data: [event.currentTarget.dataset.index.id],
success: (resd) => {
if (resd.statusCode === 204) {
wx.showToast({
title: '删除成功',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/dangerJobReport/page',
method: 'get',
data: {
companyId: this.data.companyId
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'api/dangerJobRepost')
this.setData({
approvalList: [...res.data.content.map(item => {
return {
name: item.name,
uploadDate: item.uploadDate,
validDate: item.time,
id: item.id,
filePath: item.filePath,
companyId: item.companyId
}
})]
})
}
})
}
},
complete: () => {
wx.hideLoading()
}
})
}
}
})
},
downloaFile(event) {
const tofilePath = this.data.certifyList[event.target.dataset.index].filepath
const index1 = tofilePath.indexOf('\\')
const index2 = tofilePath.indexOf('\\', index1 + 1)
const index3 = tofilePath.indexOf('\\', index2 + 1)
const index4 = tofilePath.indexOf('\\', index3 + 1)
const picFilePath = tofilePath.substr(index4 + 1)
const index5 = picFilePath.indexOf('.')
const picFilePath2 = picFilePath.substr(index5)
const resultFilePath = tofilePath.substr(index3)
console.log(app.globalData.appBaseUrlV3 + resultFilePath, 'resultFilePath')
wx.showLoading({
title: '正在加载',
})
console.log(picFilePath, 'picFilePath picFilePath')
console.log(picFilePath2, 'picFilePath2 picFilePath2')
console.log(`${wx.env.USER_DATA_PATH}`)
const myPath = new Date().getTime() + picFilePath2
const myPath2 = `${wx.env.USER_DATA_PATH}/${myPath}`
wx.downloadFile({
url: app.globalData.appBaseUrlV3 + resultFilePath,
filePath: myPath2,
success: (res) => {
console.log(res, 'realdownloadfile')
wx.showToast({
title: '下载成功',
icon: 'success',
duration: 1500
})
wx.hideLoading()
// wx.saveFile({
// tempFilePath: res.tempFilePath,
// success: (res1) => {
// console.log(res1, 'tempFielPath tempFilePath')
// wx.showToast({
// title: '下载成功',
// })
// },
// fail: (res1) => {
// wx.showToast({
// title: '下载失败',
// })
// }
// })
},
complete: () => {
console.log('调用了吗 调用了吗')
// wx.hideLoading()
},
fail: () => {
console.log('fail fail fail')
wx.showToast({
title: '下载失败',
icon: 'error'
})
wx.hideLoading()
}
})
},
hideImageShow() {
this.setData({
isShowImg: false
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/approval/approval.wxml-->
<view class="approval-wrapper">
<view class="approval-tools-wrapper">
<input
class="approval-input-wrapper"
placeholder="请输入危险作业名称搜索"
type="text"
confirm-type="search"
bindconfirm="searchApproval"
>
<image src="{{approvalSerchIcon}}" class="approval-search-icon"></image>
</input>
<view class="navigateToAddapproval" bindtap="addEnterpriseapproval">新增</view>
</view>
<scroll-view
class="approval-scroll-wrapper"
scroll-y="true"
>
<view wx:for="{{approvalList}}" class="approval-item">
<view class="top-wrapper"
bindtap="viewFile"
data-index="{{item}}">
<view class="dec-region"></view>
<view class="approval-des-item-total-wrapper">
<view class="approval-des-item-wrapper">
<view class="approval-des-item-title">危险作业名称:</view>
<view class="approval-des-item-content">{{item.name}}</view>
</view >
<view class="approval-des-item-wrapper">
<view class="approval-des-item-title">作业时间:</view>
<view class="approval-des-item-time">{{item.uploadDate}}</view>
</view>
<view class="approval-des-item-wrapper">
<view class="approval-des-item-title">上传日期:</view>
<view class="approval-des-item-time">{{item.validDate}}</view>
</view>
<view class="approval-tools-wrapper">
<view
class="approval-tool-view"
data-index="{{item}}"
bindtap="viewWork">查看</view>
<view
class="approval-tool-delete"
data-index="{{item}}"
bindtap="deleteWork" >删除</view>
</view>
</view>
</view>
<!-- <view class="approval-item-tools-wrapper">
<button class="approval-item-view" bindtap="viewFile" data-index="{{item}}">查看</button>
<button class="approval-item-downlaod" bindtap="downloaFile" data-index="{{item}}">下载</button>
</view> -->
</view>
</scroll-view>
<view class="img-file-show" wx:if="{{isShowImg}}" bindtap="hideImageShow">
<image src="{{showImgSrc}}" class="show-image"></image>
</view>
</view>
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.approval-wrapper {
padding-top: 18rpx;
box-sizing: border-box;
background-color: #F4F4F5;
width: 100vw;
height: 100vh;
}
.approval-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.approval-input-wrapper {
width: 569rpx;
height: 67rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 34rpx;
position: relative;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
padding-left: 50rpx;
background-color: #FAFAFA;
margin-left: 22rpx;
margin-right: 11rpx;
}
.navigateToAddapproval {
width: 129rpx;
height: 63rpx;
background: #FAFAFA;
border: 1px solid #090D9C;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 19rpx;
}
.approval-scroll-wrapper {
margin-top: 20rpx;
height: calc(100vh - 107rpx);
}
.approval-item {
width: 706rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
margin: 22rpx auto;
background-color: #ffffff;
padding-bottom: 10rpx;
}
.top-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.approval-tools-wrapper {
display: flex;
justify-content: flex-end;
}
.approval-tool-view {
padding: 15rpx 25rpx;
background-color: #1f208c;
color: white;
font-size: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
margin-left: 20rpx;
border-radius: 5rpx;
}
.approval-tool-delete {
padding: 15rpx 25rpx;
background-color: #d80000;
color: white;
font-size: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
margin-left: 20rpx;
border-radius: 5rpx;
}
.dec-region {
width: 11rpx;
height: 29rpx;
background: #090D9C;
margin-left: 22rpx;
margin-right: 12rpx;
margin-top: 23rpx;
}
.approval-des-item-total-wrapper {
padding-top: 15rpx;
flex-grow: 1;
}
.approval-des-item-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
margin-bottom: 12rpx;
}
.approval-des-item-title {
font-size: 30rpx;
font-family: "PingFang SC1";
color: #333333;
margin-right: 20rpx;
font-weight: 550;
}
.approval-des-item-content {
font-size: 30rpx;
color: #090D9C;
font-family: "PingFang SC1";
font-weight: 550;
}
.approval-des-item-time {
color: #666666;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
}
.approval-item-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
padding-bottom: 3rpx;
}
.approval-item-view {
width: 135rpx!important;
height: 53rpx!important;
background: #090D9C;
border: 1rpx solid #090D9C;
border-radius: 8rpx;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
padding: 0!important;
margin-right: 20rpx!important;
margin-top: 0!important;
margin-bottom: 0!important;
}
.approval-item-downlaod {
width: 135rpx!important;
height: 53rpx!important;
background: #FFFFFF;
border: 1rpx solid #090D9C;
border-radius: 8rpx;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
display: flex;
align-items: center;
justify-content: center;
padding: 0!important;
margin-right: 20rpx!important;
margin-left: 0!important;
margin-top: 0!important;
margin-bottom: 0!important;
}
.img-file-show {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 9999;
background-color: #808080;
}
.show-image {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
\ No newline at end of file
// pages/hwcatapproval/hwcatapproval.js
Page({
/**
* 页面的初始数据
*/
data: {
unitNamePic: '',
reportDate: '',
workName: '',
reserveDate: '',
workContent: '',
workRiskAnalysis: '',
secMesure: '',
workUnit: '',
workCharger: '',
enterSecureSupervisorOpinion: '',
enterSupervisorOpinion: '',
signSecureSupervisor: '',
signSupervisor: '',
secureSupervisorSignDate: '',
supervisorSignDate: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/hwcatapproval/hwcatapproval.wxml-->
<!--pages/hwapproval/hwapproval.wxml-->
<view class="hwapproval-wrapper">
<view class="unit-name-wrapper">
<view class="unit-name-title">单位名称(盖章)</view>
<image mode="aspectFit" class="unit-name-pic" src="{{unitNamePic}}"></image>
<!-- <button class="unit-name-photo" bindtap="phoneUnit">点击拍照</button> -->
</view>
<view class="report-date-wrapper">
<view class="report-date-title">报告日期</view>
<picker header-text="选择日期" mode="date" bindchange="pickReportDate" class="pick-date">选择日期{{' ' + reportDate}}</picker>
</view>
<view class="work-name-wrapper">
<view class="work-name-title">作业名称</view>
<input class="work-name-input" type="text" bindinput="inputWorkName" placeholder="请输入作业名称" value="{{workName}}"></input>
</view>
<view class="reserve-work-date-wrapper">
<view class="reserve-work-date-title">预定作业时间</view>
<picker header-text="选择预定作业时间" mode="date" bindchange="pickReverseDate" class="reverse-date">选择预定作业时间{{' ' + reserveDate}}</picker>
</view>
<view class="work-content-wrapper">
<view class="work-content-title">作业内容</view>
<textarea class="work-content-input" maxlength="-1" bindinput="inputWorkContent" value="{{workContent}}"></textarea>
</view>
<view class="work-risk-analysis-wrapper">
<view class="work-risk-analysis-title">作业风险分析</view>
<textarea class="work-risk-analysis-input" maxlength="-1" bindinput="inputWorkAnalysis" value="{{workRiskAnalysis}}"></textarea>
</view>
<view class="secure-measures-wrapper">
<view class="secure-measures-title">安全措施</view>
<textarea class="secure-measures-input" maxlength="-1"
bindinput="inputSecureMeasures" value="{{secMesure}}"></textarea>
</view>
<view class="work-unit-wrapper">
<view class="work-unit-title">作业单位</view>
<input class="work-unit-input" type="text" placeholder="请输入作业单位" bindinput="inputWorkUnit" value="{{workUnit}}"></input>
</view>
<view class="work-charger-wrapper">
<view class="work-charger-title">作业负责人</view>
<input class="work-charger-input" type="text" placeholder="请输入作业负责人" bindinput="inputWorkCharger" value="{{workCharger}}"></input>
</view>
<view class="enter-secure-supervisor-opinion-wrapper">
<view class="enter-secure-supervisor-opinion-title">企业安全主管意见及签字</view>
<textarea class="enter-secure-supervisor-opinion-input" maxlength="-1" bindinput="inputSecureSupervisorOpinion" value="{{enterSecureSupervisorOpinion}}"></textarea>
<image class="enter-secure-supervisor-sign" mode="aspectFit" src="{{signSecureSupervisor}}"></image>
<!-- <canvas class="enter-secure-supervisor-sign" id="toSign" canvas-id="toSignCanvas" disable-scroll="true"
bindtouchstart="canvasStartSign" bindtouchmove="canvasMoveSign" bindtouchend="canvasEndSign" touchcancel="canvasEndSign" binderror="canvasIdErrorCallback"></canvas> -->
<view class="enter-secure-supervisor-sign-date">
<picker header-text="选择日期" mode="date" bindchange="enterSecureSignDate" class="pick-supervisor-sign-date">选择日期{{' ' + secureSupervisorSignDate}}</picker>
</view>
</view>
<view class="enter-supervisor-opinion-wrapper">
<view class="enter-supervisor-opinion-title">企业主管意见及签字</view>
<textarea class="enter-supervisor-opinion-input" maxlength="-1" bindinput="inputEnterSupervisorOpinion" value="{{enterSupervisorOpinion}}"></textarea>
<image class="enter-secure-supervisor-sign" mode="aspectFit" src="{{signSupervisor}}"></image>
<!-- <canvas class="enter-supervisor-sign" id="toSign2" canvas-id="toSignCanvas2" disable-scroll="true"
bindtouchstart="canvasStartSupervisorSign" bindtouchmove="canvasMoveSupervisorSign" bindtouchend="canvasEndSign" touchcancel="canvasEndSign" binderror="canvasIdErrorCallback"
></canvas> -->
<view class="enter-supervisor-sign-date">
<picker header-text="选择日期" mode="date" bindchange="enterSignDate" class="pick-enter-supervisor-sign-date">选择日期{{' ' + supervisorSignDate}}</picker>
</view>
</view>
</view>
/* pages/hwcatapproval/hwcatapproval.wxss */
.hwapproval-wrapper {
position: relative;
}
.unit-name-wrapper {
width: 710rpx;
height: 350px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.unit-name-title {
padding: 15rpx 0 15rpx 20rpx;
}
.unit-name-pic {
position: relative;
width: 100%!important;
box-sizing: border-box;
}
.unit-name-photo {
border-radius: 20rpx;
background-color: #090D9C;
color: white;
}
.report-date-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.report-date-title {
position: relative;
margin-left: 20rpx;
}
.pick-date {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-name-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-name-title {
position: relative;
margin-left: 20rpx;
}
.work-name-input {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.reserve-work-date-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.reserve-work-date-title {
position: relative;
margin-left: 20rpx;
}
.reverse-date {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-content-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.work-content-title {
padding: 15rpx 0 0 20rpx;
}
.work-content-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.work-risk-analysis-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.work-risk-analysis-title {
padding: 15rpx 0 0 20rpx;
}
.work-risk-analysis-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.secure-measures-wrapper {
width: 710rpx;
height: 260rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.secure-measures-title {
padding: 15rpx 0 0 20rpx;
}
.secure-measures-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.work-unit-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-unit-title {
position: relative;
margin-left: 20rpx;
}
.work-unit-input {
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.work-charger-wrapper {
width: 710rpx;
height: 40px;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
.work-charger-title {
position: relative;
margin-left: 20rpx;
}
.work-charger-input{
flex: 1;
text-align: right;
margin-right: 20rpx;
}
.enter-secure-supervisor-opinion-wrapper {
width: 710rpx;
height: 580rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.enter-secure-supervisor-opinion-title {
padding: 15rpx 0 0 20rpx;
}
.enter-secure-supervisor-opinion-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.enter-secure-supervisor-sign {
width: 700rpx!important;
height: 250rpx!important;
box-sizing: border-box;
margin: 0 auto;
border: 1rpx solid #090D9C;
border-radius: 20rpx;
}
.pick-supervisor-sign-date {
margin-left: 20rpx;
}
.enter-supervisor-opinion-wrapper {
width: 710rpx;
height: 580rpx;
margin: 20rpx auto;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -2rpx -2rpx 2rpx 2rpx #eee;
border-radius: 20rpx;
}
.enter-supervisor-opinion-title {
padding: 15rpx 0 0 20rpx;
}
.enter-supervisor-opinion-input {
box-sizing: border-box;
padding: 15rpx;
width: 100%!important;
height: 220rpx!important;
}
.enter-supervisor-sign {
width: 700rpx!important;
height: 250rpx!important;
box-sizing: border-box;
margin: 0 auto;
border: 1rpx solid #090D9C;
border-radius: 20rpx;
}
.enter-supervisor-sign-date {
position: relative;
}
.pick-enter-supervisor-sign-date {
margin-left: 20rpx;
}
.submitSupervisorOpinion {
border-radius: 20rpx;
background-color: #090D9C;
color: white;
margin-bottom: 15rpx;
}
\ No newline at end of file
// pages/info/info.js
Page({
/**
* 页面的初始数据
*/
data: {
infoList: [
{
title: '[隐患预警] 贵公司“重大隐患”—“联动台紧急停止按钮无效”整改即将到期,请及时整改',
isRead: false,
time: '2020-05-19 19:25',
infoId: '11'
},
{
title: '[隐患预警] 贵公司“一般隐患”—“力矩限位不灵敏”整改即将到期,请及时整改',
isRead: false,
time: '2020-05-19 19:24',
infoId: '22'
},
{
title: '[隐患预警] 贵公司“一般隐患”—“起升钢丝绳排布不均匀”整改已超期,请及时整改',
isRead: true,
time: '2020-05-18 17:23',
infoId: '33'
},
{
title: '[隐患预警] 贵公司“一般隐患”—“脚手架外架与脚手架内架相连,拉接点较少”整改已超期,请及时整改',
isRead: true,
time: '2020-05-18 13:34',
infoId: '44'
}
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '信息推送'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/info/info.wxml-->
<view class="info-page-wrapper">
<scroll-view scroll-y="true" class="info-list-scroll">
<view wx:for="{{infoList}}" class="info-item-wrapper" wx:key="infoId">
<view wx:if="{{item.isRead}}" class="read-icon">已读</view>
<view wx:else class="unread-icon">未读</view>
<view wx:if="{{item.isRead}}" class="read-time">{{item.time}}</view>
<view wx:else class="unread-time">{{item.time}}</view>
<view wx:if="{{item.isRead}}" class="read-point-icon"></view>
<view wx:else class="unread-point-icon"></view>
<view wx:if="{{item.isRead}}" class="info-item-read-title">{{item.title}}</view>
<view wx:else class="info-item-title">{{item.title}}</view>
</view>
</scroll-view>
</view>
/* pages/info/info.wxss */
/* pages/info/info.wxss *//* pages/info/info.wxss */
.info-page-wrapper {
width: 100vw;
height: 100vh;
}
.info-list-scroll {
width: 100vw;
height: 100vh;
padding: 10rpx;
box-sizing: border-box;
}
.info-item-wrapper {
position: relative;
width: 710rpx;
height: 148rpx;
box-sizing: border-box;
margin: 30rpx auto;
padding-top: 45rpx;
padding-left: 60rpx;
padding-right: 8rpx;
border-radius: 10rpx;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1.5rpx -1.5rpx 1.5rpx 1.5rpx #eee;
}
.unread-icon {
position: absolute;
top: 9rpx;
left: 27rpx;
width: 74rpx;
height: 32rpx;
background: linear-gradient(180deg, #4589FA, #455FFA);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #FFFFFF;
line-height: 32rpx;
text-align: center;
}
.read-icon {
position: absolute;
top: 9rpx;
left: 27rpx;
width: 74rpx;
height: 32rpx;
opacity: 0.3;
background: #c2c6cc;
color: rgb(0, 146, 254, .6);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 500;
line-height: 32rpx;
text-align: center;
}
.unread-time {
position: absolute;
right: 36rpx;
top: 9rpx;
font-size: 24rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #666666;
}
.read-time {
position: absolute;
right: 36rpx;
top: 9rpx;
font-size: 24rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #666666;
}
.unread-point-icon {
position: absolute;
left: 28rpx;
top: 56rpx;
width: 21rpx;
height: 21rpx;
background: linear-gradient(180deg, #4589FA, #455FFA);
border-radius: 50%;
}
.read-point-icon {
position: absolute;
left: 28rpx;
top: 56rpx;
width: 21rpx;
height: 21rpx;
background: #E5E3E3;
border-radius: 50%;
}
.info-item-read-title {
width: 642rpx;
min-height: 63rpx;
font-size: 26rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #999999;
line-height: 36rpx;
margin-top: 10rpx;
}
.info-item-title {
width: 642rpx;
min-height: 63rpx;
font-size: 26rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #333333;
line-height: 36rpx;
margin-top: 10rpx;
}
\ No newline at end of file
// pages/law/law.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
lawList: [
],
curPage: 0,
curPageSize: 10,
isPullDown: false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.showLoading({
title: '正在加载',
})
wx.request({
url: app.globalData.appBaseUrlV2+ '/api/thLaw/queryAll',
header: {
Authorization: app.globalData.Authorization
},
method: 'GET',
data: {
page: this.data.curPage,
size: this.data.curPageSize,
sort: 'lawDate,desc'
},
success: (res) => {
console.log(res, 'wx.request')
this.setData({
lawList: res.data.content
})
},
fail: (res) => {},
complete: () => {
wx.hideLoading()
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '法律法规'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
*
*/
pullDownRefresh() {
// this.isPullDown = false
// console.log(this.data.isPullDown)
// this.setData({
// isPullDown: false
// })
/**
*
*/
// setTimeout(() => {
// this.setData({
// isPullDown: false
// })
// }, 2000)
this.data.curPageSize += 10
wx.request({
url: app.globalData.appBaseUrlV2+ '/api/thLaw/queryAll',
header: {
Authorization: app.globalData.Authorization
},
method: 'GET',
data: {
page: this.data.curPage,
size: this.data.curPageSize,
sort: 'lawDate,desc'
},
success: (res) => {
console.log(res, 'wx.request')
this.setData({
lawList: res.data.content,
isPullDown: false
})
},
fail: (res) => {},
complete: () => {
}
})
},
/**
* 跳转到法律详情
*/
clickToLawItem(event) {
console.log(event.target.dataset.index, 'index')
app.globalData.currentLawItem = this.data.lawList[event.target.dataset.index]
this.data.lawList[event.target.dataset.index].currentUserRead = true
this.setData({
lawList: this.data.lawList
})
console.log(this.data.lawList[event.target.dataset.index], 'this.data.lawList[event.target.dataset.index]')
wx.navigateTo({
url: '/pages/lawItem/lawItem',
success: (res) => {
res.eventChannel.emit('acceptDataFromOpenerPage', { lawId: this.data.lawList[event.target.dataset.index].lawId })
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/law/law.wxml-->
<view class="law-page-wrapper">
<scroll-view scroll-y="true" class="law-list-scroll"
refresher-enabled="false"
refresher-threshold="30"
refresher-default-style="black"
refresher-triggered="{{isPullDown}}"
bindrefresherrefresh="pullDownRefresh"
>
<view wx:for="{{lawList}}" class="law-item-wrapper" wx:key="{{item.lawId}}" data-index="{{index}}" bindtap="clickToLawItem">
<view class="hasRead" wx:if="{{item.currentUserRead}}" data-index="{{index}}">已读</view>
<view class="noRead" wx:else data-index="{{index}}">未读</view>
<view class="law-title" data-index="{{index}}">{{item.lawTitle}}</view>
<view class="law-down" data-index="{{index}}">
<view class="law-depart" data-index="{{index}}">{{item.lawPublisher}}</view>
<view class="law-time" data-index="{{index}}">{{item.lawDate}}</view>
</view>
</view>
</scroll-view>
</view>
/* pages/law/law.wxss */
.law-page-wrapper {
width: 100vw;
height: 100vh;
}
.law-list-scroll {
width: 100vw;
height: 100vh;
padding: 10rpx;
box-sizing: border-box;
background-color: #F4F4F5;
}
.law-item-wrapper {
width: 710rpx;
height: 158rpx;
margin: 35rpx auto;
padding-top: 9rpx;
border-radius: 20rpx;
box-shadow: 3rpx 3rpx 3rpx 3rpx #eee, -1.5rpx -1.5rpx 1.5rpx 1.5rpx #eee;
background-color: #ffffff;
}
.hasRead {
width: 74rpx;
height: 32rpx;
opacity: 0.3;
background: #c2c6cc;
color: rgb(0, 146, 254, .6);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 500;
line-height: 46rpx;
display: flex;
align-items: center;
justify-content: center;
margin: 0 0 9rpx 16rpx;
}
.noRead {
width: 74rpx;
height: 32rpx;
background: linear-gradient(180deg, #4589FA, #455FFA);
border-radius: 5rpx;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #ffffff;
line-height: 46rpx;
display: flex;
align-items: center;
justify-content: center;
margin: 0 0 9rpx 16rpx;
}
.law-title {
height: 60rpx;
overflow: hidden;
text-overflow: ellipsis;
padding: 5rpx 18rpx;
font-size: 26rpx;
font-family: "PingFang SC";
font-weight: 540;
color: #333333;
line-height: 50rpx;
}
.law-down {
display: flex;
justify-content: space-between;
padding: 5rpx 18rpx;
font-size: 21rpx;
line-height: 50rpx;
color: #999999;
font-weight: 500;
}
// pages/lawItem/lawItem.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
title: '',
depart: '',
time: '',
strips: [],
thumsup: 1122,
readSum: 3344,
content: '',
isThumsUp: false,
lawId: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// options.query
console.log(options.query)
const eventChannel = this.getOpenerEventChannel()
eventChannel.on('acceptDataFromOpenerPage', (data) => {
console.log(data.lawId, 'data data data')
this.data.lawId = data.lawId
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thLaw/findLawDetails',
method: 'get',
data: {
lawId: data.lawId
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
if (res.data.thLawChapterDtoList && res.data.thLawChapterDtoList.length) {
this.setData({
content: res.data.thLawChapterDtoList[0].lawChapter
})
}
this.setData({
title: res.data.lawTitle,
depart: res.data.lawPublisher,
time: res.data.lawDate,
thumsup: res.data.likeNum,
readSum: res.data.readNum
})
wx.setNavigationBarTitle({
title: res.data.lawTitle
})
}
})
})
// wx.request({
// url: 'api/thLaw/findLawDetails',
// method: 'GET',
// data: {
// }
// })
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
const promise = new Promise(resolve => {
setTimeout(() => {
resolve({
title: '自定义转发'
})
}, 2000)
})
return {
title: '自定义转发标题',
path: '/page/user?id=123',
promise
}
},
// 分享到朋友圈
onShareTimeline: function() {
// return {
// title: '',
// query: '',
// imageUrl: ''
// }
},
/**
* 用户点击收藏
*/
onAddToFavorites: function() {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thLaw/collect',
method: 'get',
data: {
lawId: this.data.lawId
},
header: {
Authorization: app.globalData.Authorization
},
success: () => {},
fail: () => {},
complete: () => {}
})
/**
* return {
* title: '',
* imageUrl: '',
* query: ''
* }
*/
},
tapToThumsup() {
if (this.data.isThumsUp === false) {
this.setData({
thumsup: this.data.thumsup + 1,
isThumsUp: true
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thLaw/like',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
success: () => {},
fail: () => {},
complete: () => {}
})
}
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<view class="law-item-wrapper">
<view class="law-item-total-title">{{title}}</view>
<view class="law-item-depart-time-wrapper">
<view class="law-item-depart">{{depart}}</view>
<view class="law-item-time">{{time}}</view>
</view>
<view class="law-item-strips-content">
<rich-text
nodes="{{content}}"
></rich-text>
</view>
<view class="funcs-item-wrapper">
<view class="support-wrapper" bindtap="tapToThumsup">
<view class="thumbs-up-icon">👍🏻</view>
<view class="thumbs-up-sum">{{thumsup}}</view>
</view>
<view class="read-wrapper" bindtap="tapToReadSum">
<view class="read-title">阅读数量</view>
<view class="read-num">{{readSum}}</view>
</view>
</view>
</view>
/* pages/lawItem/lawItem.wxss */
.law-item-wrapper {
box-sizing: border-box;
}
.law-item-total-title {
font-size: 34rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 39rpx;
margin: 29rpx 0 33rpx 22rpx;
}
.law-item-depart-time-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
font-size: 24rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #999999;
line-height: 39rpx;
margin-bottom: 30rpx;
}
.law-item-depart {
margin: 0 23rpx;
}
.law-item-strips-wrapper {
margin-bottom: 45rpx;
}
.law-item-strips-title {
font-size: 26rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #090D9C;
line-height: 39rpx;
margin-left: 30rpx;
position: relative;
}
.law-item-strips-title::before {
content: '';
display: block;
position: absolute;
left: -20rpx;
top: 50%;
width: 14rpx;
height: 14rpx;
border-radius: 50%;
background: #090D9C;
transform: translatey(-50%);
margin-bottom: 20rpx;
}
.law-item-strips-content {
text-indent: 50rpx;
font-family: 'PingFang-SC-Medium';
font-size: 26rpx;
color: #333333;
padding: 0 25rpx;
line-height: 46rpx;
}
.funcs-item-wrapper {
display: flex;
justify-content: space-between;
margin-bottom: 30rpx;
}
.support-wrapper {
display: flex;
align-items: center;
margin-left: 40rpx;
}
.thumbs-up-sum {
color: #1D2089;
margin-left: 20rpx;
}
.read-wrapper {
display: flex;
margin-right: 40rpx;
align-items: center;
}
.read-title {
margin-right: 20rpx;
font-size: 25rpx;
}
.read-num {
color: #A2F02C;
}
\ No newline at end of file
// pages/live/live.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/live/live.wxml-->
<text>pages/live/live.wxml</text>
/* pages/live/live.wxss */
\ No newline at end of file
// pages/loginv2/loginv2.js
import JSEncrypt from '../../utils/jsencrypt.min.js'
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
'2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' +
'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' +
'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' +
'/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' +
'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' +
'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' +
'4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' +
'tTbklZkD2A=='
// 加密
function encrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(txt) // 对需要加密的数据进行加密
}
// 解密
function decrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPrivateKey(privateKey)
return encryptor.decrypt(txt)
}
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
iconImgUrl: 'http://39.102.232.151:8030/cover/tianhongicon.png',
enterImgUrl: 'http://39.102.232.151:8030/cover/企业icon.png',
nameImgUrl: 'http://39.102.232.151:8030/cover/姓名用户名昵称icon.png',
nickNameImgUrl: 'http://39.102.232.151:8030/cover/座席姓名icon.png',
wxImgUrl: 'http://39.102.232.151:8030/cover/微信icon.png',
passwordImgUrl: 'http://39.102.232.151:8030/cover/密码icon.png',
phoneImgUrl: 'http://39.102.232.151:8030/cover/手机号icon.png',
validCodeImgUrl: 'http://39.102.232.151:8030/cover/验证码icon.png',
imgurl: '',
hasSearchResult: false,
curregisterorlogin: false,
userpassorphone: true,
enterpriseId: '',
username: '',
password: '',
repeatPassword: '',
wechat: '',
phone: '',
nickname: '',
entries: [],
entryName: '',
curIdentity: '企业管理',
isRegisterLoading: false,
login1Username: '',
login1Password: '',
login1Code: '',
isLogin1Loading: false,
isLogin2Loading: false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.getCode()
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany/query',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: app.globalData.companyId
},
success: (res) =>{
console.log(res.data, 'thCompany/query')
if (res.data && res.data.length > 0) {
console.log(this.data, 'this.data')
this.setData({
companyName: res.data[0].companyName
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/enterpriseCertificate/pageEnterprise',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyName: res.data[0].companyName
},
success: (res1)=> {
console.log(res1, 'api/enterpriseCertificate/apgeEnterprise')
this.setData({
enters: [...res1.data.content.map(item => {
return {
companyName: item.enterpriseName,
companyId: item.enterpriseId,
emergencyPlan: item.emergencyPlanNum,
dualSystem: item.dualSystemNum,
standardization: item.standardizationNum
}
})]
})
}
})
}
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/*搜索企业1*/
confirmEntryName(event) {
console.log(event, 'hehehe')
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany',
method: 'GET',
data: {
page: 0,
size: 2,
companyName: event.detail.value
},
success: (res) => {
this.setData({
entries: res.data.content,
hasSearchResult: true
})
}
})
},
chosenEntry(event) {
this.setData({
enterpriseId: event.currentTarget.dataset.id,
entryName: event.currentTarget.dataset.name,
hasSearchResult: false
})
console.log(event.currentTarget.dataset.id, 'event.currentTarget.dataset.id')
console.log(event.currentTarget.dataset.name, 'this.currentTarget.dataset.name')
},
closeSearch(event) {
this.setData({
hasSearchResult: false
})
},
/*
* 搜索企业
*/
searchEntries(event) {
// this.isShowSearchEntries = true
this.setData({
isShowSearchEntries: true
})
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany',
method: 'GET',
data: {
page: 0,
size: 3,
companyName: this.data.entryName
},
success: (res) => {
// console.log(res, 'hehexixihaha')
this.setData({
entries: res.data.content
})
}
})
},
/**
* 选中搜索的企业
*/
selectSearchgEntry(event) {
if (event.currentTarget.dataset && event.currentTarget.dataset.entry) {
this.setData({
entryName: event.currentTarget.dataset.entry,
isShowSearchEntries: false
})
this.data.entryId = event.currentTarget.dataset.id
}
},
changeSelectIdentity(event) {
if (event.detail.value === '企业管理') {
this.data.identityOptions[0].checked = true
this.data.identityOptions[1].checked = false
}
if (event.detail.value === '企业员工'){
this.data.identityOptions[0].checked = false
this.data.identityOptions[1].checked = true
}
},
/**
* 注册按钮
*/
registerUser() {
if (!this.data.userName || !this.data.passWord || !this.data.wxNumber || !this.data.PhoneNum || this.entryId === -1) {
wx.showToast({
title: "请输入正确信息",
icon: "error"
})
}
if (this.data.identityOptions[0].checked) {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/signUp' ,
method: 'POST',
data: {
companyId: this.data.entryId,
username: this.data.userName,
password: this.data.passWord,
phone: this.data.PhoneNum,
wechat: this.data.wxNumber,
roles: [
{
id: this.data.enterManagerId,
roleName: '企业管理'
}
]
},
success: (res) => {
if (res.statusCode === 201) {
wx.showToast({
title: '注册已提交',
})
} else if (res.statusCode === 400) {
wx.showToast({
title: '用户名已存在',
icon: 'error'
})
}
}
})
} else {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/signUp' ,
method: 'POST',
data: {
companyId: this.data.entryId,
username: this.data.userName,
password: this.data.passWord,
phone: this.data.PhoneNum,
wechat: this.data.wxNumber,
roles: [
{
id: this.data.enterstaffId,
roleName: '企业员工'
}
]
},
success: (res) => {
if (res.statusCode === 201) {
wx.showToast({
title: '注册已提交',
})
}
}
})
}
},
/**
*
*/
jumptouserpass() {
this.setData({
curLoginOption: "用户\\密码登录"
})
},
jumptophone() {
this.setData({
curLoginOption: "手机号登录"
})
},
getCode() {
wx.showLoading({
title: '正在获取验证码',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/auth/code',
method: 'GET',
success: (res) => {
this.uuid = res.data.uuid
this.setData({
imgurl: res.data.img
}, () => {
wx.hideLoading()
})
},
fail: () => {
wx.hideLoading()
}
})
},
loginInputUserName(event) {
this.data.loginUserName = event.detail.value
},
loginInputPassWord(event) {
console.log(event.detail.value)
this.data.loginPassWord = event.detail.value
},
loginInputCode(event) {
this.data.loginCode = event.detail.value
},
loginByUserPass() {
console.log(this.data.loginUserName)
console.log(this.data.loginPassWord)
console.log(this.data.loginCode)
if (!this.data.loginUserName || !this.data.loginPassWord || !this.data.loginCode) {
wx.showToast({
title: "请输入正确的信息",
icon: "error"
})
return
}
wx.request({
url: app.globalData.appBaseUrl + '/auth/login',
method: 'POST',
data: {
username: this.data.loginUserName,
password: encrypt(this.data.loginPassWord),
code: this.data.loginCode,
uuid: this.uuid
},
success: (res) => {
console.log(res, '前面传过来的 res')
if ((res.statusCode >=200 && res.statusCode <=300) || res.statusCode === 304) {
wx.redirectTo({
url: '/pages/home/home',
success: () => {
wx.showToast({
title: '登录成功',
icon: 'success',
duration: 1000
})
}
})
} else if (res.statusCode === 401 || res.statusCode === 400){
wx.showToast({
title: '验证码过期',
icon: 'error',
duration: 2000
})
this.getCode()
} else {
wx.showToast({
title: '发生错误',
icon: 'error',
duration: 2000
})
}
},
fail: () => {
wx.showToast({
title: "请输入正确的信息",
icon: 'error',
duration: 2000
})
}
})
},
jumpToLogin() {
this.setData({
curregisterorlogin: false
})
},
jumpToRegister() {
this.setData({
curregisterorlogin: true
})
},
jumpToUserPass() {
this.setData({
userpassorphone: true
})
},
jumpToPhoneCode() {
this.setData({
userpassorphone: false
})
},
gotoStaff() {
this.setData({
curIdentity: '企业员工'
})
},
gotoManager() {
this.setData({
curIdentity: '企业管理'
})
},
inputUsername(event) {
this.data.username = event.detail.value
},
inputPassword(event) {
this.data.password = event.detail.value
},
inputRepeatPassword(event) {
this.data.repeatPassword = event.detail.value
},
inputWeChat(event) {
this.data.wechat = event.detail.value
},
inputPhoneNumber(event) {
this.data.phone = event.detail.value
},
inputNickName(event) {
this.data.nickname = event.detail.value
},
registerToEntry(event) {
if (!this.data.entryName) {
wx.showToast({
title: '请选择企业',
icon: 'error'
})
return
}
if (!this.data.username) {
wx.showToast({
title: '请输入用户名',
icon: 'error'
})
return
}
if (!this.data.password) {
wx.showToast({
title: '请输入密码',
icon: 'error'
})
return
}
if (!this.data.wechat) {
wx.showToast({
title: '请输入微信号',
icon: 'error'
})
return
}
if (!this.data.phone) {
wx.showToast({
title: '请输入手机号',
icon: 'error'
})
return
}
if (!this.data.nickname) {
wx.showToast({
title: '请输入昵称',
icon: 'error'
})
return
}
if (this.data.password !== this.data.repeatPassword) {
wx.showToast({
title: '密码不一致',
icon: 'error'
})
return
}
if (!new RegExp("\\d{11}").test(this.data.phone)) {
wx.showToast({
title: '请输入正确的手机号格式',
icon: 'error'
})
return
}
this.setData({
isRegisterLoading: true
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/signUp',
method: 'POST',
data: {
companyId: this.data.enterpriseId,
username: this.data.username,
password: this.data.password,
wechat: this.data.wechat,
phone: this.data.phone,
nickName: this.data.nickname,
tag: this.data.curIdentity
},
success: (res) => {
if (res.statusCode === 201) {
wx.showToast({
title: '注册已提交,请勿重复提交',
icon: 'error'
})
} else {
wx.showToast({
title: '发生错误,请稍后再试',
icon: 'error'
})
}
},
fail: (res) => {
wx.showToast({
title: '发生错误,请稍后再试',
icon: 'error'
})
},
complete: () => {
this.setData({
isRegisterLoading: false
})
}
})
},
getNewCode() {
this.getCode()
},
inputLogin1UserName(event) {
this.data.login1Username = event.detail.value
},
inputLogin1PassWord(event) {
this.data.login1Password = event.detail.value
},
inputLogin1Code(event) {
this.data.login1Code = event.detail.value
},
ClickToLogin1() {
if (!this.data.login1Username) {
wx.showToast({
title: '请输入用户名',
icon: 'error'
})
return
}
if (!this.data.login1Password) {
wx.showToast({
title: '请输入密码',
icon: 'error'
})
return
}
if (!this.data.login1Code) {
wx.showToast({
title: '请输入验证码',
icon: 'error'
})
return
}
this.setData({
isLogin1Loading: true
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/auth/login',
method: 'POST',
data: {
username: this.data.login1Username,
password: encrypt(this.data.login1Password),
code: this.data.login1Code,
uuid: this.uuid
},
success: (res) => {
console.log(res, 'hehehhehe9xixixixixi')
if ((res.statusCode >=200 && res.statusCode <=300) || res.statusCode === 304 ) {
console.log(res, 'login res')
// 保存 token
app.globalData.Authorization = res.data.token
app.globalData.companyId = res.data.user.user.companyId
app.globalData.userInfo = res.data.user.user
const myRoles = ['政府', '运营商', '企业管理', '企业员工', '超级管理员']
let curRole = ''
for (const item of res.data.user.user.roles) {
const tempIndex = myRoles.indexOf(item.name)
if (tempIndex > -1) {
curRole = myRoles[tempIndex]
}
}
app.globalData.curRole = curRole
if (curRole === '企业管理' || curRole === '企业员工') {
wx.request({
url: app.globalData.appBaseUrl + '/api/thCompany/query',
method: 'get',
header: {
Authorization: app.globalData.Authorization
},
data: {
companyId: app.globalData.companyId
},
success: (res) =>{
console.log(res.data, 'thCompany/query')
if (res.data && res.data.length > 0) {
console.log(this.data, 'this.data')
app.globalData.companyName = res.data[0].companyName
}
}
})
}
// 保存 用户名 密码
// wx.setStorageSync('username', this.data.login1Username)
// wx.setStorageSync('password', encrypt(this.data.login1Password))
//
wx.redirectTo({
url: '/pages/home/home',
success: () => {
wx.showToast({
title: '登录成功',
icon: 'success',
duration: 1000
})
}
})
} else if (res.statusCode === 401 || res.statusCode === 400){
if (res.statusCode === 400 && (res.data.message.indexOf('用户名或密码错误') > -1)) {
wx.showToast({
title: '用户名密码错误',
icon: 'error',
duration: 2000
})
return
}
wx.showToast({
title: '验证码过期',
icon: 'error',
duration: 2000
})
this.getCode()
} else {
wx.showToast({
title: '发生错误',
icon: 'error',
duration: 2000
})
}
},
fail: () => {
wx.showToast({
title: "请输入错误的信息",
icon: 'error',
duration: 2000
})
},
complete: () => {
this.setData({
isLogin1Loading: false
})
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<view bindtap="closeSearch">
<view class="icon-login-tianhong-wrapper">
<image class="icon-login-tianhong" src="{{iconImgUrl}}"></image>
</view>
<view class="outer-wrapper">
<view class="inner-wrapper">
<view wx:if="{{curregisterorlogin}}">
<input type="text" confirm-type="search" placeholder="请输入企业名称并搜索" bindconfirm="confirmEntryName" class="enter-name-wrapper" value="{{entryName}}">
<image class="icon-enter-wrapper" src="{{enterImgUrl}}"></image>
</input>
<view class="search-enter-result" wx:if="{{hasSearchResult}}">
<view class="search-enter-result-item" wx:for="{{entries}}" data-id="{{item.companyId}}" data-name="{{item.companyName}}" bindtap="chosenEntry">{{item.companyName}}</view>
</view>
<input type="text" placeholder="请输入您的用户名" bindinput="inputUsername" class="user-name-wrapper">
<image class="icon-user-wrapper" src="{{nameImgUrl}}"></image>
</input>
<input type="text" password="{{true}}" placeholder="请输入您的密码" bindinput="inputPassword" class="pass-word-wrapper">
<image class="icon-pass-wrapper" src="{{passwordImgUrl}}"></image>
</input>
<input type="text" password="{{true}}" placeholder="请重复输入密码" bindinput="inputRepeatPassword" class="pass-word-wrapper">
<image class="icon-pass-wrapper" src="{{passwordImgUrl}}"></image>
</input>
<input type="text" placeholder="请输入微信号" class="wx-number-wrapper" bindinput="inputWeChat">
<image class="icon-wxnumber-wrapper" src="{{wxImgUrl}}"></image>
</input>
<input type="text" placeholder="请输入手机号" class="phone-number-wrapper" bindinput="inputPhoneNumber">
<image class="icon-phone-wrapper" src="{{phoneImgUrl}}"></image>
</input>
<input type="text" placeholder="请输入姓名"
class="nick-name-wrapper" bindinput="inputNickName">
<image class="icon-user-wrapper" src="{{nickNameImgUrl}}"></image>
</input>
<view class="identity-wrapper">
<text class="identity-title-wrapper">身份:</text>
<view class="icon-enter-manager" wx:if="{{curIdentity === '企业管理'}}">企业管理</view>
<view class="icon-enter-staff" wx:if="{{curIdentity === '企业管理'}}" bindtap="gotoStaff">企业员工</view>
<view class="icon2-enter-manager" wx:if="{{curIdentity === '企业员工'}}" bindtap="gotoManager">企业管理</view>
<view class="icon2-enter-staff" wx:if="{{curIdentity === '企业员工'}}">企业员工</view>
</view>
<button class="register-button" bindtap="registerToEntry" loading="{{isRegisterLoading}}">注册</button>
</view>
<view wx:else style="display: flex;flex-direction: column;justify-content: center;height: 100%;">
<view wx:if="{{userpassorphone}}" class="login2-user-pass-wrapper">
<input type="text" placeholder="请输入您的用户名" class="login2-user-wrapper" bindinput="inputLogin1UserName">
<image src="{{nameImgUrl}}" class="login2-user-img-wrapper"></image>
</input>
<input type="text" password="{{true}}" placeholder="请输入您的密码" class="login2-pass-wrapper" bindinput="inputLogin1PassWord">
<image src="{{passwordImgUrl}}" class="login2-pass-img-wrapper"></image>
</input>
<input type="text" placeholder="请输入验证码" class="login2-code-wrapper" bindinput="inputLogin1Code">
<image src="{{validCodeImgUrl}}" class="login2-code-img-wrapper"></image>
</input>
<image src="{{imgurl}}" class="login2-code-image" bindtap="getNewCode"></image>
<view class="login-way--wrapper">
<view class="btn-to-login-by-phone" bindtap="jumpToPhoneCode" style="display: none;">手机验证码登录</view>
</view>
<button class="login2-btn-wrapper" bindtap="ClickToLogin1" loading="{{isLogin1Loading}}">登录</button>
</view>
<view wx:else>
<input type="text" placeholder="请输入手机号" class="login3-phone-wrapper">
<image src="{{phoneImgUrl}}" class="login3-phone-icon-wrapper"></image>
</input>
<input type="text" placeholder="请输入验证码" class="login3-code-wrapper">
<image src="{{validCodeImgUrl}}" class="login3-code-icon-wrapper"></image>
</input>
<view class="jump-to-userpass-login">
<view class="userpass-login" bindtap="jumpToUserPass">用户名密码登录</view>
</view>
<button class="btn-login3" loading="{{isLogin2Loading}}">登录</button>
</view>
</view>
</view>
<view class="login-wrapper" wx:if="{{curregisterorlogin}}" bindtap="jumpToLogin"><text>登录</text></view>
<view class="register-wrapper" wx:if="{{curregisterorlogin}}">注册</view>
<view class="login2-wrapper" wx:if="{{!curregisterorlogin}}">登录</view>
<view class="register2-wrapper" wx:if="{{!curregisterorlogin}}" bindtap="jumpToRegister">注册</view>
</view>
</view>
/* 从这里开始从新开始 从新开始 从新开始 */
.icon-login-tianhong-wrapper {
display: flex;
justify-content: center;
}
.icon-login-tianhong {
width: 152rpx;
height: 152rpx;
margin-top: 60rpx;
margin-bottom: 106rpx;
}
.outer-wrapper {
width: 560rpx;
height: 880rpx;
background-color: #1F208C;
margin: 0 auto;
border-radius: 25rpx;
padding-top: 20rpx;
position: relative;
}
.inner-wrapper {
width: 526rpx;
height: 850rpx;
margin: 0 auto;
background-color: white;
border-radius: 25rpx 0 25rpx 25rpx;
box-sizing: border-box;
padding-top: 30rpx;
position: relative;
}
.search-enter-result {
position: absolute;
left: 50%;
transform: translateX(-50%);
z-index: 9999;
width: 480rpx;
margin: 0 auto;
height: 240rpx;
background-color: teal;
border-radius: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-around;
color: white;
}
.search-enter-result-item {
border-bottom: 1rpx solid white;
padding-left: 20rpx;
}
.login-wrapper {
position: absolute;
left: 0;
top: -79rpx;
width: 260rpx;
height: 96rpx;
background-color: #1F208C;
color: white;
font-size: 32rpx;
font-family: 'PingFang SC';
display: flex;
align-items: center;
justify-content: center;
border-radius: 18rpx 18rpx 0 0 ;
}
.login2-wrapper {
position: absolute;
left: 18rpx;
top: -60rpx;
height: 95rpx;
width: 260rpx;
display: flex;
justify-content: center;
align-items: center;
border-radius: 18rpx 18rpx 0 0 ;
/* box-shadow: 1rpx 1rpx 1rpx 1rpx #eee, 0 1rpx 2rpx 2rpx #fff; */
border-top: 1rpx solid #eee;
border-left: 1rpx solid #eee;
border-right: 1rpx solid #eee;
background-color: white;
color: #2B2C92;
font-size: 29rpx;
}
.register-wrapper {
position: absolute;
right: 19rpx;
top: -60rpx;
height: 80rpx;
width: 260rpx;
display: flex;
justify-content: center;
align-items: center;
border-radius: 18rpx 18rpx 0 0 ;
/* box-shadow: 1rpx 1rpx 1rpx 1rpx #eee, 0 1rpx 2rpx 2rpx #fff; */
border-top: 1rpx solid #eee;
border-left: 1rpx solid #eee;
border-right: 1rpx solid #eee;
background-color: white;
color: #2B2C92;
font-size: 29rpx;
/* box-shadow: 2rpx -2rpx 1.5rpx 1.5rpx rgb(224, 223, 223); */
}
.register2-wrapper {
position: absolute;
right: 0;
top: -79rpx;
box-sizing: border-box;
padding-top: 28rpx;
width: 260rpx;
height: 96rpx;
background-color: #1F208C;
color: white;
font-size: 32rpx;
font-family: 'PingFang SC';
display: flex;
align-items: center;
justify-content: center;
border-radius: 18rpx 18rpx 0 0 ;
}
.enter-name-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 60rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-enter-wrapper {
position: absolute;
left: 0rpx;
bottom: 15rpx;
width: 40rpx;
height: 40rpx
}
.user-name-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 70rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-user-wrapper {
position: absolute;
left: 0rpx;
bottom: 15rpx;
width: 40rpx;
height: 40rpx
}
.pass-word-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 60rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-pass-wrapper {
position: absolute;
left: 0rpx;
bottom: 15rpx;
width: 40rpx;
height: 40rpx
}
.wx-number-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 60rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-wxnumber-wrapper {
position: absolute;
left: 0rpx;
bottom: 15rpx;
width: 40rpx;
height: 40rpx
}
.phone-number-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 60rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-phone-wrapper {
position: absolute;
left: 5rpx;
bottom: 15rpx;
width: 30rpx;
height: 40rpx
}
.nick-name-wrapper {
border-bottom: 1rpx solid #eee;
margin: 0 70rpx 20rpx 70rpx;
padding-left: 60rpx;
height: 70rpx;
font-size: 28rpx;
position: relative;
}
.icon-user-wrapper {
position: absolute;
left: 5rpx;
bottom: 15rpx;
width: 40rpx;
height: 40rpx
}
.identity-wrapper {
display: flex;
margin: 0 70rpx 20rpx 70rpx;
align-items: center;
}
.identity-title-wrapper {
font-size: 26rpx;
font-family: 'Source Han Sans CN';
font-weight: bold;
color: #001245;
}
.icon-enter-manager {
width: 142rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #F2F4F6;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
color: #001245;
font-weight: bold;
margin-left: 16rpx;
}
.icon-enter-staff {
width: 142rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #F2F4F6;
color: #666666;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
margin-left: 16rpx;
}
.icon2-enter-manager {
width: 142rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #F2F4F6;
color: #666666;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
margin-left: 16rpx;
}
.icon2-enter-staff {
width: 142rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #F2F4F6;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
color: #001245;
font-weight: bold;
margin-left: 16rpx;
}
.register-button {
margin-top: 50rpx;
color: white;
border-radius: 50rpx;
background-color: #1F208C;
width: 400rpx!important;
}
.login1-user-pass-wrapper {
}
.login2-user-wrapper {
position: relative;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 70rpx;
padding-left: 60rpx;
height: 60rpx;
}
.login2-user-img-wrapper {
position: absolute;
left: 0;
bottom: 16rpx;
width: 40rpx;
height: 40rpx;
}
.login2-pass-wrapper {
position: relative;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 70rpx;
padding-left: 60rpx;
height: 60rpx;
}
.login2-pass-img-wrapper {
position: absolute;
left: 0;
bottom: 16rpx;
width: 40rpx;
height: 40rpx;
}
.login2-code-wrapper {
position: relative;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 0rpx;
padding-left: 60rpx;
height: 60rpx;
}
.login2-code-img-wrapper {
position: absolute;
left: 0;
bottom: 16rpx;
width: 40rpx;
height: 40rpx;
opacity: 0.5;
}
.login2-code-image {
position: relative;
z-index: 9999;
top: -70rpx;
left: 280rpx;
width: 180rpx;
height: 64rpx;
}
.login-way--wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
margin-bottom: 50rpx;
margin-top: 50rpx;
}
.btn-to-login-by-phone {
height: 56rpx;
border-radius: 21rpx;
background: #F2F4F6;
font-weight: bold;
font-size: 21rpx;
line-height: 56rpx;
padding: 8rpx;
position: relative;
top: -60rpx;
}
.login2-btn-wrapper {
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
position: relative;
top: -60rpx;
height: 75rpx;
}
.login3-phone-wrapper {
position: relative;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx;
padding-left: 60rpx;
height: 60rpx;
}
.login3-phone-icon-wrapper {
position: absolute;
left: 5rpx;
bottom: 16rpx;
width: 30rpx;
height: 40rpx;
}
.login3-code-wrapper {
position: relative;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx;
padding-left: 60rpx;
height: 60rpx;
}
.login3-code-icon-wrapper {
position: absolute;
left: 0rpx;
bottom: 16rpx;
width: 40rpx;
height: 40rpx;
opacity: 0.5;
}
.jump-to-userpass-login {
display: flex;
justify-content: flex-end;
}
.userpass-login {
height: 56rpx;
border-radius: 21rpx;
background: #F2F4F6;
font-weight: bold;
font-size: 21rpx;
line-height: 56rpx;
padding: 8rpx;
margin-bottom: 40rpx;
}
.btn-login3 {
color: white;
border-radius: 30rpx;
background-color: #1F208C;
}
\ No newline at end of file
// logs.js
const util = require('../../utils/util.js')
Page({
data: {
logs: []
},
onLoad() {
this.setData({
logs: (wx.getStorageSync('logs') || []).map(log => {
return {
date: util.formatTime(new Date(log)),
timeStamp: log
}
})
})
}
})
{
"navigationBarTitleText": "查看启动日志",
"usingComponents": {}
}
\ No newline at end of file
<!--logs.wxml-->
<view class="container log-list">
<block wx:for="{{logs}}" wx:key="timeStamp" wx:for-item="log">
<text class="log-item">{{index + 1}}. {{log.date}}</text>
</block>
</view>
.log-list {
display: flex;
flex-direction: column;
padding: 40rpx;
}
.log-item {
margin: 10rpx;
}
// pages/person/person.js
// pages/loginv2/loginv2.js
import JSEncrypt from '../../utils/jsencrypt.min.js'
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
'2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' +
'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' +
'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' +
'/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' +
'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' +
'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' +
'4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' +
'tTbklZkD2A=='
// 加密
function encrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(txt) // 对需要加密的数据进行加密
}
// 解密
function decrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPrivateKey(privateKey)
return encryptor.decrypt(txt)
}
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
headPotraitPic: 'https://pic1.zhimg.com/80/v2-5f2e129e114b573ce25128ec0f519a46_720w.jpg',
nameImgUrl: 'http://39.102.232.151:8030/cover/搜索icon.png',
username: '小a',
phone: '1888888888',
email: '112233@qq.com',
wechat: '',
nickName: '',
personIdentity: '',
curChosenTab: '个人中心',
isPullDown: false,
staffList: [
],
topAnimation: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const animation = wx.createAnimation({
delay: 500,
timingFunction: 'linear'
})
this.animation = animation
// console.log(app.globalData, 'app.globalData')
this.setData({
personIdentity: app.globalData.curRole
})
this.setData({
headPotraitPic: app.globalData.appBaseUrlV2 + '/avatar/' + app.globalData.userInfo.avatarName,
username: app.globalData.userInfo.username ? app.globalData.userInfo.username : '',
phone: app.globalData.userInfo.phone ? app.globalData.userInfo.phone : '',
email: app.globalData.userInfo.email,
wechat: app.globalData.userInfo.wechat ? app.globalData.userInfo.wechat : '',
nickName: app.globalData.userInfo.nickName ? app.globalData.userInfo.nickName : ''
})
console.log(app.globalData.userInfo, 'app.globalData.userInfo')
if (app.globalData.curRole === '企业管理' && (!(app.globalData.companyId === -1 || app.globalData.companyId === null))) {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/findSignUpCompanyStaff',
method: 'GET',
data: {
sort: 'verify_status,asc'
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'staff list staff list staff list')
if (res.data && res.data.content) {
this.setData({
staffList: res.data.content
})
}
}
})
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '个人中心'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 跳转到个人中心
*/
jumptoperson() {
if (this.data.curChosenTab !== '个人中心') {
this.setData({
curChosenTab: '个人中心'
})
}
},
/**
* 跳转到企业员工管理
*/
jumptomanage() {
if (this.data.curChosenTab !== '企业管理') {
this.setData({
curChosenTab: '企业管理'
})
}
},
pullDownRefresh() {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/findSignUpCompanyStaff',
method: 'GET',
data: {
sort: 'verify_status,asc'
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'staff list staff list staff list')
if (res.data && res.data.content) {
this.setData({
staffList: res.data.content
})
}
},
complete: () => {
this.setData({
isPullDown: false
})
}
})
},
verifyStaff(event) {
if (event.currentTarget && event.currentTarget.dataset) {
console.log(event.currentTarget.dataset.id, 'event.currentTarget.dateset.id')
console.log(app.globalData.Authorization, 'app.globalData.Authorization')
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/verify',
method: 'PUT',
header: {
Authorization: app.globalData.Authorization
},
data: {
userId: event.currentTarget.dataset.id,
verifyCase: true
},
success: (res) => {
console.log(res, 'verify staff res ')
if (res.statusCode === 204) {
this.initStaffs()
}
},
complete: () => {}
})
}
},
initStaffs() {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/findSignUpCompanyStaff',
method: 'GET',
data: {
sort: 'verify_status,asc'
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
if (res.data && res.data.content) {
this.setData({
staffList: res.data.content
})
}
},
complete: () => {
}
})
},
deleteStaff(event) {
if (event.currentTarget && event.currentTarget.dataset) {
wx.showModal({
title: '提示',
content: '此操作将永久删除该用户,是否继续?',
success: (res) => {
if (res.confirm) {
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/delete',
method: 'DELETE',
data: [event.currentTarget.dataset.id],
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
if (res.statusCode === 204) {
this.initStaffs()
}
},
complete: () => {
}
})
}
}
})
}
},
searchStaff(event) {
wx.showLoading({
title: '正在加载',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/findSignUpCompanyStaff',
method: 'GET',
data: {
sort: 'verify_status,asc',
nameKeyword: event.detail.value
},
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
if (res.data && res.data.content) {
this.setData({
staffList: res.data.content
})
}
},
complete: () => {
wx.hideLoading()
}
})
},
changeUserPortrait(event) {
// event
wx.chooseImage({
count: 1,
success: (res) => {
console.log(res, 'chooseImage chooseImage')
if (res.tempFilePaths.length && res.tempFilePaths.length > 0) {
wx.uploadFile({
filePath: res.tempFilePaths[0],
name: 'file',
url: app.globalData.appBaseUrlV2 + '/api/thUser/updateAvatar',
success: (res) => {
console.log(res, 'upload avatar')
if (res.statusCode === 200) {
//https://safe.c-icc.cn:8035/avatar
this.setData({
headPotraitPic: app.globalData.appBaseUrlV2 + '/avatar/' + JSON.parse(res.data).avatar
})
}
},
header: {
Authorization: app.globalData.Authorization
}
})
}
},
fail: () => {},
complete: () => {}
})
},
changeNickName(event) {
// event
wx.showModal({
title: '输入修改后的姓名',
editable: true,
success(res) {
console.log(res, 'changeNickName changeNickName')
if (res.confirm) {
//wx.request
}
}
})
},
updatePassword(event) {
console.log(event, 'event')
console.log(this.animation, 'heheanimation')
this.animation.bottom(0).step()
this.setData({
topAnimation: this.animation.export()
})
},
cancelUpdatePassword() {
this.animation.bottom('-100%').step()
this.setData({
topAnimation: this.animation.export()
})
},
confirmUpdatePassword() {
if (!(this.updateNewPassword && this.updateRepeatNewPassword && this.updateOldPassword)) {
wx.showToast({
title: '请输入密码',
icon: 'error'
})
return
}
if (this.updateNewPassword !== this.updateRepeatNewPassword) {
wx.showToast({
title: '密码不一致',
icon: 'error'
})
return
}
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/thUser/updatePass',
method: "POST",
header: {
Authorization: app.globalData.Authorization
},
data: {
newPass: encrypt(this.updateNewPassword),
oldPass: encrypt(this.updateOldPassword)
},
success: (res) => {
console.log(res, 'updateNewPassword')
},
fail: () => {},
complete: () => {
this.animation.bottom('-100%').step()
this.setData({
topAnimation: this.animation.export()
})
}
})
},
inputOldPassword(event) {
this.updateOldPassword = event.detail.value
},
inputNewPassword(event) {
this.updateNewPassword = event.detail.value
},
inputRepeatNewPassword(event) {
this.updateRepeatNewPassword = event.detail.value
},
relogin(event) {
wx.navigateTo({
url: '/pages/loginv2/loginv2',
success: () => {}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/person/person.wxml-->
<view class="person-center-wrapper">
<view wx:if="{{personIdentity === '企业管理'}}" class="page-divide">
<view wx:if="{{curChosenTab === '个人中心'}}" class="person-chosen" bindtap="jumptoperson">个人中心</view>
<view wx:else class="person" bindtap="jumptoperson">个人中心</view>
<view wx:if="{{curChosenTab === '企业管理'}}" class="manager-chosen" bindtap="jumptomanage">企业员工管理</view>
<view wx:else class="manager" bindtap="jumptomanage">企业员工管理</view>
</view>
<view wx:if="{{curChosenTab === '个人中心'}}">
<view class="head-portrait-wrapper">
<view class="head-portrait-title">头像</view>
<view class="head-portrait-img" bindtap="changeUserPortrait">
<image class="head-potrait" src="{{headPotraitPic}}"></image>
</view>
</view>
<view class="user-name-wrapper">
<view class="user-name-title">用户名</view>
<view class="user-name">{{username}}</view>
</view>
<view class="user-name-wrapper">
<view class="user-name-title">姓名</view>
<view class="user-name">{{nickName}}</view>
</view>
<view class="phone-wrapper">
<view class="phone-title">手机号</view>
<view class="phone">{{phone}}</view>
</view>
<view class="email-wrapper">
<view class="email-title">微信号</view>
<view class="email">{{wechat}}</view>
</view>
<button class="btn-to-update-password" bindtap="updatePassword">更改密码</button>
<button class="btn-to-relogin" bindtap="relogin">退出登录</button>
</view>
<view wx:else>
<view class="staff-search-wrapper">
<input type="text" placeholder="请搜索员工姓名" class="staff-name-input" confirm-type="search" bindconfirm="searchStaff">
<image class="staff-image-wrapper" src="{{nameImgUrl}}"></image>
</input>
</view>
<scroll-view
scroll-y="true" class="staff-list-scroll"
refresher-enabled="false"
refresher-threshold="30"
refresher-default-style="black"
refresher-triggered="{{isPullDown}}"
bindrefresherrefresh="pullDownRefresh"
>
<view wx:for="{{staffList}}" class="staff-wrapper">
<view class="staff-name-wrapper">
<view class="staff-name-title">姓名:</view>
<view class="staff-name-content">{{item.nickName}}</view>
</view>
<view class="staff-phone-wrapper">
<view class="staff-phone-title">电话: </view>
<view class="staff-phone-content">{{item.phone}}</view>
</view>
<view class="staff-wx-wrapper">
<view class="staff-wx-title">微信号:</view>
<view class="staff-wx-content">{{item.wechat}}</view>
</view>
<view wx:if="{{item.verifyStatus === 1}}" class="examine">已审核</view>
<view wx:else class="noexamine" data-id="{{item.id}}" bindtap="verifyStaff">审核</view>
<view class="delete-staff" data-id="{{item.id}}" bindtap="deleteStaff">删除</view>
</view>
</scroll-view>
</view>
<view class="change-password-wrapper"
animation="{{topAnimation}}"
>
<view class="change-password-now-wrapper">
<view class="update-password-item1">
<view class="item1-old-password">旧密码</view>
<input type="text" password="true" class="change-password-input item1-change-password" bindinput="inputOldPassword"></input>
</view>
<view class="update-password-item2">
<view class="item2-old-password">新密码</view>
<input type="text" password="true" class="change-password-input item2-change-password"
bindinput="inputNewPassword"></input>
</view>
<view class="update-password-item3">
<view class="item3-old-password">确认新密码</view>
<input type="text" password="true" class="change-password-input"
bindinput="inputRepeatNewPassword"
></input>
</view>
<view class="change-password-btns-wrapper">
<view class="cancel-change-password" bindtap="cancelUpdatePassword">取消</view>
<view class="confirm-change-password" bindtap="confirmUpdatePassword">确认</view>
</view>
</view>
</view>
</view>
\ No newline at end of file
/* pages/person/person.wxss */
.person-center-wrapper {
height: 100vh;
background-color: #F4F4F5;
box-sizing: border-box;
padding: 23rpx 0;
overflow: hidden;
position: relative;
}
.page-divide {
display: flex;
height: 60rpx;
text-align: center;
}
.person-chosen {
flex-basis: 50%;
color: #1d2089;
border-bottom: 4rpx solid #1d2089;
}
.person {
flex-basis: 50%;
border-bottom: 2rpx solid #eee;
}
.manager-chosen {
flex-basis: 50%;
color: #1d2089;
border-bottom: 4rpx solid #1d2089;
}
.manager {
flex-basis: 50%;
border-bottom: 2rpx solid #eee;
}
.head-portrait-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 750rpx;
height: 168rpx;
margin: 0rpx 0rpx 20rpx 0rpx;
/* box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee; */
/* padding: 0 20rpx 0 20rpx; */
/* border-radius: 20rpx; */
background-color: white;
}
.head-portrait-title {
font-size: 34rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin-left: 20rpx;
}
.head-portrait-img {
width: 130rpx;
height: 130rpx;
margin-right: 20rpx;
overflow: hidden;
border-radius: 8rpx;
}
.head-potrait {
width: 130rpx;
height: 130rpx;
}
.user-name-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 750rpx;
height: 85rpx;
margin: 23rpx 0rpx 23rpx 0rpx;
/* box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee; */
/* padding: 0 20rpx 0 20rpx; */
/* border-radius: 20rpx; */
background-color: white;
}
.user-name-title {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #666666;
margin-left: 20rpx;
}
.user-name {
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin-right: 20rpx;
}
.phone-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 750rpx;
height: 85rpx;
margin: 23rpx 0rpx 23rpx 0rpx;
/* box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee; */
/* padding: 0 20rpx 0 20rpx; */
/* border-radius: 20rpx; */
background-color: white;
}
.phone-title {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #666666;
margin-left: 20rpx;
}
.phone {
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin-right: 20rpx;
}
.email-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 750rpx;
height: 85rpx;
margin: 20rpx 0rpx 20rpx 0rpx;
/* box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1rpx -1rpx 1rpx 1rpx #eee; */
/* padding: 0 20rpx 0 20rpx; */
/* border-radius: 20rpx; */
background-color: white;
}
.email-title {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #666666;
margin-left: 20rpx;
}
.email {
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin-right: 20rpx;
}
.btn-to-update-password {
margin-top: 40rpx;
background-color: #1d2089;
color: white;
width: 450rpx;
border-radius: 30rpx;
}
.staff-search-wrapper {
display: flex;
align-items: center;
}
.staff-name-input {
border-bottom: 2rpx solid #1d2089;
padding-left: 60rpx;
margin-left: 20rpx;
margin-top: 20rpx;
margin-right: 60rpx;
position: relative;
}
.staff-image-wrapper {
position: absolute;
width: 40rpx;
height: 40rpx;
left: 0;
bottom: 0;
}
.search-staff-byname {
width: 180rpx!important;
height: 60rpx!important;
background: #1d2089;
color: white;
display: flex;
justify-content: center;
align-items: center;
font-size: 30rpx;
margin: 0 0rpx!important;
margin-top: 10rpx!important;
}
.staff-wrapper {
margin: 22rpx auto;
background-color: white;
position: relative;
width: 700rpx;
box-shadow: 2rpx 2rpx 2rpx 2rpx #666666;
border-radius: 20rpx;
padding: 20rpx;
}
.staff-name-wrapper{
display: flex;
padding: 10rpx;
}
.staff-name-title {}
.staff-name-content {
margin-left: 10rpx;
}
.staff-phone-wrapper {
display: flex;
padding: 10rpx;
}
.staff-phone-title {}
.staff-phone-content {
margin-left: 10rpx;
}
.staff-wx-wrapper {
display: flex;
padding: 10rpx;
}
.staff-wx-title {}
.staff-wx-content {
margin-left: 10rpx;
}
.staff-list-scroll {
position: absolute;
bottom: 0;
left: 0;
right: 0;
top: 160rpx;
}
.examine {
position: absolute;
right: 10rpx;
top: 10rpx;
}
.noexamine {
position: absolute;
right: 10rpx;
top: 10rpx;
width: 100rpx;
height: 50rpx;
background-color: #1d2089;
color: white;
display: flex;
justify-content: center;
align-items: center;
}
.delete-staff {
position: absolute;
right: 10rpx;
bottom: 10rpx;
background-color: #CA0000;
color: white;
width: 160rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
}
.change-password-wrapper {
position: absolute;
width: 100%;
height: 100%;
bottom: -100%;
background: #eee;
display: flex;
align-items: center;
justify-content: center;
}
.change-password-now-wrapper {
width: 640rpx;
height: 560rpx;
background-color: white;
border-radius: 30rpx;
position: relative;
}
.update-password-item1 {
display: flex;
margin-top: 80rpx;
align-items: flex-end;
/* justify-content: space-between; */
/* padding: 0 100rpx */
}
.item1-old-password {
margin-left: 100rpx;
font-size: 40rpx;
}
.change-password-input {
padding-left: 20rpx;
margin-left: 10rpx;
}
.update-password-item2 {
display: flex;
/* justify-content: space-between; */
/* padding: 0 100rpx */
margin-top: 80rpx;
align-items: flex-end;
}
.item2-old-password {
margin-left: 100rpx;
font-size: 40rpx;
}
.item2-change-password {
padding-left: 20rpx;
margin-left: 10rpx;
}
.change-password-input {
border-bottom: 1rpx solid rgb(129, 129, 129);
}
.update-password-item3 {
display: flex;
margin-top: 80rpx;
align-items: flex-end;
}
.item3-old-password {
margin-left: 18rpx;
font-size: 40rpx;
}
.change-password-btns-wrapper {
position: absolute;
bottom: 0;
height: 110rpx;
width: 100%;
background-color: #B3B3B3;
border-radius: 0 0 30rpx 30rpx;
display: flex;
}
.cancel-change-password {
flex-basis: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 46rpx;
background-color: #C1C1C1;
border-radius: 0 0 0 30rpx;
}
.confirm-change-password {
flex-basis: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 46rpx;
border-left: 2rpx solid #000000;
}
.btn-to-relogin {
background-color: #F00000;
border-radius: 30rpx;
width: 240rpx;
margin-top: 40rpx;
color: white;
}
\ No newline at end of file
// pages/sign/sign.js
// 使用 wx.createContext 获取绘图上下文 context
var context = null;
var isButtonDown = false;
var arrx = [];
var arry = [];
var arrz = [];
var canvasw = 0;
var canvash = 0;
// 获取系统信息
wx.getSystemInfo({
success: function (res) {
canvasw = res.windowWidth; // 设备宽度
canvash = res.windowWidth*7/15;
}
});
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const SelectorQuery = wx.createSelectorQuery()
const canvasElement = SelectorQuery.select('#canvas')
console.log(canvasElement.context(res => {
context = res.context
}))
SelectorQuery.exec((res) => {
console.log(res, 'xixixixixixi')
})
// context = canvasElement.getContext('2d')
// context.beginPath()
// context.setStrokeStyle('#000000')
// context.setLineWidth(4)
// context.setLineCap('round')
// context.setLineJoin('round')
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
*
*/
canvasIdErrorCallback: function(e) {
console.log(e.detail.errMsg)
},
canvasStart: function(event) {
isButtonDown = true;
arrz.push(0);
arrx.push(event.changedTouches[0].x);
arry.push(event.changedTouches[0].y);
},
canvasMove: function(event) {
if (isButtonDown) {
arrz.push(1)
arrx.push(event.changedTouches[0].x);
arry.push(event.changedTouches[0].y);
}
for (let i = 0; i < arrx.length; i++) {
if (arrz[i] == 0) {
context.moveTo(arrx[i], arry[i])
} else {
context.lineTo(arrx[i],arry[i])
}
}
context.clearRect(0, 0, canvasw, canvash);
context.setStrokeStyle('#000000');
context.setLineWidth(4);
context.setLineCap('round');
context.setLineJoin('round');
context.stroke();
context.draw(false);
},
canvasEnd: function(event) {
isButtonDown = false
},
cleardraw: function() {
// 清除画布
arrx = []
arry = []
arrz = []
context.clearRect(0, 0, canvasw, canvash)
context.draw(true)
},
getimg: function() {
if (arrx.length == 0) {
wx.showModal({
title: '提示',
content: '签名内容不能为空!',
showCancel: false
});
return false;
}
// 生成图片
// wx.canvasToTempFilePath({
// canvasId: 'canvas',
// success: function(res) {
// console.log(res.tempFilePath)
// }
// })
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/sign/sign.wxml-->
<canvas class="canvas" id="canvas" canvas-id="canvas" disable-scroll="true" bindtouchstart="canvasStart" bindtouchmove="canvasMove" bindtouchend="canvasEnd" touchcancel="canvasEnd" binderror="canvasIdErrorCallback"></canvas>
<button type="default" bindtap="cleardraw">清除画布</button>
<button type="default" bindtap="getimg">导出图片</button>
\ No newline at end of file
/* pages/sign/sign.wxss */
\ No newline at end of file
// pages/teach/teach.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
yesicon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAsVJREFUWEfNVz1oFEEU/t7iiQoaRG0EiVoIlnY2WgUsbnM7m5BTItFCQVSCjYWgnYpFGiGiFhaiKLnE7O5d7sQilTZWWgoW/hYWRkIUf+Bkn8xkN9zt7dzuXfaIW92x733ft/PevPmGkPIplAub/b80AIOOAtgHYDuAbUH6NwALAN7C55KxjucrVuVHGmhKCso79n4iHgdwDMDWpPjg/SKAKWaarA25b9rltBWQ96xrBBoHY0tK4uYwwncGT9ZE+YouXyvAdMVzAIe6Im5NelG1vcNxWLECTFd8DWqcEb+CWaja3o4oYIuAvCveE7A7S+YQi4EPNdvb04jdJGDQE9PMGOkFeYhJhJk54RVX/oc/VMMxXe4l+cpKEF8PG1OtgNpqBr/suts7VS13h08H5RZVAkxX3AZwtlOchPg5ZnpIxLLmcmWjW/lO1fbO0cD0SN+GXP0jgL6sBETrbLriGYAjEfylP/VcPw26YoyBB70il7i65ibgBJmueAJgOAsB0S9X5K4oMlDS4M9KAa8AHFitgFhyzxplpkdtsF9LAZ8A7NIEhY00Jj9GO88jezvYWSeJ+H7Ch32WAn4C2BQNjE4tbR3jyF1xioB7KVb1l1aATF7vGzudYedLCBQVoVn2M8x0NwW5DFECtCWIJ1ge13HvTM8+D+ZbKcllmCpB2ybUiWic58EwuwDgZgfkMlQ14RQAabO0T5yIxuC8Y10kookOyWV4icxZy4ZBTlKyToTp2JdAfCMpP/a9z0OkzKZvyFGc6PdiRqy0Wle7IgcWDcPv7+YwegpgAsynQXS8S3KZtnwYBUNjbY9jJWItDUm4jBk7YV11mhxyiyntkSMOxbQ441hb3gtnHOeIpSrtxSRLh9xukP2/V7OwaA2X09EOfOMSgMervpw2trE0rxtz9QIDFoC9muv5OwLKv+u5ynxxRopIfP4Bc1M7FOUcJGEAAAAASUVORK5CYII=',
erroricon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAqpJREFUWEfNlz2IE1EQx/+zeyFyWCgW6lWKnYJmT9ErbMy+5PBC/CjUQ5vDQg4LsVGuELQ5BBEsRMVr0qiHnmChyRHyAluICB63aqGNqIX4gYoiyhnc7JON2bgbs9mPS4gLaTbz/vPbefNm5hEiPE8zmeW/KpVVErDSBD7E4vH3G/P5LxGkQEEWPRseXv3TMEYI2C6IsgSsaF4ngM8kxF0B3F/S11dYXyy+C6LdFsByXKlWjwCwfgNBBOs2bwFMxWV5yg/EE0Bn7CCEmATRmhCOm01fATilcH7DS6MlwDxjEwScXYRj11ICLiY4P9ZK7x8APZXaByFudcq5QyencH64WdcF0EXntt/zCucnnBANgLl0eptsmg+78OUuSQEcHeT8iv2yAaAzdg3AoW4DAHheicWGhmZnv1m+agDzyeROkqRCG+cnAfQDOOMLSHQbQlwCcAfAMg9762RM/gVQ1WkiGvUSj8vygHWedcZO+0Dc+2oYe3domqEzpgNIeGi+VDhfVwOYy2b75YWFj/Uv9GKYUTjfb/3pBSGActww9mzQtO8BQAGijFIqFehJOj1qmua0b2gBbwghHlSr1d1bNO1TIOcABNHVwVJpnHTGzgFwHY02MK0gdMkwdm3StDdBndf1HymcbyVdVXMgGgsQAdvEBWHK8vXNxeKLkM4BIV4r5fJaKwJ5ACMhACzTBkS7vPDR/KFwvvQ/AFjEFjxW1QOJcvlmpCg4tiBaEiaTY5CknHM7QubBnySMcgznU6lxEqJRz6NANI5hhEJ0HMCFFgnmW6xca+xCVOsFAUtxgEHFCRGsFHe8GQEzAC6Hakb1LO5dO7YAej6Q1KLQvXnQzj/vkcy26CKE/1BqQwTI9lCtI9RY3ohELy8mNkRPr2bOGPfscuq10Z28nv8GJo17MKYlOKAAAAAASUVORK5CYII=',
searchIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAeCAYAAADU8sWcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3OUEyMURGNjE1M0IxMUVDQTdBRjk3NTlCRkY2MTk5QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3OUEyMURGNzE1M0IxMUVDQTdBRjk3NTlCRkY2MTk5QSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjc5QTIxREY0MTUzQjExRUNBN0FGOTc1OUJGRjYxOTlBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjc5QTIxREY1MTUzQjExRUNBN0FGOTc1OUJGRjYxOTlBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+4+94kQAAAydJREFUeNq8l2tozXEYx885Y4whG5l70lBjm8vcX4iySBpKUW7thcILvNCWXDMrXpGEvOCVkrTSmJI7Iy/mEsXI3Vgzu5TbtjOfR99z+jnOzs7sHE99Or/zP//z/z6/5/f7Pc/z9xYUFHiisNEwHjJhOPSFLvADPsFzqIBHUFVcXNwazUO97YhPgcUwDXo4139CCyRCgnP9A1yFM/C2PSfaEk+G9ZAHXeE73INyeAGfoRm6QxpkwEwYY8+EGjgGJTjg74j4UNgJWdAE5+C0QvuX8fDfn4WFhRaBGbAcJsqJU3CYe76F+68vjPA+Cb+BLfb8toRDnGiB6ww3wiFFZhlslmMRxZNgG6RDJWyCGxDV5nGc+A4nGe5S5BZBfjgHXPF87ehq2AqvPZ0wHLjAx345sMqWAgd84cRHwVKND8JLT2ysBMqgG6zUBv1D3DbGQh2lW3Cxo6GOMHvb6cehAaZCtjt7GwyA6fp+NlbCjgPvNXuzOZpsUDwbhsE7uOuJj11SUsrRxg6KZ2j8UJkrHvZKaXiQQei9AfHBzg3xMsuQVRqnBULvUyo1q4ujuB23Rid1B8MeyL0JcRT3Os/3u+KBGfeLo7iV3z6hEfY5mSw9juK91Ac0qey2BsQrdNGKSUqcxDPlgBWo6kCdN/En8FRhme0mgRjafGmVa6LBsFvqu6zvS9zdGAvjTE9WJ/RVOv7QwlJqbQ+MhBWxmj3CvflYqw1nKbbSba0C4tYWHdXYqs/czjqgArIBxoHl9xPurEPreZnangTV83n/6gDCSeqC8qRxAD6GNpShbdQRLYH9eTusc85ntMLWGxSp6/U51Sw53OF3zTbFHqhXI7gGZqmBvAa16s1CBa1JGAIL1Db1VCEpVQRzraHgvt3MviGavt3WfbWSj4X/C9xXl1OjCmgNyEC9VGQ5KfSKtc4IVSI4ifFe5ZDb1idyvT6al4YUnf1c1f1Ie6BR5/g83EGg2YnMBC1Ff3VLO/i9zhvl61Ki0uNYGAGpzuuSlcpn8FjZy9/GXsjRkqbKgaJoxSO1SR3ZjFlaAmvdbvo8/9Fw9IH5oBxf+0uAAQADzexIIUoooQAAAABJRU5ErkJggg==',
animationSearch: {},
teachList: [
{
cover: 'http://39.102.232.151:8030/cover/teach1.jpg',
introduce: '请大家认真听讲,认真学习、记录,该培训视频和考试要求在一周内完成。-----山东弘煜质检技术服务有限公司祝大家顺利取证',
title: '安全教育培训课程(一)',
sum: 6,
isLearnedSum: 3,
validDate: 6,
price: 300,
isBuyed: false,
courses: [
{
title: '安全生产培训教材',
fileType: 'pdf',
fileUrl: '',
process: 100
},
{
title: '2号令生产安全事故应急预案管理办法',
fileType: 'pptx',
fileUrl: '',
process: 100
},
{
title: '安全管理与安全防护(一)',
fileType: 'mp4',
fileUrl: 'http://39.102.232.151:8030/video/8.mp4',
process: 100
},
{
title: '安全管理与安全防护(二)',
fileType: 'mp4',
fileUrl: 'http://39.102.232.151:8030/video/9.mp4',
process: 54
},
{
title: '安全管理与安全防护(三)',
fileType: 'mp4',
fileUrl: 'http://39.102.232.151:8030/video/10.mp4',
process: 50
}
]
},
{
cover: 'http://39.102.232.151:8030/cover/teach2.jpg',
introduce: '请大家认真听讲,认真学习、记录,该培训视频和考试要求在一周内完成。-----山东弘煜质检技术服务有限公司祝大家顺利取证',
title: '安全教育培训课程(二)',
sum: 6,
isLearnedSum: 3,
validDate: 6,
price: 300,
isBuyed: false,
courses: [
{
title: '安全生产培训教材',
fileType: 'pdf',
fileUrl: '',
process: 100
},
{
title: '2号令生产安全事故应急预案管理办法',
fileType: 'mp4',
fileUrl: '',
process: 100
},
{
title: '安全管理与安全防护(一',
fileType: 'mp4',
fileUrl: '',
process: 100
},
{
title: '安全管理与安全防护(二)',
fileType: 'mp4',
fileUrl: '',
process: 54
},
{
title: '安全管理与安全防护(三)',
fileType: 'mp4',
fileUrl: '',
process: 50
},
{
title: '应急管理部政策法规司新安全生产法修改权威解读',
fileType: 'wmv',
fileUrl: '',
process: 0
}
]
}
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '在线培训'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
// if (this.repAnimation) {
// this.repAnimation.width('50%').step()
// this.setData({
// animationSearch: this.repAnimation.export()
// })
// }
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 用户输入课程名称
*/
inputSearchCourse(event) {
console.log(event.detail.value, 'ehheheheheh')
this.searchCourse = event.detail.value
},
/**
* 用户搜索课程
*/
searchTeachCourse() {
},
/**
* 获取焦点
*/
searchCoursefocus(event) {
const repAnimation = wx.createAnimation({
duration: 50,
timingFunction: 'step-start'
})
this.repAnimation = repAnimation
repAnimation.translateX('0rpx').width('100%').step()
this.setData({
animationSearch: repAnimation.export()
})
},
/**
* 跳转到真实课程
*/
LinkToCourse(event) {
console.log(event.target.dataset.index)
app.globalData.currentCourse = this.data.teachList[event.target.dataset.index]
wx.navigateTo({
url: '/pages/course/course',
success: function(event) {}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/teach/teach.wxml-->
<view class="teach-total-wrapper">
<view class="teach-search-wrapper">
<input type="text" class="teach-input"
animation="{{animationSearch}}"
confirm-type="search"
placeholder="请输入课程名称"
bindinput="inputSearchCourse"
bindconfirm="searchTeachCourse"
bindfocus="searchCoursefocus">
<image class="search-icon-img" src="{{searchIcon}}"></image>
</input>
</view>
<scroll-view scroll-y="true"
class="teach-list-scroll">
<view wx:for="{{teachList}}" class="course-list-wrapper">
<view class="cover-wrapper" data-index="{{index}}" bindtap="LinkToCourse">
<image src="{{item.cover}}" data-index="{{index}}" class="course-cover"></image>
<view data-index="{{index}}" class="introduce-wrapper">
课程介绍:
<view data-index="{{index}}">{{item.introduce}}</view>
</view>
</view>
<view class="course-subject">课程题目: {{item.title}}</view>
<view class="sum-price-wrapper">
<view class="course-sum-wrapper">课程数量: <span>{{item.sum}}</span>课时, 已经学习了<span>{{item.isLearnedSum}}</span>课时</view>
<view class="price-wrapper">
价格: <span class="price-degree">{{item.price}}</span>元
</view>
</view>
<view class="learn-valid-date-btn">
<view class="learn-valid-wrapper">学习有效期: <span class="valid-date">{{item.validDate}}</span><span class="months">个月</span></view>
<view class="buyCourse-wrapper">购买课程</view>
</view>
</view>
</scroll-view>
</view>
\ No newline at end of file
/* pages/teach/teach.wxss */
.teach-total-wrapper {
width: 100vw;
height: 100vh;
box-sizing: border-box;
padding-top: 20rpx;
}
.teach-search-wrapper {
width: 711rpx;
height: 67rpx;
margin: 0 20rpx auto;
background: #F4F4F5;
border-radius: 34rpx;
display: flex;
justify-content: center;
overflow: hidden;
}
.teach-input {
width: 290rpx;
height: 67rpx;
box-sizing: border-box;
border-radius: 34rpx;
position: relative;
padding-left: 53rpx;
/* transform: translateX(42rpx); */
}
.search-icon-img {
position: absolute;
left: 10rpx;
top: 50%;
/* transform: translateY(-50%) scale(1.4); */
transform: translateY(-50%) scale(0.9);
width: 40rpx;
height: 40rpx;
}
.teach-list-scroll {
width: 750rpx;
height: calc(100vh - 120rpx);
padding: 12rpx;
box-sizing: border-box;
}
.course-list-wrapper {
width: 710rpx;
height: 490rpx;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1.5rpx -1.5rpx 1.5rpx 1.5rpx #eee;
border-radius: 20rpx;
margin: 30rpx auto;
}
.cover-wrapper {
width: 710rpx;
height: 308rpx;
position: relative;
}
.course-cover {
width: 100%;
height: 100%;
}
.introduce-wrapper {
display: none;
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 13rpx 18rpx 11rpx 17rpx;
background: #000000;
opacity: 0.6;
font-size: 26rpx;
line-height: 36rpx;
color: white;
}
.course-subject {
font-size: 28rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
line-height: 45rpx;
margin: 20rpx 0 14rpx 14rpx;
}
.sum-price-wrapper {
display: flex;
justify-content: space-between;
padding: 0 27rpx 0 15rpx;
align-items: center;
}
.course-sum-wrapper {
font-size: 24rpx;
color: #333333;
}
.price-wrapper{
font-size: 24rpx;
color: #333333;
display: none;
}
.price-degree {
color: #1A1EA0;
font-size: 34rpx;
font-weight: bold;
}
.learn-valid-date-btn {
display: flex;
justify-content: space-between;
padding: 0 22rpx 0 16rpx;
}
.learn-valid-wrapper {
font-size: 24rpx;
color: #333333;
}
.valid-date {
color: #090D9C;
font-size: 34rpx;
font-weight: bold;
}
.months {
color: #090D9C;
font-size: 24rpx;
}
.buyCourse-wrapper {
width: 144rpx;
height: 48rpx;
background: #090D9C;
border-radius: 8rpx;
color: white;
display: flex;
justify-content: center;
align-items: center;
display: none;
}
\ No newline at end of file
// pages/testpaper/testpaper.js
Page({
/**
* 页面的初始数据
*/
data: {
singleQuestions: [
{
questionType: 'single',
questionOutline: '生产经营单位的( )是本单位安全生产第一责任人,对本单位的安全生产工作全面负责。',
questionList: [
'主要负责人',
'董事长',
'总经理',
'分管负责人'
]
},
{
questionType: 'single',
questionOutline: '《安全生产法》规定:( )发现危及从业人员生命安全的情况时,有权向生产经营单位建议组织从业人员撤离危险场所。',
questionList: [
'工会',
'从业人员',
'团队管理方面',
'安全管理人员'
]
},
{
questionType: 'single',
questionOutline: '《安全生产法》规定:事故调查报告应当依法及时向( )公布。',
questionList: [
'社会',
'从业人员',
'调查人员',
'政府有关部门'
]
},
{
questionType: 'single',
questionOutline: '《安全生产事故隐患排查治理暂行规定》,生产经营单位对承包、承租单位的事故隐患排查治理负有( )的职责。',
questionList: [
'监督',
'检查',
'协调',
'统一协调和监督管理'
]
},
{
questionType: 'single',
questionOutline: '《安全生产违法行为行政处罚办法(2015修正)》,( )以上人民政府安全生产监督管理部门对生产经营单位及其有关人员在生产经营活动中违反有关安全生产的法律、行政法规、部门规章、国家标准、行业标准和规程的违法行为实施行政处罚。',
questionList: [
'国务院',
'省、自治区、直辖市',
'设区的市级',
'县级'
]
},
{
questionType: 'single',
questionOutline: '《安全生产违法行为行政处罚办法(2015修正)》,行政处罚案件应当自立案之日起( )日内作出行政处罚决定;由于客观原因不能完成的,经安全监管监察部门负责人同意,可以延长。',
questionList: [
'10日',
'30日',
'60日',
'90日'
]
},
{
questionType: 'single',
questionOutline: '《安全生产违法行为行政处罚办法(2015修正)》,进行案件调查时,安全生产行政执法人员不得少于( )。',
questionList: [
'一名',
'两名',
'三名',
'五名'
]
},
{
questionType: 'single',
questionOutline: '《关于开展安全生产驻点监管工作的通知》要求,驻点监管时间。暂定为2年,分批次进行,每半年轮换一次。驻点人员进驻到位后,要设置办公地点,日常化开展监管工作;要制定监管工作计划,明确任务完成节点,至少( )向派出单位报告一次驻点监管工作情况。',
questionList: [
'每周',
'每半月',
'每月',
'每半年'
]
},
{
questionType: 'single',
questionOutline: '《国务院关于坚持科学发展安全发展促进安全生产形势持续稳定好转的意见》(国发〔2011〕40号)提出:加强安全知识普及和技能培训。全面开展安全生产、应急避险知识进学校、进乡村、进社区、进家庭活动,努力提升( )。',
questionList: [
'全民安全水平',
'全民安全素质',
'全民安全知识'
]
},
{
questionType: 'single',
questionOutline: '《国务院关于坚持科学发展安全发展促进安全生产形势持续稳定好转的意见》(国发〔2011〕40号)提出:认真落实企业安全生产主体责任,强化企业( )和指挥权,注重发挥注册安全工程师对企业安全状况诊断、评估、整改方面的作用。',
questionList: [
'生产负责人领导决策',
'主要负责人指挥决策',
'技术负责人技术决策'
]
},
{
questionType: 'single',
questionOutline: '《国务院关于坚持科学发展安全发展促进安全生产形势持续稳定好转的意见》(国发〔2011〕40号)提出:严格危险化学品安全管理。全面开展危险化学品安全管理现状( ),建立危险化学品安全管理信息系统。',
questionList: [
'普查评估',
'安全评估',
'风险评估'
]
},
{
questionType: 'single',
questionOutline: '《国务院关于进一步加强企业安全生产工作的通知》(国发〔2010〕23号)提出:进一步规范企业生产经营行为。加强对生产现场监督检查,凡( )组织生产的,要责令停产停工整顿,并对企业和企业主要负责人依法给予规定上限的经济处罚。',
questionList: [
'超水平、超强度、超定员',
'超能力、超强度、超定员',
'超能力、超强度、超范围'
]
},
{
questionType: 'single',
questionOutline: '《国务院关于进一步加强企业安全生产工作的通知》要求,建立完善企业安全生产预警机制。企业要建立完善安全生产动态监控及预警预报体系,每( )进行一次安全生产风险分析。',
questionList: [
'',
'',
'季度',
''
]
},
{
questionType: 'single',
questionOutline: '《山东省人民政府关于贯彻落实国发[2010]23号文件进一步加强企业安全生产工作的意见》(鲁政发[2010]77号)提出:严格执行建设项目安全设施核准审批制度。对项目建设生产经营单位存在违法分包、转包等行为的,立即依法停工停产整顿,并追究项目业主、承包方及( )等各方责任。',
questionList: [
'设计、施工、监理、监管',
'建设、设计、施工、监管',
'建设、设计、施工、监理、监管'
]
},
{
questionType: 'single',
questionOutline: '《山东省生产安全事故应急办法》,高危和人员密集单位应当( )对所有专项应急预案至少组织1次演练。',
questionList: [
'每半年',
'每年',
'每2年',
'每3年'
]
}
],
multiQuestions: [
{
questionType: 'multiple',
questionOutline: '《山东省安全生产条例》规定,主要负责人包括对本单位生产经营负有全面领导责任的( )。',
questionList: [
'法定代表人',
'实际控制人',
'以及其他主要决策人',
'技术负责人'
]
},
{
questionType: 'multiple',
questionOutline: '( ),在遇到险情时第一时间享有下达停产撤人命令的直接决策权和指挥权。 ',
questionList: [
'生产现场带班人员',
'班组长',
'调度人员',
'主要负责人'
]
},
{
questionType: 'multiple',
questionOutline: '《安全生产法》规定:从业人员有权对本单位安全生产工作中存在的问题提出( )。',
questionList: [
'批评',
'检举',
'控告',
'报告'
]
},
{
questionType: 'multiple',
questionOutline: '《山东省生产经营单位安全生产主体责任规定》第四条,生产经营单位是安全生产的责任主体,对本单位的安全生产承担主体责任。主体责任主要包括( )、安全管理保障责任、事故报告和应急救援责任。',
questionList: [
'组织机构保障责任',
'规章制度保障责任',
'物质资金保障责任',
'教育培训保障责任'
]
},
{
questionType: 'multiple',
questionOutline: '《生产安全事故报告和调查处理条例》,根据生产安全事故造成的人员伤亡或者直接经济损失,事故一般分为( )。',
questionList: [
'一般事故',
'较大事故',
'重大事故',
'特别重大事故'
]
},
{
questionType: 'multiple',
questionOutline: '《中共中央国务院关于推进安全生产领域改革发展的意见》,大力推进企业安全生产标准化建设,实现( )的标准化。',
questionList: [
'安全管理',
'操作行为',
'设备设施',
'作业环境'
]
},
{
questionType: 'multiple',
questionOutline: '《中华人民共和国安全生产法》第二十四条 ( )和危险物品的生产、经营、储存、装卸单位,应当设置安全生产管理机构或者配备专职安全生产管理人员。',
questionList: [
'矿山',
'金属冶炼',
'运输单位',
'建筑施工'
]
},
{
questionType: 'multiple',
questionOutline: '安全设备的设计、制造、( )、改造和报废,应当符合国家标准或者行业标准。',
questionList: [
'安装',
'使用',
'检测',
'维修'
]
},
{
questionType: 'multiple',
questionOutline: '按照《生产安全事故报告和调查处理条例》规定,报告事故应当包括下列内容:( )',
questionList: [
'事故发生单位概况',
'事故发生的时间、地点以及事故现场情况',
'事故的简要经过',
'事故已经造成或者可能造成的伤亡人数'
]
},
{
questionType: 'multiple',
questionOutline: '从业人员有权对本单位安全生产工作中存在的问题提出批评、检举、控告,有权拒绝( )。',
questionList: [
'违章指挥',
'领导指令',
'不合理安排',
'强令冒险作业'
]
},
{
questionType: 'multiple',
questionOutline: '任何单位和个人对事故不得( )',
questionList: [
'迟报',
'谎报',
'漏报',
'瞒报'
]
},
{
questionType: 'multiple',
questionOutline: '生产经营单位对重大危险源应当登记建档,进行定期( ),并制定应急预案,告知从业人员和相关人员在紧急情况下应当采取的应急措施。',
questionList: [
'评价',
'检测',
'评估',
'监控'
]
},
{
questionType: 'multiple',
questionOutline: '《全省安全生产大排查大整治行动方案》,创新检查方式,重点采取( )等方式开展检查,确保查实查深。',
questionList: [
'双随机一公开',
'四不两直',
'异地交互',
'驻点检查'
]
},
{
questionType: 'multiple',
questionOutline: '《山东省生产经营单位安全生产主体责任规定》要求,生产经营单位应当按照国家有关规定,开展以( )为主要内容的安全生产标准化建设。',
questionList: [
'岗位达标',
'班组达标',
'专业达标',
'企业达标'
]
},
{
questionType: 'multiple',
questionOutline: '安全生产工作应当以人为本,坚持( ),坚持安全第一、预防为主、综合治理的方针,从源头上防范化解重大安全风险。',
questionList: [
'安全发展理念',
'人民至上、生命至上',
'把保护人民生命安全摆在首位',
'树牢安全发展理念'
]
}
],
checkQuestions: [
{
questionType: 'check',
questionOutline: '购买和发放劳动防护用品的情况应当记录在案。可以货币或者其他物品替代劳动防护用品。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '生产经营单位使用劳务派遣人员从事作业的,劳务派遣人员不计入该生产经营单位的从业人员人数。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '生产经营单位应当按照国家标准、行业标准或者地方标准为从业人员有偿提供合格的劳动防护用品,并督促、检查、教育从业人员正确佩戴和使用。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '事故隐患分为一般事故隐患和较大事故隐患。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '《安全生产法》规定:国家实行生产安全事故责任追溯制度。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '《安全生产法》规定的行政处罚,由应急管理部门和其他负有安全生产监督管理职责的部门按照职责分工决定。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '《国务院关于坚持科学发展安全发展促进安全生产形势持续稳定好转的意见》(国发〔2011〕40号)提出:解决安全生产问题的根本途径是坚持科学发展安全发展。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '《山东省生产经营单位安全生产主体责任规定》要求,安全总监协助本单位主要负责人履行安全生产管理职责,专业分管本单位安全生产管理工作。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '《中共中央国务院关于推进安全生产领域改革发展的意见》提出加强新材料、新工艺、新业态安全风险评估和管控。( )',
questionList: [
'',
''
]
},
{
questionType: 'check',
questionOutline: '安全监管监察部门不得因当事人陈述或者申辩而加重处罚。( )',
questionList: [
'',
''
]
}
],
questions: [
{
questionType: 'multiple',
questionOutline: '你迫切需要哪方面的培训',
questionList: [
'公司企业文化、企业愿景方面',
'岗位技能方面',
'团队管理方面',
'目标及时间管理方面'
]
},
{
questionType: 'single',
questionOutline: '你迫切需要哪方面培训',
questionList: [
'公司企业文化、企业愿景方面',
'岗位技能方面',
'团队管理方面',
'目标及时间管理方面'
]
},
{
questionType: 'check',
questionOutline: '你迫切需要哪些培训',
questionList: [
'公司企业文化、企业愿景方面',
'岗位技能方面'
]
}
],
isToScroll: true,
closeBtnImage: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA5pJREFUWEfFl0mIXUUUhr8f1IXzRrIwSoyCoAQcQCGCGgXjFCcw7tSABmOMGnBjTCBi0I1g4hAlCRjdqaDGOAbUuFBQiAqiIDgEh4W4UaMuVPjlb+o21bfvve9196ILHt2v6gz/qXPqP+eJeV6aZ//MCIDt04BrgRuABeWTGH4pn5eBPZK+GTewsQDYvgS4B7hmTMOvAdskvTdKfhCA7eOAR4HbWoYOAN8BP5X9hcBi4NyW3C7gPkm/9wHpBWB7CZBIFhXlj4FHgPcl/dFl0PaxwDLgfuD8InMwNyfpiy6dTgC2TykRNjqb41zSP6OuNOe2jyggotesxZK+b+tPA2D7KCBXfHoRXi5p3ziO2zK2LwPeKftfJ0WS/qrlugA8C9za5FbSz7Nx3ujYPrGqld2SVvUCsB3HAZB1vaRX5+K8AnEd8Er5vkrS7uZs8gZsHw98Vopur6QpT852Kjy1IUkv9RThxWX/kKSkcXLZTkGvAFKUZ0v6LYc1gBrlCkmvd+TUZW+7pLUtB08Bd04YlbpSezWwt327NYDHgHuTL0kn9UR4IfBBOVsvaWv+tx296Gctk7S/R/9HIJyxVdL69g18CCwFnpG0pi/3th8AtpTzS8vfd8vfzZIeHNB9GrgD+EjSBW0A4e9TgUEjJeJEHmr+tTg7oVBvbqJ32U6KkqpvJaWvTKmBQ8DR4wAoIJ4Dbi7enpd0y5DzopPC3gP8KemYuQLYAdxenO6UtHquAGaSgnD9wy2HGySlV8w6BU0RPilp3UAhrQReKOeTN1C+3yTpxQHdJ4C7+oowESWyg5JCONOW7bNKh8wz3SJpU8ntQ8BGIM8sne/zHv00o3TXNLYN7RpYDrxdFKcRke0jgTeAsN0uSU30Eyq2d5a5IRxwlaS/axC2ayK6XNJEk6qJKL08PfvkMFYHFTc0G6brI5rMAhN42jIVFf8ALGlmiimUWb3TGFnZx/mjqr19bvtGoKmNtZK2NzJdnP0mcEUROFPSVzN12Lr6M4Avy95bkq6sz7sAHAb8WwktnO1M0JoFYvJwSf8NAigFVT+1bM14NrBdd9fY6HyiQ0NpXbUxkFa6o6tNd1R7WDG9v1md7X3KK+jKs+3zgHSwc6rzjOKZFfJi6rE8U3RAp90261NgjaRP+upo5A+TMuHeXbpfbXyoNgNsG/D4qEl6JIDGSxnZwgUXAbmZrp9miTQDy/5m5Br1gsYGMMrQbM/nHcD/KsVxMIuPd2kAAAAASUVORK5CYII='
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
setTimeout(() => {
this.setData({
isToScroll: false
})
}, 100)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
wx.setNavigationBarTitle({
title: '考试内容'
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
*
*/
checkboxChange(event) {
console.log(event, 'hehehehehehehehehe')
},
/**
*
*/
radioChange(event) {},
checkChange() {},
/**
*
*/
submitTestPaper(event) {
// 提交考卷
},
/**
*
*/
cancelmove(event) {
console.log(event)
// return false
// return true
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/testpaper/testpaper.wxml-->
<view class="testpaper-wrapper">
<scroll-view scroll-y="{{false}}" class="scroll-wrapper">
<view wx:for="{{singleQuestions}}" class="test-question-wrapper">
<view class="test-question-outline-wrapper">
{{(index + 1) < 10 ? '0' + (index + 1) : (index + 1 + '')}}
<text class="decorate-type">单选</text>
<text>{{item.questionOutline}}</text>
<text class="decorate-must">*</text>
</view>
<view class="test-question-body-wrapper">
<radio-group>
<view wx:for="{{item.questionList}}"
wx:for-item="item1"
wx:for-index="index1"
class="test-question-line">{{index1 === 0? 'A、' : (index1 === 1? 'B、' : (index1 === 2? 'C、': (index1 === 3? 'D、' : 'E、')))}}{{item1}}</view>
<view class="select-optoin-wrapper">
<radio wx:for="{{item.questionList}}"
wx:for-index="index1"
class="one-option"
color="#090D9C"
>
{{index1 === 0? 'A' : (index1 === 1? 'B' : (index1 === 2? 'C': (index1 === 3? 'D' : 'E')))}}
</radio>
</view>
</radio-group>
</view>
</view>
<view wx:for="{{multiQuestions}}" class="test-question-wrapper">
<view class="test-question-outline-wrapper">
{{(index + 1) < 10 ? '0' + (index + 1) : (index + 1 + '')}}
<text class="decorate-type">多选</text>
<text>{{item.questionOutline}}</text>
<text class="decorate-must">*</text>
</view>
<view class="test-question-body-wrapper">
<checkbox-group>
<view wx:for="{{item.questionList}}"
wx:for-item="item1"
wx:for-index="index1"
class="test-question-line">{{index1 === 0? 'A、' : (index1 === 1? 'B、' : (index1 === 2? 'C、': (index1 === 3? 'D、' : 'E、')))}}{{item1}}</view>
<view class="select-optoin-wrapper">
<checkbox wx:for="{{item.questionList}}"
wx:for-index="index1"
class="one-option"
color="#090D9C"
>
{{index1 === 0? 'A' : (index1 === 1? 'B' : (index1 === 2? 'C': (index1 === 3? 'D' : 'E')))}}
</checkbox>
</view>
</checkbox-group>
</view>
</view>
<view wx:for="{{checkQuestions}}" class="test-question-wrapper">
<view class="test-question-outline-wrapper">
{{(index + 1) < 10 ? '0' + (index + 1) : (index + 1 + '')}}
<text class="decorate-type">判断</text>
<text>{{item.questionOutline}}</text>
<text class="decorate-must">*</text>
</view>
<view class="test-question-body-wrapper">
<radio-group>
<view wx:for="{{item.questionList}}"
wx:for-item="item1"
wx:for-index="index1"
class="test-question-line">{{item1}}</view>
<view class="select-optoin-wrapper">
<radio wx:for="{{item.questionList}}"
wx:for-index="index1"
class="one-option"
color="#090D9C"
>
{{index1 === 0? '是' : (index1 === 1? '否' : (index1 === 2? '是': (index1 === 3? '否' : '否')))}}
</radio>
</view>
</radio-group>
</view>
</view>
<view class="submit-row"><button class="submit-btn" bindtap="submitTestPaper">提交考卷</button></view>
</scroll-view>
<view class="score-wrapper" catchtouchmove="cancelmove">
<view class="real-score-outline">
<view class="real-score-outline-title">您的考试得分为</view>
<view class="real-score">90</view>
<view class="score-slogan">恭喜您顺利通过考试</view>
<view class="wrong-test-wrapper">
<view class="wrong-btn">查看错题</view>
<view class="test-btn">重新考试</view>
</view>
<view class="close-score-outline">
<image class="close-score-image" mode="aspectFill" src="{{closeBtnImage}}"></image>
</view>
</view>
</view>
</view>
\ No newline at end of file
/* pages/testpaper/testpaper.wxss */
/* .testpaper-wrapper {
width: 100vw;
height: 100vh;
box-sizing: border-box;
padding-top: 10rpx;
}
.single-title {
font-size: 34rpx;
font-weight: bold;
margin-left: 12rpx;
}
.multiple-title {
font-size: 34rpx;
font-weight: bold;
margin-left: 12rpx;
}
.check-title {
font-size: 34rpx;
font-weight: bold;
margin-left: 12rpx;
}
.scroll-wrapper {
background: #F4F4F5;
box-sizing: border-box;
padding-bottom: 20rpx;
}
.question-wrapper {
background-color: white;
margin: 20rpx auto;
width: 100%;
}
.question-outline {
min-height: 88rpx;
display: flex;
align-items: center;
font-size: 32rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
}
.mandatory {
color: red;
}
.multiple-icon {
width: 80rpx;
height: 33rpx;
font-size: 24rpx;
background: #090D9C;
border-radius: 8rpx;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.question-list {
border-top: 1px solid #eee;
height: 70rpx;
}
.question-row {
height: 70rpx;
border-top: 1px solid #eee;
display: flex;
align-items: center;
width: 95%;
margin: 0 auto;
}
.selections-wrapper {
justify-content: space-between;
}
.to-margin {
margin: 0 20rpx 0 0;
}
.checks-select-wrapper {
justify-content: flex-start;
}
.submit-row {
height: 115rpx;
background-color: white;
display: flex;
align-items: center;
}
.submit-btn {
width: 483rpx;
height: 81rpx;
background: #090D9C;
border-radius: 8rpx;
font-size: 32rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #FFFFFF;
} */
.testpaper-wrapper {
background-color: #F4F4F5;
}
.test-question-wrapper {
margin: 30rpx 0;
padding: 0 15rpx;
background-color: white;
line-height: 56rpx;
}
.test-question-outline-wrapper {
font-size: 32rpx;
color: #333333;
font-family: 'PingFang-SC-Medium';
width: 95%;
margin: 0 auto;
position: relative;
overflow: visible;
}
.decorate-type {
display: inline-block;
width: 80rpx;
height: 33rpx;
background: #090D9C;
border-radius: 8rpx;
font-size: 24rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #FFFFFF;
line-height: 33rpx;
text-align: center;
margin-right: 10rpx;
}
.decorate-must {
color: red;
/* position: absolute;
right: -5rpx;
bottom: 5rpx; */
}
.test-question-line {
width: 95%;
height: 72rpx;
padding-left: 2rpx;
margin: 0 auto;
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #333333;
line-height: 72rpx;
border-top: 1rpx solid #eee;
}
.select-optoin-wrapper {
width: 95%;
margin: 0 auto;
border-top: 1rpx solid #eee;
}
.one-option {
margin-right: 45rpx;
}
.submit-row {
height: 115rpx;
background-color: white;
display: flex;
align-items: center;
}
.submit-btn {
width: 483rpx;
height: 81rpx;
background: #090D9C;
border-radius: 8rpx;
font-size: 32rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #FFFFFF;
}
.score-wrapper {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(0, 0, 0, .3);
display: none;
}
.real-score-outline {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 493rpx;
/* height: 473rpx; */
background: #FFFFFF;
border-radius: 20rpx;
padding-top: 144rpx;
}
.real-score-outline-title {
text-align: center;
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #333333;
margin-bottom: 41rpx;
}
.real-score {
font-size: 80rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #1DCC24;
line-height: 70rpx;
text-align: center;
margin-bottom: 45rpx;
}
.score-slogan {
font-size: 30rpx;
font-family: 'PingFang SC';
font-weight: bold;
color: #1DCC24;
line-height: 36rpx;
text-align: center;
margin-bottom: 30rpx;
}
.wrong-test-wrapper {
border-top: 1rpx solid #eee;
display: flex;
height : 74rpx;
}
.wrong-btn {
font-size: 27rpx;
font-family: 'Source Han Sans CN';
font-weight: 400;
color: #5D5D5D;
flex-basis: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.test-btn {
flex-basis: 50%;
font-size: 27rpx;
font-family: 'Source Han Sans CN';
font-weight: 400;
color: #22B5F8;
display: flex;
align-items: center;
justify-content: center;
position: relative;
text-align: center;
}
.test-btn::before {
content: '';
width: 2rpx;
height: 100%;
position: absolute;
left: 0;
top: 0;
background-color: #eee;
}
.close-score-outline {
position: absolute;
left: 50%;
bottom: -80rpx;
transform: translateX(-50%);
width: 59rpx;
height: 59rpx;
}
.close-score-image {
width: 100%;
height: 100%;
}
// pages/trainimg/trainimg.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
isPullDown: false,
companyId: '',
curRole: app.globalData.curRole,
trainImgList: [
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
curRole: app.globalData.curRole
})
this.data.companyId = options.companyId
wx.setNavigationBarTitle({
title: '培训影像'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/trainImage/pageTrainImage',
method: 'get',
header: {
Authorization: app.globalData.Authorization,
},
data: {
enterpriseId: this.data.companyId,
page: 0,
size: 999,
sort: 'time,desc'
},
success: (res) => {
console.log(res, '培训影像管理 培训影像管理 培训影像管理 培训影像管理')
this.setData({
trainImgList: [...res.data.content.map(item => {
return {
...item,
briefIntroduction: item.briefIntroduction,
trainSum: item.peopleNum,
uploadTime: item.time,
uploadPos: item.location
}
})]
})
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
pullDownRefresh(event) {
setTimeout(() => {
this.setData({
isPullDown: false
})
},1000)
},
navigateToTrainImgItem(event) {
console.log(event, 'navigateToTrainImgItem navigateToTrainImgItem')
app.globalData.currentTrainImg = event.currentTarget.dataset.index
wx.navigateTo({
url: '/pages/trainimgitem/trainimgitem'
})
},
addTrainImg() {
wx.navigateTo({
url: '/pages/addtrainimg/addtrainimg?companyId=' + this.data.companyId,
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/trainimg/trainimg.wxml-->
<view class="train-img-wrapper">
<scroll-view scroll-y="true" class="train-img-scroll"
refresher-enabled="false"
refresher-threshold="30"
refresher-default-style="black"
refresher-triggered="{{isPullDown}}"
bindrefresherrefresh="pullDownRefresh"
>
<view wx:for="{{trainImgList}}" class="train-img-item-wrapper"
data-index="{{item}}"
bindtap="navigateToTrainImgItem"
>
<view class="train-img-name-wrapper">
<view class="train-img-name-title">培训影像名称:</view>
<view class="train-img-name">{{item.briefIntroduction}}</view>
</view>
<view class="train-img-sum-wrapper">
<view class="train-img-sum-title">培训人数:</view>
<view class="train-img-sum">{{item.trainSum}}</view>
</view>
<view class="train-img-auxiliary-wrapper">
<view class="train-img-pos">{{item.uploadPos}}</view>
<view class="train-img-time">{{item.uploadTime}}</view>
</view>
</view>
</scroll-view>
<button class="add-train-img"
bindtap="addTrainImg" wx:if="{{curRole === '企业管理'}}"
>新增培训影像</button>
</view>
\ No newline at end of file
/* pages/trainimg/trainimg.wxss */
.train-img-wrapper {
position: relative;
width: 100vw;
height: 100vh;
box-sizing: 0;
}
.train-img-scroll {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
.train-img-item-wrapper {
width: 706rpx;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
background-color: #fff;
padding: 20rpx;
margin: 40rpx auto;
box-sizing: border-box;
}
.train-img-name-wrapper {
display: flex;
justify-content: flex-start;
margin: 20rpx 0 20rpx 20rpx;
}
.train-img-name-title {
font-size: 26rpx;
color: #333333;
font-weight: 550;
}
.train-img-name {
font-size: 30rpx;
margin-left: 20rpx;
position: relative;
bottom: 3rpx;
color: #090D9C;
font-weight: 550;
}
.train-img-sum-wrapper {
display: flex;
justify-content: flex-start;
margin: 20rpx 0 20rpx 20rpx;
}
.train-img-sum-title {
font-size: 26rpx;
color: #333333;
font-weight: 550;
}
.train-img-sum {
font-size: 30rpx;
margin-left: 20rpx;
position: relative;
bottom: 3rpx;
color: #090D9C;
font-weight: 550;
}
.train-img-auxiliary-wrapper {
display: flex;
justify-content: space-between;
font-size: 22rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #999999;
}
.add-train-img {
position: absolute;
bottom: 20rpx;
left: 50%;
transform: translateX(-50%);
background-color: #1F208C;
color: white;
border-radius: 37rpx;
width: 440rpx!important;
height: 75rpx;
}
// pages/trainimgenter/trainimgenter.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
isPullDown: false,
enterSearchImgUrl: 'http://39.102.232.151:8030/cover/企业搜索icon.png',
enterImgUrl: 'http://39.102.232.151:8030/cover/证书企业icon.png',
curRole: app.globalData.curRole,
searchEnter: '',
enterList: [
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
curRole: app.globalData.curRole
})
let params = {
page: 0,
size: 10
}
if (this.data.searchEnter) {
params.name = this.data.searchEnter
}
wx.showLoading({
title: '正在加载',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/trainImage/pageEnterprise',
method: 'get',
data: params,
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'wx.request wx.request wx.request')
this.setData({
enterList: [...res.data.content.map(item => {
return {
companyName: item.name,
companyId: item.id,
trainImgSum: item.trainImageNum
}
})]
})
},
complete: () => {
wx.hideLoading()
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '培训影像管理'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
pullDownRefresh() {
setTimeout(() => {
this.setData({
isPullDown: false
})
},1000)
},
toTrainImg(event) {
console.log(event.currentTarget, 'event.currentTarget event.currentTarget')
wx.navigateTo({
url: '/pages/trainimg/trainimg?companyId=' + event.currentTarget.dataset.index.companyId,
})
},
inputSearchName(event) {
this.data.searchEnter = event.detail.value
},
searchEnterByName() {
let params = {
page: 0,
size: 10
}
if (this.data.searchEnter) {
params.name = this.data.searchEnter
}
wx.showLoading({
title: '正在加载',
})
wx.request({
url: app.globalData.appBaseUrlV2 + '/api/trainImage/pageEnterprise',
method: 'get',
data: params,
header: {
Authorization: app.globalData.Authorization
},
success: (res) => {
console.log(res, 'wx.request wx.request wx.request')
this.setData({
enterList: [...res.data.content.map(item => {
return {
companyName: item.name,
companyId: item.id,
trainImgSum: item.trainImageNum
}
})]
})
},
complete: () => {
wx.hideLoading()
}
})
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/hwapprovallist/hwapprovallist.wxml-->
<view class="approval-total-wrapper">
<view class="approval-tools-wrapper" wx:if="{{curRole !== '企业管理'}}">
<input
class="approval-input-wrapper"
placeholder="请输入公司名称搜索"
type="text"
confirm-type="search"
bindconfirm="searchEnterByName"
bindinput="inputSearchName"
>
<image src="{{enterSearchImgUrl}}" class="approval-search-icon"></image>
</input>
</view>
<scroll-view
class="approval-scroll"
scroll-y="true"
>
<view wx:for="{{enterList}}" class="approval-enter">
<view class="approval-enter-title-wrapper">
<view>
<image src="{{enterImgUrl}}" class="approval-enter-img-icon"></image>
</view>
<view class="approval-enter-title-icon">{{item.companyName}}</view>
</view>
<view class="approval-enter-content-wrapper">
<view class="approval-enter-content-title">企业培训影像数量</view>
<view class="approval-enter-content-degree">{{item.trainImgSum}}</view>
<view class="approval-enter-content-navigator" data-index="{{item}}"
bindtap="toTrainImg"
>查看详情</view>
</view>
</view>
</scroll-view>
</view>
/* pages/hwapprovallist/hwapprovallist.wxss */
@font-face {
font-family: 'PingFang SC1';
src: 'https://8.143.198.78/fonts/PingFang_Medium_downcc.otf';
}
.approval-total-wrapper {
padding-top: 18rpx;
box-sizing: border-box;
width: 100vw;
height: 100vh;
background-color: #F4F4F5;
}
.approval-tools-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.approval-input-wrapper {
width: 569rpx;
height: 67rpx;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 34rpx;
position: relative;
font-size: 30rpx;
font-family: "PingFang SC1";
font-weight: 500;
padding-left: 50rpx;
background-color: #FAFAFA;
margin-left: 22rpx;
margin-right: 11rpx;
}
.approval-search-icon {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 55rpx;
height: 55rpx;
}
.navigateToAddApproval {
width: 129rpx;
height: 63rpx;
background: #FAFAFA;
border: 1px solid #090D9C;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 19rpx;
}
.approval-scroll {
width: 100%;
margin-top: 15rpx;
height: calc(100vh - 108rpx);
box-sizing: border-box;
}
.approval-enter {
width: 709rpx;
height: 162rpx;
margin: 23rpx auto;
background: #FFFFFF;
box-shadow: 1rpx 2rpx 9rpx 1rpx rgba(29, 32, 137, 0.12);
border-radius: 14rpx;
padding-top: 30rpx;
}
.approval-enter-title-wrapper {
font-size: 34rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #333333;
display: flex;
}
.approval-enter-img-icon {
width: 45rpx;
height: 45rpx;
margin-left: 23rpx;
margin-right: 11rpx;
}
.approval-enter-content-wrapper {
display: flex;
justify-content: flex-start;
align-items: center;
margin-top: 33rpx;
}
.approval-enter-content-title {
font-size: 34rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
margin-left: 82rpx;
}
.approval-enter-content-degree {
font-size: 46rpx;
font-family: "PingFang SC1";
font-weight: bold;
color: #090D9C;
margin-left: 32rpx;
}
.approval-enter-content-navigator {
font-size: 24rpx;
font-family: "PingFang SC1";
font-weight: 500;
color: #090D9C;
display: flex;
justify-content: center;
align-items: center;
border: 1rpx solid #090D9C;
margin-left: 60rpx;
padding: 12rpx 18rpx 12rpx 11rpx;
border-radius: 8rpx;
}
\ No newline at end of file
// pages/trainimgitem/trainimgitem.js
const app = getApp();
app.globalData.currentTrainImg
Page({
/**
* 页面的初始数据
*/
data: {
briefIntroduction: '培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介培训内容简介',
trainSum: 11,
beforeTrainImg: '',
trainingImg: '',
afterTrainImg: '',
uploadTime: '2021-09-09',
location: '山东省-威海市-荣成市-成山镇'
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
briefIntroduction: app.globalData.currentTrainImg.briefIntroduction,
trainSum: app.globalData.currentTrainImg.peopleNum,
beforeTrainImg: app.globalData.appBaseUrlV3 + '/train-image/' + app.globalData.currentTrainImg.beforeImgPath.split('\\train-image\\')[1],
trainingImg: app.globalData.appBaseUrlV3 + '/train-image/' + app.globalData.currentTrainImg.trainingImgPath.split('\\train-image\\')[1],
afterTrainImg: app.globalData.appBaseUrlV3 + '/train-image/' + app.globalData.currentTrainImg.afterImgPath.split('\\train-image\\')[1],
uploadTime: app.globalData.currentTrainImg.time,
location: app.globalData.currentTrainImg.location
})
wx.setNavigationBarTitle({
title: '企业影像'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/trainimgitem/trainimgitem.wxml-->
<view class="train-img-item-wrapper">
<view class="train-img-brief-wrapper">
<view class="train-img-brief-title">培训内容简介</view>
<view class="train-img-brief-content">{{briefIntroduction}}</view>
</view>
<view class="train-sum-wrapper">
<view class="train-sum-title">培训人数</view>
<view class="train-sum">{{trainSum}}</view>
</view>
<view class="train-pic-wrapper">
<view class="train-pic-title">培训前照片</view>
<image class="train-pic" src="{{beforeTrainImg}}"></image>
</view>
<view class="train-pic-wrapper">
<view class="train-pic-title">培训中照片</view>
<image class="train-pic" src="{{trainingImg}}"></image>
</view>
<view class="train-pic-wrapper">
<view class="train-pic-title">培训后照片</view>
<image class="train-pic" src="{{afterTrainImg}}"></image>
</view>
<view class="upload-time-wrapper">
<view class="upload-time-title">上传时间</view>
<view class="upload-time">{{uploadTime}}</view>
</view>
<view class="train-location-wrapper">
<view class="train-location-title">培训地点</view>
<view class="train-location">{{location}}</view>
</view>
</view>
.train-img-brief-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
box-sizing: border-box;
}
.train-img-brief-title {
margin: 15rpx auto;
}
.train-img-brief-content {
margin: 20rpx auto;
text-indent: 2em;
letter-spacing: 3rpx;
font-size: 40rpx;
}
.train-sum-wrapper {
width: 706rpx;
margin: 30rpx auto;
display: flex;
justify-content: space-between;
padding: 20rpx;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
box-sizing: border-box;
}
.train-sum {
padding-right: 20rpx;
}
.train-pic-wrapper {
width: 706rpx;
margin: 30rpx auto;
padding: 20rpx;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
box-sizing: border-box;
}
.train-pic-title {
margin: 20rpx auto;
}
.train-pic {
margin: 10rpx auto;
}
.upload-time-wrapper {
width: 706rpx;
margin: 30rpx auto;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
box-sizing: border-box;
display: flex;
justify-content: space-between;
padding: 20rpx;
}
.upload-time {
padding-right: 20rpx;
}
.train-location-wrapper {
width: 706rpx;
margin: 30rpx auto;
border-radius: 20rpx;
box-shadow: 0 0 9rpx 1rpx #eee;
box-sizing: border-box;
display: flex;
justify-content: space-between;
padding: 20rpx;
}
.train-location {
padding-right: 20rpx;
}
\ No newline at end of file
// pages/warn/warn.js
Page({
/**
* 页面的初始数据
*/
data: {
courseVideoPlay: 'data:image/png;base64,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',
animationDisappearArray: [],
videoCVArray: [],
warnList: [
{
title: '安全生产警示教育片之密闭空间涂装',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/1.png',
fileUrl: 'http://39.102.232.151:8030/video/1.mp4',
type: 'video'
},
{
title: '安全生产十大禁令',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/2.png',
fileUrl: 'http://39.102.232.151:8030/video/2.mp4',
type: 'video'
},
{
title: '叉车事故警示录',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/3.png',
fileUrl: 'http://39.102.232.151:8030/video/3.mp4',
type: 'video'
},
{
title: '城市燃气安全教育片',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/4.png',
fileUrl: 'http://39.102.232.151:8030/video/4.mp4',
type: 'video'
},
{
title: '触电事故警示案例',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/5.png',
fileUrl: 'http://39.102.232.151:8030/video/5.mp4',
type: 'video'
},
{
title: '吊装作业事故',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/6.png',
fileUrl: 'http://39.102.232.151:8030/video/6.mp4',
type: 'video'
},
// {
// title: '安全生产警示教育片之密闭空间涂装',
// instroduce: '',
// coverUrl: 'https://img0.baidu.com/it/u=2265254049,1802113800&fm=26&fmt=auto&gp=0.jpg',
// fileUrl: 'http://39.102.232.151:8030/pdf/1.pdf',
// type: 'pdf'
// },
{
title: '道路交通事故案例',
instroduce: '',
coverUrl: 'http://39.102.232.151:8030/warncover/7.png',
fileUrl: 'http://39.102.232.151:8030/video/7.mp4',
type: 'video'
},
]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// animationDisappearArray: [],
// videoCVArray: [],
for (let i = 0; i < this.data.warnList.length; i++) {
this.data.animationDisappearArray.push({})
this.data.videoCVArray.push(wx.createVideoContext('video' + i))
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
wx.setNavigationBarTitle({
title: '警示教育'
})
wx.setNavigationBarColor({
backgroundColor: '#090D9C',
frontColor: '#ffffff',
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
/**
* 点击类似 pdf 的展示文件
*/
clickToShowFile(event) {
// console.log(event.target.dataset.index)
// wx.downloadFile({
// url: this.data.warnList[event.target.dataset.index].fileUrl,
// success: function(res) {
// const filePath = res.tempFilePath
// wx.openDocument({
// filePath: filePath,
// success: function(res) {
// console.log('打开文件成功')
// }
// })
// }
// })
wx.openDocument({
filePath: this.data.warnList[event.target.dataset.index].fileUrl,
success: function(res) {
console.log(res, '打开文件成功')
}
})
},
playvideo(event) {
const repAnimation = wx.createAnimation({
duration: 50,
timingFunction: 'step-start'
})
this.repAnimation = repAnimation
repAnimation.translateX('-100%').step()
this.data.animationDisappearArray[event.target.dataset.index] = repAnimation.export()
this.setData({
animationDisappearArray: this.data.animationDisappearArray
})
this.data.videoCVArray[event.target.dataset.index].play()
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--pages/warn/warn.wxml-->
<view class="warn-total-wrapper">
<view wx:for="{{warnList}}" class="warn-item-wrapper" data-index="{{index}}">
<view wx:if="{{item.type === 'video'}}" class="warn-video-wrapper" data-index="{{index}}">
<video id="{{'video' + index}}" class="warn-item-video" src="{{item.fileUrl}}" data-index="{{index}}"></video>
<image class="video-cover" mode="scaleToFill" src="{{item.coverUrl}}" animation="{{animationDisappearArray[index]}}" data-index="{{index}}"></image>
<view class="mask-video" animation="{{animationDisappearArray[index]}}" data-index="{{index}}">
<image class="paly-video-btn" src="{{courseVideoPlay}}" bindtap="playvideo" data-index="{{index}}">
</image>
</view>
</view>
<view wx:else data-index="{{index}}">
<image class="warn-item-image" src="https://img0.baidu.com/it/u=198011595,2520892471&fm=26&fmt=auto" data-index="{{index}}" bindtap="clickToShowFile"></image>
</view>
<view class="warn-item-title" data-index="{{index}}">{{item.title}}</view>
</view>
</view>
\ No newline at end of file
/* pages/warn/warn.wxss */
.warn-item-wrapper {
width: 710rpx;
height: 357rpx;
margin: 29rpx 20rpx;
box-sizing: border-box;
border-radius: 20rpx;
box-shadow: 2rpx 2rpx 2rpx 2rpx #eee, -1.5rpx -1.5rpx 1.5rpx 1.5rpx #eee;
}
.warn-item-wrapper .warn-item-video {
width: 100%;
height: 100%;
}
.warn-video-wrapper {
position: relative;
overflow: hidden;
width: 710rpx;
height: 289rpx;
border-radius: 20rpx 20rpx 0 0 ;
}
.video-cover {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.video-play-cover {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.mask-video {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0, .2);
}
.warn-item-title {
height: 68rpx;
line-height: 68rpx;
margin-left: 19rpx;
font-size: 32rpx;
font-family: 'PingFang SC';
font-weight: 500;
color: #333333;
}
.paly-video-btn {
position: absolute;
left: 50%;
top: 50%;
width: 84rpx;
height: 84rpx;
transform: translate(-50%, -50%);
}
.warn-item-image {
width: 710rpx;
height: 289rpx;
border-radius: 20rpx 20rpx 0 0 ;
}
\ No newline at end of file
{
"description": "项目配置文件",
"packOptions": {
"ignore": []
},
"setting": {
"urlCheck": true,
"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,
"lazyloadPlaceholderEnable": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"useIsolateContext": true,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true,
"disableUseStrict": false,
"minifyWXML": true,
"showES6CompileOption": false,
"useCompilerPlugins": false
},
"compileType": "miniprogram",
"libVersion": "2.18.0",
"appid": "wxe009b5c8f819efb8",
"projectname": "%E5%A4%A9%E5%BC%98%E8%B4%A8%E9%87%8F%E6%A3%80%E6%B5%8B",
"debugOptions": {
"hidedInDevtools": []
},
"scripts": {},
"staticServerOptions": {
"baseURL": "",
"servePath": ""
},
"isGameTourist": false,
"condition": {
"search": {
"list": []
},
"conversation": {
"list": []
},
"game": {
"list": []
},
"plugin": {
"list": []
},
"gamePlugin": {
"list": []
},
"miniprogram": {
"list": []
}
}
}
\ No newline at end of file
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}
\ No newline at end of file
var crypto = require('crypto')
function WXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode
var sessionKey = new Buffer(this.sessionKey, 'base64')
encryptedData = new Buffer(encryptedData, 'base64')
iv = new Buffer(iv, 'base64')
try {
// 解密
var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
// 设置自动 padding 为 true,删除填充补位
decipher.setAutoPadding(true)
var decoded = decipher.update(encryptedData, 'binary', 'utf8')
decoded += decipher.final('utf8')
decoded = JSON.parse(decoded)
} catch (err) {
throw new Error('Illegal Buffer')
}
if (decoded.watermark.appid !== this.appId) {
throw new Error('Illegal Buffer')
}
return decoded
}
module.exports = WXBizDataCrypt
var WXBizDataCrypt = require('./WXBizDataCrypt')
var appId = 'wx4f4bc4dec97d474b'
var sessionKey = 'tiihtNczf5v6AKRyjwEUhQ=='
var encryptedData =
'CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM'+
'QmRzooG2xrDcvSnxIMXFufNstNGTyaGS'+
'9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+'+
'3hVbJSRgv+4lGOETKUQz6OYStslQ142d'+
'NCuabNPGBzlooOmB231qMM85d2/fV6Ch'+
'evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6'+
'/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw'+
'u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn'+
'/Hz7saL8xz+W//FRAUid1OksQaQx4CMs'+
'8LOddcQhULW4ucetDf96JcR3g0gfRK4P'+
'C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB'+
'6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns'+
'/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd'+
'lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV'+
'oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG'+
'20f0a04COwfneQAGGwd5oa+T8yO5hzuy'+
'Db/XcxxmK01EpqOyuxINew=='
var iv = 'r7BXXKkLb8qrSNn05n0qiA=='
var pc = new WXBizDataCrypt(appId, sessionKey)
var data = pc.decryptData(encryptedData , iv)
console.log('解密后 data: ', data)
// 解密后的数据为
//
// data = {
// "nickName": "Band",
// "gender": 1,
// "language": "zh_CN",
// "city": "Guangzhou",
// "province": "Guangdong",
// "country": "CN",
// "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0",
// "unionId": "ocMvos6NjeKLIBqg5Mr9QjxrP1FA",
// "watermark": {
// "timestamp": 1477314187,
// "appid": "wx4f4bc4dec97d474b"
// }
// }
const mimeMap = require('./mimeMap.js')
function FormData(){
let fileManager = wx.getFileSystemManager();
let data = {};
let files = [];
this.append = (name, value)=>{
data[name] = value;
return true;
}
this.appendFile = (name, path)=>{
let buffer = fileManager.readFileSync(path);
if(Object.prototype.toString.call(buffer).indexOf("ArrayBuffer") < 0){
return false;
}
files.push({
name: name,
buffer: buffer,
fileName: getFileNameFromPath(path)
});
return true;
}
this.getData = ()=>convert(data, files)
}
function getFileNameFromPath(path){
let idx=path.lastIndexOf("/");
return path.substr(idx+1);
}
function convert(data, files){
let boundaryKey = 'wxmpFormBoundary' + randString(); // 数据分割符,一般是随机的字符串
let boundary = '--' + boundaryKey;
let endBoundary = boundary + '--';
let postArray = [];
//拼接参数
if(data && Object.prototype.toString.call(data) == "[object Object]"){
for(let key in data){
postArray = postArray.concat(formDataArray(boundary, key, data[key]));
}
}
//拼接文件
if(files && Object.prototype.toString.call(files) == "[object Array]"){
for(let i in files){
let file = files[i];
postArray = postArray.concat(formDataArray(boundary, file.name, file.buffer, file.fileName));
}
}
//结尾
let endBoundaryArray = [];
for (var i = 0; i < endBoundary.length; i++) { // 最后取出结束boundary的charCode
endBoundaryArray.push(...endBoundary.utf8CodeAt(i));
}
postArray = postArray.concat(endBoundaryArray);
return {
contentType: 'multipart/form-data; boundary=' + boundaryKey,
buffer: new Uint8Array(postArray).buffer
}
}
function randString() {
let res = "";
for (let i = 0; i < 17; i++) {
let n = parseInt(Math.random() * 62);
if (n <= 9) {
res += n;
}
else if (n <= 35) {
res += String.fromCharCode(n + 55);
}
else {
res += String.fromCharCode(n + 61);
}
}
return res;
}
function formDataArray(boundary, name, value, fileName){
let dataString = '';
let isFile = !!fileName;
dataString += boundary + '\r\n';
dataString += 'Content-Disposition: form-data; name="' + name + '"';
if (isFile){
dataString += '; filename="' + fileName + '"' + '\r\n';
dataString += 'Content-Type: ' + getFileMime(fileName) + '\r\n\r\n';
}
else{
dataString += '\r\n\r\n';
dataString += value;
}
var dataArray = [];
for (var i = 0; i < dataString.length; i++) { // 取出文本的charCode(10进制)
dataArray.push(...dataString.utf8CodeAt(i));
}
if (isFile) {
let fileArray = new Uint8Array(value);
dataArray = dataArray.concat(Array.prototype.slice.call(fileArray));
}
dataArray.push(..."\r".utf8CodeAt());
dataArray.push(..."\n".utf8CodeAt());
return dataArray;
}
function getFileMime(fileName){
let idx = fileName.lastIndexOf(".");
let mime = mimeMap[fileName.substr(idx)];
return mime?mime:"application/octet-stream"
}
String.prototype.utf8CodeAt = function(i) {
var str = this;
var out = [], p = 0;
var c = str.charCodeAt(i);
if (c < 128) {
out[p++] = c;
} else if (c < 2048) {
out[p++] = (c >> 6) | 192;
out[p++] = (c & 63) | 128;
} else if (
((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&
((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {
// Surrogate Pair
c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);
out[p++] = (c >> 18) | 240;
out[p++] = ((c >> 12) & 63) | 128;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
} else {
out[p++] = (c >> 12) | 224;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
}
return out;
};
module.exports = FormData;
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! For license information please see jsencrypt.min.js.LICENSE.txt */
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.JSEncrypt=e():t.JSEncrypt=e()}(window,(function(){
var window = {
ASN1: null,
Base64: null,
Hex: null,
crypto: null,
href: null
}
var navigator = {
appName: 'Netscape',
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
}
return(()=>{"use strict";var t=[,(t,e,i)=>{function r(t){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(t)}function n(t,e){return t&e}function s(t,e){return t|e}function o(t,e){return t^e}function h(t,e){return t&~e}function a(t){if(0==t)return-1;var e=0;return 0==(65535&t)&&(t>>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function u(t){for(var e=0;0!=t;)t&=t-1,++e;return e}i.d(e,{default:()=>nt});var c,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function l(t){var e,i,r="";for(e=0;e+3<=t.length;e+=3)i=parseInt(t.substring(e,e+3),16),r+=f.charAt(i>>6)+f.charAt(63&i);for(e+1==t.length?(i=parseInt(t.substring(e,e+1),16),r+=f.charAt(i<<2)):e+2==t.length&&(i=parseInt(t.substring(e,e+2),16),r+=f.charAt(i>>2)+f.charAt((3&i)<<4));(3&r.length)>0;)r+="=";return r}function p(t){var e,i="",n=0,s=0;for(e=0;e<t.length&&"="!=t.charAt(e);++e){var o=f.indexOf(t.charAt(e));o<0||(0==n?(i+=r(o>>2),s=3&o,n=1):1==n?(i+=r(s<<2|o>>4),s=15&o,n=2):2==n?(i+=r(s),i+=r(o>>2),s=3&o,n=3):(i+=r(s<<2|o>>4),i+=r(15&o),n=0))}return 1==n&&(i+=r(s<<2)),i}var g,d={decode:function(t){var e;if(void 0===g){var i="= \f\n\r\t \u2028\u2029";for(g=Object.create(null),e=0;e<64;++e)g["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)]=e;for(g["-"]=62,g._=63,e=0;e<i.length;++e)g[i.charAt(e)]=-1}var r=[],n=0,s=0;for(e=0;e<t.length;++e){var o=t.charAt(e);if("="==o)break;if(-1!=(o=g[o])){if(void 0===o)throw new Error("Illegal character at offset "+e);n|=o,++s>=4?(r[r.length]=n>>16,r[r.length]=n>>8&255,r[r.length]=255&n,n=0,s=0):n<<=6}}switch(s){case 1:throw new Error("Base64 encoding incomplete: at least 2 bits missing");case 2:r[r.length]=n>>10;break;case 3:r[r.length]=n>>16,r[r.length]=n>>8&255}return r},re:/-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,unarmor:function(t){var e=d.re.exec(t);if(e)if(e[1])t=e[1];else{if(!e[2])throw new Error("RegExp out of sync");t=e[2]}return d.decode(t)}},v=1e13,m=function(){function t(t){this.buf=[+t||0]}return t.prototype.mulAdd=function(t,e){var i,r,n=this.buf,s=n.length;for(i=0;i<s;++i)(r=n[i]*t+e)<v?e=0:r-=(e=0|r/v)*v,n[i]=r;e>0&&(n[i]=e)},t.prototype.sub=function(t){var e,i,r=this.buf,n=r.length;for(e=0;e<n;++e)(i=r[e]-t)<0?(i+=v,t=1):t=0,r[e]=i;for(;0===r[r.length-1];)r.pop()},t.prototype.toString=function(t){if(10!=(t||10))throw new Error("only base 10 is supported");for(var e=this.buf,i=e[e.length-1].toString(),r=e.length-2;r>=0;--r)i+=(v+e[r]).toString().substring(1);return i},t.prototype.valueOf=function(){for(var t=this.buf,e=0,i=t.length-1;i>=0;--i)e=e*v+t[i];return e},t.prototype.simplify=function(){var t=this.buf;return 1==t.length?t[0]:this},t}(),y=/^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/,b=/^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;function T(t,e){return t.length>e&&(t=t.substring(0,e)+""),t}var S,E=function(){function t(e,i){this.hexDigits="0123456789ABCDEF",e instanceof t?(this.enc=e.enc,this.pos=e.pos):(this.enc=e,this.pos=i)}return t.prototype.get=function(t){if(void 0===t&&(t=this.pos++),t>=this.enc.length)throw new Error("Requesting byte offset "+t+" on a stream of length "+this.enc.length);return"string"==typeof this.enc?this.enc.charCodeAt(t):this.enc[t]},t.prototype.hexByte=function(t){return this.hexDigits.charAt(t>>4&15)+this.hexDigits.charAt(15&t)},t.prototype.hexDump=function(t,e,i){for(var r="",n=t;n<e;++n)if(r+=this.hexByte(this.get(n)),!0!==i)switch(15&n){case 7:r+=" ";break;case 15:r+="\n";break;default:r+=" "}return r},t.prototype.isASCII=function(t,e){for(var i=t;i<e;++i){var r=this.get(i);if(r<32||r>176)return!1}return!0},t.prototype.parseStringISO=function(t,e){for(var i="",r=t;r<e;++r)i+=String.fromCharCode(this.get(r));return i},t.prototype.parseStringUTF=function(t,e){for(var i="",r=t;r<e;){var n=this.get(r++);i+=n<128?String.fromCharCode(n):n>191&&n<224?String.fromCharCode((31&n)<<6|63&this.get(r++)):String.fromCharCode((15&n)<<12|(63&this.get(r++))<<6|63&this.get(r++))}return i},t.prototype.parseStringBMP=function(t,e){for(var i,r,n="",s=t;s<e;)i=this.get(s++),r=this.get(s++),n+=String.fromCharCode(i<<8|r);return n},t.prototype.parseTime=function(t,e,i){var r=this.parseStringISO(t,e),n=(i?y:b).exec(r);return n?(i&&(n[1]=+n[1],n[1]+=+n[1]<70?2e3:1900),r=n[1]+"-"+n[2]+"-"+n[3]+" "+n[4],n[5]&&(r+=":"+n[5],n[6]&&(r+=":"+n[6],n[7]&&(r+="."+n[7]))),n[8]&&(r+=" UTC","Z"!=n[8]&&(r+=n[8],n[9]&&(r+=":"+n[9]))),r):"Unrecognized time: "+r},t.prototype.parseInteger=function(t,e){for(var i,r=this.get(t),n=r>127,s=n?255:0,o="";r==s&&++t<e;)r=this.get(t);if(0==(i=e-t))return n?-1:0;if(i>4){for(o=r,i<<=3;0==(128&(+o^s));)o=+o<<1,--i;o="("+i+" bit)\n"}n&&(r-=256);for(var h=new m(r),a=t+1;a<e;++a)h.mulAdd(256,this.get(a));return o+h.toString()},t.prototype.parseBitString=function(t,e,i){for(var r=this.get(t),n="("+((e-t-1<<3)-r)+" bit)\n",s="",o=t+1;o<e;++o){for(var h=this.get(o),a=o==e-1?r:0,u=7;u>=a;--u)s+=h>>u&1?"1":"0";if(s.length>i)return n+T(s,i)}return n+s},t.prototype.parseOctetString=function(t,e,i){if(this.isASCII(t,e))return T(this.parseStringISO(t,e),i);var r=e-t,n="("+r+" byte)\n";r>(i/=2)&&(e=t+i);for(var s=t;s<e;++s)n+=this.hexByte(this.get(s));return r>i&&(n+=""),n},t.prototype.parseOID=function(t,e,i){for(var r="",n=new m,s=0,o=t;o<e;++o){var h=this.get(o);if(n.mulAdd(128,127&h),s+=7,!(128&h)){if(""===r)if((n=n.simplify())instanceof m)n.sub(80),r="2."+n.toString();else{var a=n<80?n<40?0:1:2;r=a+"."+(n-40*a)}else r+="."+n.toString();if(r.length>i)return T(r,i);n=new m,s=0}}return s>0&&(r+=".incomplete"),r},t}(),w=function(){function t(t,e,i,r,n){if(!(r instanceof D))throw new Error("Invalid tag value.");this.stream=t,this.header=e,this.length=i,this.tag=r,this.sub=n}return t.prototype.typeName=function(){switch(this.tag.tagClass){case 0:switch(this.tag.tagNumber){case 0:return"EOC";case 1:return"BOOLEAN";case 2:return"INTEGER";case 3:return"BIT_STRING";case 4:return"OCTET_STRING";case 5:return"NULL";case 6:return"OBJECT_IDENTIFIER";case 7:return"ObjectDescriptor";case 8:return"EXTERNAL";case 9:return"REAL";case 10:return"ENUMERATED";case 11:return"EMBEDDED_PDV";case 12:return"UTF8String";case 16:return"SEQUENCE";case 17:return"SET";case 18:return"NumericString";case 19:return"PrintableString";case 20:return"TeletexString";case 21:return"VideotexString";case 22:return"IA5String";case 23:return"UTCTime";case 24:return"GeneralizedTime";case 25:return"GraphicString";case 26:return"VisibleString";case 27:return"GeneralString";case 28:return"UniversalString";case 30:return"BMPString"}return"Universal_"+this.tag.tagNumber.toString();case 1:return"Application_"+this.tag.tagNumber.toString();case 2:return"["+this.tag.tagNumber.toString()+"]";case 3:return"Private_"+this.tag.tagNumber.toString()}},t.prototype.content=function(t){if(void 0===this.tag)return null;void 0===t&&(t=1/0);var e=this.posContent(),i=Math.abs(this.length);if(!this.tag.isUniversal())return null!==this.sub?"("+this.sub.length+" elem)":this.stream.parseOctetString(e,e+i,t);switch(this.tag.tagNumber){case 1:return 0===this.stream.get(e)?"false":"true";case 2:return this.stream.parseInteger(e,e+i);case 3:return this.sub?"("+this.sub.length+" elem)":this.stream.parseBitString(e,e+i,t);case 4:return this.sub?"("+this.sub.length+" elem)":this.stream.parseOctetString(e,e+i,t);case 6:return this.stream.parseOID(e,e+i,t);case 16:case 17:return null!==this.sub?"("+this.sub.length+" elem)":"(no elem)";case 12:return T(this.stream.parseStringUTF(e,e+i),t);case 18:case 19:case 20:case 21:case 22:case 26:return T(this.stream.parseStringISO(e,e+i),t);case 30:return T(this.stream.parseStringBMP(e,e+i),t);case 23:case 24:return this.stream.parseTime(e,e+i,23==this.tag.tagNumber)}return null},t.prototype.toString=function(){return this.typeName()+"@"+this.stream.pos+"[header:"+this.header+",length:"+this.length+",sub:"+(null===this.sub?"null":this.sub.length)+"]"},t.prototype.toPrettyString=function(t){void 0===t&&(t="");var e=t+this.typeName()+" @"+this.stream.pos;if(this.length>=0&&(e+="+"),e+=this.length,this.tag.tagConstructed?e+=" (constructed)":!this.tag.isUniversal()||3!=this.tag.tagNumber&&4!=this.tag.tagNumber||null===this.sub||(e+=" (encapsulates)"),e+="\n",null!==this.sub){t+=" ";for(var i=0,r=this.sub.length;i<r;++i)e+=this.sub[i].toPrettyString(t)}return e},t.prototype.posStart=function(){return this.stream.pos},t.prototype.posContent=function(){return this.stream.pos+this.header},t.prototype.posEnd=function(){return this.stream.pos+this.header+Math.abs(this.length)},t.prototype.toHexString=function(){return this.stream.hexDump(this.posStart(),this.posEnd(),!0)},t.decodeLength=function(t){var e=t.get(),i=127&e;if(i==e)return i;if(i>6)throw new Error("Length over 48 bits not supported at position "+(t.pos-1));if(0===i)return null;e=0;for(var r=0;r<i;++r)e=256*e+t.get();return e},t.prototype.getHexStringValue=function(){var t=this.toHexString(),e=2*this.header,i=2*this.length;return t.substr(e,i)},t.decode=function(e){var i;i=e instanceof E?e:new E(e,0);var r=new E(i),n=new D(i),s=t.decodeLength(i),o=i.pos,h=o-r.pos,a=null,u=function(){var e=[];if(null!==s){for(var r=o+s;i.pos<r;)e[e.length]=t.decode(i);if(i.pos!=r)throw new Error("Content size is not correct for container starting at offset "+o)}else try{for(;;){var n=t.decode(i);if(n.tag.isEOC())break;e[e.length]=n}s=o-i.pos}catch(t){throw new Error("Exception while decoding undefined length content: "+t)}return e};if(n.tagConstructed)a=u();else if(n.isUniversal()&&(3==n.tagNumber||4==n.tagNumber))try{if(3==n.tagNumber&&0!=i.get())throw new Error("BIT STRINGs with unused bits cannot encapsulate.");a=u();for(var c=0;c<a.length;++c)if(a[c].tag.isEOC())throw new Error("EOC is not supposed to be actual content.")}catch(t){a=null}if(null===a){if(null===s)throw new Error("We can't skip over an invalid tag with undefined length at offset "+o);i.pos=o+Math.abs(s)}return new t(r,h,s,n,a)},t}(),D=function(){function t(t){var e=t.get();if(this.tagClass=e>>6,this.tagConstructed=0!=(32&e),this.tagNumber=31&e,31==this.tagNumber){var i=new m;do{e=t.get(),i.mulAdd(128,127&e)}while(128&e);this.tagNumber=i.simplify()}}return t.prototype.isUniversal=function(){return 0===this.tagClass},t.prototype.isEOC=function(){return 0===this.tagClass&&0===this.tagNumber},t}(),x=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],R=(1<<26)/x[x.length-1],B=function(){function t(t,e,i){null!=t&&("number"==typeof t?this.fromNumber(t,e,i):null==e&&"string"!=typeof t?this.fromString(t,256):this.fromString(t,e))}return t.prototype.toString=function(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var i,n=(1<<e)-1,s=!1,o="",h=this.t,a=this.DB-h*this.DB%e;if(h-- >0)for(a<this.DB&&(i=this[h]>>a)>0&&(s=!0,o=r(i));h>=0;)a<e?(i=(this[h]&(1<<a)-1)<<e-a,i|=this[--h]>>(a+=this.DB-e)):(i=this[h]>>(a-=e)&n,a<=0&&(a+=this.DB,--h)),i>0&&(s=!0),s&&(o+=r(i));return s?o:"0"},t.prototype.negate=function(){var e=N();return t.ZERO.subTo(this,e),e},t.prototype.abs=function(){return this.s<0?this.negate():this},t.prototype.compareTo=function(t){var e=this.s-t.s;if(0!=e)return e;var i=this.t;if(0!=(e=i-t.t))return this.s<0?-e:e;for(;--i>=0;)if(0!=(e=this[i]-t[i]))return e;return 0},t.prototype.bitLength=function(){return this.t<=0?0:this.DB*(this.t-1)+F(this[this.t-1]^this.s&this.DM)},t.prototype.mod=function(e){var i=N();return this.abs().divRemTo(e,null,i),this.s<0&&i.compareTo(t.ZERO)>0&&e.subTo(i,i),i},t.prototype.modPowInt=function(t,e){var i;return i=t<256||e.isEven()?new A(e):new V(e),this.exp(t,i)},t.prototype.clone=function(){var t=N();return this.copyTo(t),t},t.prototype.intValue=function(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]},t.prototype.byteValue=function(){return 0==this.t?this.s:this[0]<<24>>24},t.prototype.shortValue=function(){return 0==this.t?this.s:this[0]<<16>>16},t.prototype.signum=function(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1},t.prototype.toByteArray=function(){var t=this.t,e=[];e[0]=this.s;var i,r=this.DB-t*this.DB%8,n=0;if(t-- >0)for(r<this.DB&&(i=this[t]>>r)!=(this.s&this.DM)>>r&&(e[n++]=i|this.s<<this.DB-r);t>=0;)r<8?(i=(this[t]&(1<<r)-1)<<8-r,i|=this[--t]>>(r+=this.DB-8)):(i=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&i)&&(i|=-256),0==n&&(128&this.s)!=(128&i)&&++n,(n>0||i!=this.s)&&(e[n++]=i);return e},t.prototype.equals=function(t){return 0==this.compareTo(t)},t.prototype.min=function(t){return this.compareTo(t)<0?this:t},t.prototype.max=function(t){return this.compareTo(t)>0?this:t},t.prototype.and=function(t){var e=N();return this.bitwiseTo(t,n,e),e},t.prototype.or=function(t){var e=N();return this.bitwiseTo(t,s,e),e},t.prototype.xor=function(t){var e=N();return this.bitwiseTo(t,o,e),e},t.prototype.andNot=function(t){var e=N();return this.bitwiseTo(t,h,e),e},t.prototype.not=function(){for(var t=N(),e=0;e<this.t;++e)t[e]=this.DM&~this[e];return t.t=this.t,t.s=~this.s,t},t.prototype.shiftLeft=function(t){var e=N();return t<0?this.rShiftTo(-t,e):this.lShiftTo(t,e),e},t.prototype.shiftRight=function(t){var e=N();return t<0?this.lShiftTo(-t,e):this.rShiftTo(t,e),e},t.prototype.getLowestSetBit=function(){for(var t=0;t<this.t;++t)if(0!=this[t])return t*this.DB+a(this[t]);return this.s<0?this.t*this.DB:-1},t.prototype.bitCount=function(){for(var t=0,e=this.s&this.DM,i=0;i<this.t;++i)t+=u(this[i]^e);return t},t.prototype.testBit=function(t){var e=Math.floor(t/this.DB);return e>=this.t?0!=this.s:0!=(this[e]&1<<t%this.DB)},t.prototype.setBit=function(t){return this.changeBit(t,s)},t.prototype.clearBit=function(t){return this.changeBit(t,h)},t.prototype.flipBit=function(t){return this.changeBit(t,o)},t.prototype.add=function(t){var e=N();return this.addTo(t,e),e},t.prototype.subtract=function(t){var e=N();return this.subTo(t,e),e},t.prototype.multiply=function(t){var e=N();return this.multiplyTo(t,e),e},t.prototype.divide=function(t){var e=N();return this.divRemTo(t,e,null),e},t.prototype.remainder=function(t){var e=N();return this.divRemTo(t,null,e),e},t.prototype.divideAndRemainder=function(t){var e=N(),i=N();return this.divRemTo(t,e,i),[e,i]},t.prototype.modPow=function(t,e){var i,r,n=t.bitLength(),s=C(1);if(n<=0)return s;i=n<18?1:n<48?3:n<144?4:n<768?5:6,r=n<8?new A(e):e.isEven()?new I(e):new V(e);var o=[],h=3,a=i-1,u=(1<<i)-1;if(o[1]=r.convert(this),i>1){var c=N();for(r.sqrTo(o[1],c);h<=u;)o[h]=N(),r.mulTo(c,o[h-2],o[h]),h+=2}var f,l,p=t.t-1,g=!0,d=N();for(n=F(t[p])-1;p>=0;){for(n>=a?f=t[p]>>n-a&u:(f=(t[p]&(1<<n+1)-1)<<a-n,p>0&&(f|=t[p-1]>>this.DB+n-a)),h=i;0==(1&f);)f>>=1,--h;if((n-=h)<0&&(n+=this.DB,--p),g)o[f].copyTo(s),g=!1;else{for(;h>1;)r.sqrTo(s,d),r.sqrTo(d,s),h-=2;h>0?r.sqrTo(s,d):(l=s,s=d,d=l),r.mulTo(d,o[f],s)}for(;p>=0&&0==(t[p]&1<<n);)r.sqrTo(s,d),l=s,s=d,d=l,--n<0&&(n=this.DB-1,--p)}return r.revert(s)},t.prototype.modInverse=function(e){var i=e.isEven();if(this.isEven()&&i||0==e.signum())return t.ZERO;for(var r=e.clone(),n=this.clone(),s=C(1),o=C(0),h=C(0),a=C(1);0!=r.signum();){for(;r.isEven();)r.rShiftTo(1,r),i?(s.isEven()&&o.isEven()||(s.addTo(this,s),o.subTo(e,o)),s.rShiftTo(1,s)):o.isEven()||o.subTo(e,o),o.rShiftTo(1,o);for(;n.isEven();)n.rShiftTo(1,n),i?(h.isEven()&&a.isEven()||(h.addTo(this,h),a.subTo(e,a)),h.rShiftTo(1,h)):a.isEven()||a.subTo(e,a),a.rShiftTo(1,a);r.compareTo(n)>=0?(r.subTo(n,r),i&&s.subTo(h,s),o.subTo(a,o)):(n.subTo(r,n),i&&h.subTo(s,h),a.subTo(o,a))}return 0!=n.compareTo(t.ONE)?t.ZERO:a.compareTo(e)>=0?a.subtract(e):a.signum()<0?(a.addTo(e,a),a.signum()<0?a.add(e):a):a},t.prototype.pow=function(t){return this.exp(t,new O)},t.prototype.gcd=function(t){var e=this.s<0?this.negate():this.clone(),i=t.s<0?t.negate():t.clone();if(e.compareTo(i)<0){var r=e;e=i,i=r}var n=e.getLowestSetBit(),s=i.getLowestSetBit();if(s<0)return e;for(n<s&&(s=n),s>0&&(e.rShiftTo(s,e),i.rShiftTo(s,i));e.signum()>0;)(n=e.getLowestSetBit())>0&&e.rShiftTo(n,e),(n=i.getLowestSetBit())>0&&i.rShiftTo(n,i),e.compareTo(i)>=0?(e.subTo(i,e),e.rShiftTo(1,e)):(i.subTo(e,i),i.rShiftTo(1,i));return s>0&&i.lShiftTo(s,i),i},t.prototype.isProbablePrime=function(t){var e,i=this.abs();if(1==i.t&&i[0]<=x[x.length-1]){for(e=0;e<x.length;++e)if(i[0]==x[e])return!0;return!1}if(i.isEven())return!1;for(e=1;e<x.length;){for(var r=x[e],n=e+1;n<x.length&&r<R;)r*=x[n++];for(r=i.modInt(r);e<n;)if(r%x[e++]==0)return!1}return i.millerRabin(t)},t.prototype.copyTo=function(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s},t.prototype.fromInt=function(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0},t.prototype.fromString=function(e,i){var r;if(16==i)r=4;else if(8==i)r=3;else if(256==i)r=8;else if(2==i)r=1;else if(32==i)r=5;else{if(4!=i)return void this.fromRadix(e,i);r=2}this.t=0,this.s=0;for(var n=e.length,s=!1,o=0;--n>=0;){var h=8==r?255&+e[n]:H(e,n);h<0?"-"==e.charAt(n)&&(s=!0):(s=!1,0==o?this[this.t++]=h:o+r>this.DB?(this[this.t-1]|=(h&(1<<this.DB-o)-1)<<o,this[this.t++]=h>>this.DB-o):this[this.t-1]|=h<<o,(o+=r)>=this.DB&&(o-=this.DB))}8==r&&0!=(128&+e[0])&&(this.s=-1,o>0&&(this[this.t-1]|=(1<<this.DB-o)-1<<o)),this.clamp(),s&&t.ZERO.subTo(this,this)},t.prototype.clamp=function(){for(var t=this.s&this.DM;this.t>0&&this[this.t-1]==t;)--this.t},t.prototype.dlShiftTo=function(t,e){var i;for(i=this.t-1;i>=0;--i)e[i+t]=this[i];for(i=t-1;i>=0;--i)e[i]=0;e.t=this.t+t,e.s=this.s},t.prototype.drShiftTo=function(t,e){for(var i=t;i<this.t;++i)e[i-t]=this[i];e.t=Math.max(this.t-t,0),e.s=this.s},t.prototype.lShiftTo=function(t,e){for(var i=t%this.DB,r=this.DB-i,n=(1<<r)-1,s=Math.floor(t/this.DB),o=this.s<<i&this.DM,h=this.t-1;h>=0;--h)e[h+s+1]=this[h]>>r|o,o=(this[h]&n)<<i;for(h=s-1;h>=0;--h)e[h]=0;e[s]=o,e.t=this.t+s+1,e.s=this.s,e.clamp()},t.prototype.rShiftTo=function(t,e){e.s=this.s;var i=Math.floor(t/this.DB);if(i>=this.t)e.t=0;else{var r=t%this.DB,n=this.DB-r,s=(1<<r)-1;e[0]=this[i]>>r;for(var o=i+1;o<this.t;++o)e[o-i-1]|=(this[o]&s)<<n,e[o-i]=this[o]>>r;r>0&&(e[this.t-i-1]|=(this.s&s)<<n),e.t=this.t-i,e.clamp()}},t.prototype.subTo=function(t,e){for(var i=0,r=0,n=Math.min(t.t,this.t);i<n;)r+=this[i]-t[i],e[i++]=r&this.DM,r>>=this.DB;if(t.t<this.t){for(r-=t.s;i<this.t;)r+=this[i],e[i++]=r&this.DM,r>>=this.DB;r+=this.s}else{for(r+=this.s;i<t.t;)r-=t[i],e[i++]=r&this.DM,r>>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[i++]=this.DV+r:r>0&&(e[i++]=r),e.t=i,e.clamp()},t.prototype.multiplyTo=function(e,i){var r=this.abs(),n=e.abs(),s=r.t;for(i.t=s+n.t;--s>=0;)i[s]=0;for(s=0;s<n.t;++s)i[s+r.t]=r.am(0,n[s],i,s,0,r.t);i.s=0,i.clamp(),this.s!=e.s&&t.ZERO.subTo(i,i)},t.prototype.squareTo=function(t){for(var e=this.abs(),i=t.t=2*e.t;--i>=0;)t[i]=0;for(i=0;i<e.t-1;++i){var r=e.am(i,e[i],t,2*i,0,1);(t[i+e.t]+=e.am(i+1,2*e[i],t,2*i+1,r,e.t-i-1))>=e.DV&&(t[i+e.t]-=e.DV,t[i+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(i,e[i],t,2*i,0,1)),t.s=0,t.clamp()},t.prototype.divRemTo=function(e,i,r){var n=e.abs();if(!(n.t<=0)){var s=this.abs();if(s.t<n.t)return null!=i&&i.fromInt(0),void(null!=r&&this.copyTo(r));null==r&&(r=N());var o=N(),h=this.s,a=e.s,u=this.DB-F(n[n.t-1]);u>0?(n.lShiftTo(u,o),s.lShiftTo(u,r)):(n.copyTo(o),s.copyTo(r));var c=o.t,f=o[c-1];if(0!=f){var l=f*(1<<this.F1)+(c>1?o[c-2]>>this.F2:0),p=this.FV/l,g=(1<<this.F1)/l,d=1<<this.F2,v=r.t,m=v-c,y=null==i?N():i;for(o.dlShiftTo(m,y),r.compareTo(y)>=0&&(r[r.t++]=1,r.subTo(y,r)),t.ONE.dlShiftTo(c,y),y.subTo(o,o);o.t<c;)o[o.t++]=0;for(;--m>=0;){var b=r[--v]==f?this.DM:Math.floor(r[v]*p+(r[v-1]+d)*g);if((r[v]+=o.am(0,b,r,m,0,c))<b)for(o.dlShiftTo(m,y),r.subTo(y,r);r[v]<--b;)r.subTo(y,r)}null!=i&&(r.drShiftTo(c,i),h!=a&&t.ZERO.subTo(i,i)),r.t=c,r.clamp(),u>0&&r.rShiftTo(u,r),h<0&&t.ZERO.subTo(r,r)}}},t.prototype.invDigit=function(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return(e=(e=(e=(e=e*(2-(15&t)*e)&15)*(2-(255&t)*e)&255)*(2-((65535&t)*e&65535))&65535)*(2-t*e%this.DV)%this.DV)>0?this.DV-e:-e},t.prototype.isEven=function(){return 0==(this.t>0?1&this[0]:this.s)},t.prototype.exp=function(e,i){if(e>4294967295||e<1)return t.ONE;var r=N(),n=N(),s=i.convert(this),o=F(e)-1;for(s.copyTo(r);--o>=0;)if(i.sqrTo(r,n),(e&1<<o)>0)i.mulTo(n,s,r);else{var h=r;r=n,n=h}return i.revert(r)},t.prototype.chunkSize=function(t){return Math.floor(Math.LN2*this.DB/Math.log(t))},t.prototype.toRadix=function(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),i=Math.pow(t,e),r=C(i),n=N(),s=N(),o="";for(this.divRemTo(r,n,s);n.signum()>0;)o=(i+s.intValue()).toString(t).substr(1)+o,n.divRemTo(r,n,s);return s.intValue().toString(t)+o},t.prototype.fromRadix=function(e,i){this.fromInt(0),null==i&&(i=10);for(var r=this.chunkSize(i),n=Math.pow(i,r),s=!1,o=0,h=0,a=0;a<e.length;++a){var u=H(e,a);u<0?"-"==e.charAt(a)&&0==this.signum()&&(s=!0):(h=i*h+u,++o>=r&&(this.dMultiply(n),this.dAddOffset(h,0),o=0,h=0))}o>0&&(this.dMultiply(Math.pow(i,o)),this.dAddOffset(h,0)),s&&t.ZERO.subTo(this,this)},t.prototype.fromNumber=function(e,i,r){if("number"==typeof i)if(e<2)this.fromInt(1);else for(this.fromNumber(e,r),this.testBit(e-1)||this.bitwiseTo(t.ONE.shiftLeft(e-1),s,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(i);)this.dAddOffset(2,0),this.bitLength()>e&&this.subTo(t.ONE.shiftLeft(e-1),this);else{var n=[],o=7&e;n.length=1+(e>>3),i.nextBytes(n),o>0?n[0]&=(1<<o)-1:n[0]=0,this.fromString(n,256)}},t.prototype.bitwiseTo=function(t,e,i){var r,n,s=Math.min(t.t,this.t);for(r=0;r<s;++r)i[r]=e(this[r],t[r]);if(t.t<this.t){for(n=t.s&this.DM,r=s;r<this.t;++r)i[r]=e(this[r],n);i.t=this.t}else{for(n=this.s&this.DM,r=s;r<t.t;++r)i[r]=e(n,t[r]);i.t=t.t}i.s=e(this.s,t.s),i.clamp()},t.prototype.changeBit=function(e,i){var r=t.ONE.shiftLeft(e);return this.bitwiseTo(r,i,r),r},t.prototype.addTo=function(t,e){for(var i=0,r=0,n=Math.min(t.t,this.t);i<n;)r+=this[i]+t[i],e[i++]=r&this.DM,r>>=this.DB;if(t.t<this.t){for(r+=t.s;i<this.t;)r+=this[i],e[i++]=r&this.DM,r>>=this.DB;r+=this.s}else{for(r+=this.s;i<t.t;)r+=t[i],e[i++]=r&this.DM,r>>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[i++]=r:r<-1&&(e[i++]=this.DV+r),e.t=i,e.clamp()},t.prototype.dMultiply=function(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()},t.prototype.dAddOffset=function(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}},t.prototype.multiplyLowerTo=function(t,e,i){var r=Math.min(this.t+t.t,e);for(i.s=0,i.t=r;r>0;)i[--r]=0;for(var n=i.t-this.t;r<n;++r)i[r+this.t]=this.am(0,t[r],i,r,0,this.t);for(n=Math.min(t.t,e);r<n;++r)this.am(0,t[r],i,r,0,e-r);i.clamp()},t.prototype.multiplyUpperTo=function(t,e,i){--e;var r=i.t=this.t+t.t-e;for(i.s=0;--r>=0;)i[r]=0;for(r=Math.max(e-this.t,0);r<t.t;++r)i[this.t+r-e]=this.am(e-r,t[r],i,0,0,this.t+r-e);i.clamp(),i.drShiftTo(1,i)},t.prototype.modInt=function(t){if(t<=0)return 0;var e=this.DV%t,i=this.s<0?t-1:0;if(this.t>0)if(0==e)i=this[0]%t;else for(var r=this.t-1;r>=0;--r)i=(e*i+this[r])%t;return i},t.prototype.millerRabin=function(e){var i=this.subtract(t.ONE),r=i.getLowestSetBit();if(r<=0)return!1;var n=i.shiftRight(r);(e=e+1>>1)>x.length&&(e=x.length);for(var s=N(),o=0;o<e;++o){s.fromInt(x[Math.floor(Math.random()*x.length)]);var h=s.modPow(n,this);if(0!=h.compareTo(t.ONE)&&0!=h.compareTo(i)){for(var a=1;a++<r&&0!=h.compareTo(i);)if(0==(h=h.modPowInt(2,this)).compareTo(t.ONE))return!1;if(0!=h.compareTo(i))return!1}}return!0},t.prototype.square=function(){var t=N();return this.squareTo(t),t},t.prototype.gcda=function(t,e){var i=this.s<0?this.negate():this.clone(),r=t.s<0?t.negate():t.clone();if(i.compareTo(r)<0){var n=i;i=r,r=n}var s=i.getLowestSetBit(),o=r.getLowestSetBit();if(o<0)e(i);else{s<o&&(o=s),o>0&&(i.rShiftTo(o,i),r.rShiftTo(o,r));var h=function(){(s=i.getLowestSetBit())>0&&i.rShiftTo(s,i),(s=r.getLowestSetBit())>0&&r.rShiftTo(s,r),i.compareTo(r)>=0?(i.subTo(r,i),i.rShiftTo(1,i)):(r.subTo(i,r),r.rShiftTo(1,r)),i.signum()>0?setTimeout(h,0):(o>0&&r.lShiftTo(o,r),setTimeout((function(){e(r)}),0))};setTimeout(h,10)}},t.prototype.fromNumberAsync=function(e,i,r,n){if("number"==typeof i)if(e<2)this.fromInt(1);else{this.fromNumber(e,r),this.testBit(e-1)||this.bitwiseTo(t.ONE.shiftLeft(e-1),s,this),this.isEven()&&this.dAddOffset(1,0);var o=this,h=function(){o.dAddOffset(2,0),o.bitLength()>e&&o.subTo(t.ONE.shiftLeft(e-1),o),o.isProbablePrime(i)?setTimeout((function(){n()}),0):setTimeout(h,0)};setTimeout(h,0)}else{var a=[],u=7&e;a.length=1+(e>>3),i.nextBytes(a),u>0?a[0]&=(1<<u)-1:a[0]=0,this.fromString(a,256)}},t}(),O=function(){function t(){}return t.prototype.convert=function(t){return t},t.prototype.revert=function(t){return t},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i)},t.prototype.sqrTo=function(t,e){t.squareTo(e)},t}(),A=function(){function t(t){this.m=t}return t.prototype.convert=function(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){t.divRemTo(this.m,null,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),V=function(){function t(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<<t.DB-15)-1,this.mt2=2*t.t}return t.prototype.convert=function(t){var e=N();return t.abs().dlShiftTo(this.m.t,e),e.divRemTo(this.m,null,e),t.s<0&&e.compareTo(B.ZERO)>0&&this.m.subTo(e,e),e},t.prototype.revert=function(t){var e=N();return t.copyTo(e),this.reduce(e),e},t.prototype.reduce=function(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e<this.m.t;++e){var i=32767&t[e],r=i*this.mpl+((i*this.mph+(t[e]>>15)*this.mpl&this.um)<<15)&t.DM;for(t[i=e+this.m.t]+=this.m.am(0,r,t,e,0,this.m.t);t[i]>=t.DV;)t[i]-=t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),I=function(){function t(t){this.m=t,this.r2=N(),this.q3=N(),B.ONE.dlShiftTo(2*t.t,this.r2),this.mu=this.r2.divide(t)}return t.prototype.convert=function(t){if(t.s<0||t.t>2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=N();return t.copyTo(e),this.reduce(e),e},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}();function N(){return new B(null)}function P(t,e){return new B(t,e)}var M="undefined"!=typeof navigator;M&&"Microsoft Internet Explorer"==navigator.appName?(B.prototype.am=function(t,e,i,r,n,s){for(var o=32767&e,h=e>>15;--s>=0;){var a=32767&this[t],u=this[t++]>>15,c=h*a+u*o;n=((a=o*a+((32767&c)<<15)+i[r]+(1073741823&n))>>>30)+(c>>>15)+h*u+(n>>>30),i[r++]=1073741823&a}return n},S=30):M&&"Netscape"!=navigator.appName?(B.prototype.am=function(t,e,i,r,n,s){for(;--s>=0;){var o=e*this[t++]+i[r]+n;n=Math.floor(o/67108864),i[r++]=67108863&o}return n},S=26):(B.prototype.am=function(t,e,i,r,n,s){for(var o=16383&e,h=e>>14;--s>=0;){var a=16383&this[t],u=this[t++]>>14,c=h*a+u*o;n=((a=o*a+((16383&c)<<14)+i[r]+n)>>28)+(c>>14)+h*u,i[r++]=268435455&a}return n},S=28),B.prototype.DB=S,B.prototype.DM=(1<<S)-1,B.prototype.DV=1<<S,B.prototype.FV=Math.pow(2,52),B.prototype.F1=52-S,B.prototype.F2=2*S-52;var j,q,L=[];for(j="0".charCodeAt(0),q=0;q<=9;++q)L[j++]=q;for(j="a".charCodeAt(0),q=10;q<36;++q)L[j++]=q;for(j="A".charCodeAt(0),q=10;q<36;++q)L[j++]=q;function H(t,e){var i=L[t.charCodeAt(e)];return null==i?-1:i}function C(t){var e=N();return e.fromInt(t),e}function F(t){var e,i=1;return 0!=(e=t>>>16)&&(t=e,i+=16),0!=(e=t>>8)&&(t=e,i+=8),0!=(e=t>>4)&&(t=e,i+=4),0!=(e=t>>2)&&(t=e,i+=2),0!=(e=t>>1)&&(t=e,i+=1),i}B.ZERO=C(0),B.ONE=C(1);var U,K,k=function(){function t(){this.i=0,this.j=0,this.S=[]}return t.prototype.init=function(t){var e,i,r;for(e=0;e<256;++e)this.S[e]=e;for(i=0,e=0;e<256;++e)i=i+this.S[e]+t[e%t.length]&255,r=this.S[e],this.S[e]=this.S[i],this.S[i]=r;this.i=0,this.j=0},t.prototype.next=function(){var t;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,t=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=t,this.S[t+this.S[this.i]&255]},t}(),_=null;if(null==_){_=[],K=0;var z=void 0;if(window.crypto&&window.crypto.getRandomValues){var Z=new Uint32Array(256);for(window.crypto.getRandomValues(Z),z=0;z<Z.length;++z)_[K++]=255&Z[z]}var G=0,$=function(t){if((G=G||0)>=256||K>=256)window.removeEventListener?window.removeEventListener("mousemove",$,!1):window.detachEvent&&window.detachEvent("onmousemove",$);else try{var e=t.x+t.y;_[K++]=255&e,G+=1}catch(t){}};window.addEventListener?window.addEventListener("mousemove",$,!1):window.attachEvent&&window.attachEvent("onmousemove",$)}function Y(){if(null==U){for(U=new k;K<256;){var t=Math.floor(65536*Math.random());_[K++]=255&t}for(U.init(_),K=0;K<_.length;++K)_[K]=0;K=0}return U.next()}var J=function(){function t(){}return t.prototype.nextBytes=function(t){for(var e=0;e<t.length;++e)t[e]=Y()},t}(),X=function(){function t(){this.n=null,this.e=0,this.d=null,this.p=null,this.q=null,this.dmp1=null,this.dmq1=null,this.coeff=null}return t.prototype.doPublic=function(t){return t.modPowInt(this.e,this.n)},t.prototype.doPrivate=function(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),i=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(i)<0;)e=e.add(this.p);return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i)},t.prototype.setPublic=function(t,e){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=P(t,16),this.e=parseInt(e,16)):console.error("Invalid RSA public key")},t.prototype.encrypt=function(t){var e=this.n.bitLength()+7>>3,i=function(t,e){if(e<t.length+11)return console.error("Message too long for RSA"),null;for(var i=[],r=t.length-1;r>=0&&e>0;){var n=t.charCodeAt(r--);n<128?i[--e]=n:n>127&&n<2048?(i[--e]=63&n|128,i[--e]=n>>6|192):(i[--e]=63&n|128,i[--e]=n>>6&63|128,i[--e]=n>>12|224)}i[--e]=0;for(var s=new J,o=[];e>2;){for(o[0]=0;0==o[0];)s.nextBytes(o);i[--e]=o[0]}return i[--e]=2,i[--e]=0,new B(i)}(t,e);if(null==i)return null;var r=this.doPublic(i);if(null==r)return null;for(var n=r.toString(16),s=n.length,o=0;o<2*e-s;o++)n="0"+n;return n},t.prototype.setPrivate=function(t,e,i){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=P(t,16),this.e=parseInt(e,16),this.d=P(i,16)):console.error("Invalid RSA private key")},t.prototype.setPrivateEx=function(t,e,i,r,n,s,o,h){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=P(t,16),this.e=parseInt(e,16),this.d=P(i,16),this.p=P(r,16),this.q=P(n,16),this.dmp1=P(s,16),this.dmq1=P(o,16),this.coeff=P(h,16)):console.error("Invalid RSA private key")},t.prototype.generate=function(t,e){var i=new J,r=t>>1;this.e=parseInt(e,16);for(var n=new B(e,16);;){for(;this.p=new B(t-r,1,i),0!=this.p.subtract(B.ONE).gcd(n).compareTo(B.ONE)||!this.p.isProbablePrime(10););for(;this.q=new B(r,1,i),0!=this.q.subtract(B.ONE).gcd(n).compareTo(B.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var o=this.p.subtract(B.ONE),h=this.q.subtract(B.ONE),a=o.multiply(h);if(0==a.gcd(n).compareTo(B.ONE)){this.n=this.p.multiply(this.q),this.d=n.modInverse(a),this.dmp1=this.d.mod(o),this.dmq1=this.d.mod(h),this.coeff=this.q.modInverse(this.p);break}}},t.prototype.decrypt=function(t){var e=P(t,16),i=this.doPrivate(e);return null==i?null:function(t,e){for(var i=t.toByteArray(),r=0;r<i.length&&0==i[r];)++r;if(i.length-r!=e-1||2!=i[r])return null;for(++r;0!=i[r];)if(++r>=i.length)return null;for(var n="";++r<i.length;){var s=255&i[r];s<128?n+=String.fromCharCode(s):s>191&&s<224?(n+=String.fromCharCode((31&s)<<6|63&i[r+1]),++r):(n+=String.fromCharCode((15&s)<<12|(63&i[r+1])<<6|63&i[r+2]),r+=2)}return n}(i,this.n.bitLength()+7>>3)},t.prototype.generateAsync=function(t,e,i){var r=new J,n=t>>1;this.e=parseInt(e,16);var s=new B(e,16),o=this,h=function(){var e=function(){if(o.p.compareTo(o.q)<=0){var t=o.p;o.p=o.q,o.q=t}var e=o.p.subtract(B.ONE),r=o.q.subtract(B.ONE),n=e.multiply(r);0==n.gcd(s).compareTo(B.ONE)?(o.n=o.p.multiply(o.q),o.d=s.modInverse(n),o.dmp1=o.d.mod(e),o.dmq1=o.d.mod(r),o.coeff=o.q.modInverse(o.p),setTimeout((function(){i()}),0)):setTimeout(h,0)},a=function(){o.q=N(),o.q.fromNumberAsync(n,1,r,(function(){o.q.subtract(B.ONE).gcda(s,(function(t){0==t.compareTo(B.ONE)&&o.q.isProbablePrime(10)?setTimeout(e,0):setTimeout(a,0)}))}))},u=function(){o.p=N(),o.p.fromNumberAsync(t-n,1,r,(function(){o.p.subtract(B.ONE).gcda(s,(function(t){0==t.compareTo(B.ONE)&&o.p.isProbablePrime(10)?setTimeout(a,0):setTimeout(u,0)}))}))};setTimeout(u,0)};setTimeout(h,0)},t.prototype.sign=function(t,e,i){var r=function(t,e){if(e<t.length+22)return console.error("Message too long for RSA"),null;for(var i=e-t.length-6,r="",n=0;n<i;n+=2)r+="ff";return P("0001"+r+"00"+t,16)}((Q[i]||"")+e(t).toString(),this.n.bitLength()/4);if(null==r)return null;var n=this.doPrivate(r);if(null==n)return null;var s=n.toString(16);return 0==(1&s.length)?s:"0"+s},t.prototype.verify=function(t,e,i){var r=P(e,16),n=this.doPublic(r);return null==n?null:function(t){for(var e in Q)if(Q.hasOwnProperty(e)){var i=Q[e],r=i.length;if(t.substr(0,r)==i)return t.substr(r)}return t}(n.toString(16).replace(/^1f+00/,""))==i(t).toString()},t}(),Q={md2:"3020300c06082a864886f70d020205000410",md5:"3020300c06082a864886f70d020505000410",sha1:"3021300906052b0e03021a05000414",sha224:"302d300d06096086480165030402040500041c",sha256:"3031300d060960864801650304020105000420",sha384:"3041300d060960864801650304020205000430",sha512:"3051300d060960864801650304020305000440",ripemd160:"3021300906052b2403020105000414"},W={};W.lang={extend:function(t,e,i){if(!e||!t)throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included.");var r=function(){};if(r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t,t.superclass=e.prototype,e.prototype.constructor==Object.prototype.constructor&&(e.prototype.constructor=e),i){var n;for(n in i)t.prototype[n]=i[n];var s=function(){},o=["toString","valueOf"];try{/MSIE/.test(navigator.userAgent)&&(s=function(t,e){for(n=0;n<o.length;n+=1){var i=o[n],r=e[i];"function"==typeof r&&r!=Object.prototype[i]&&(t[i]=r)}})}catch(t){}s(t.prototype,i)}}};var tt={};void 0!==tt.asn1&&tt.asn1||(tt.asn1={}),tt.asn1.ASN1Util=new function(){this.integerToByteHex=function(t){var e=t.toString(16);return e.length%2==1&&(e="0"+e),e},this.bigIntToMinTwosComplementsHex=function(t){var e=t.toString(16);if("-"!=e.substr(0,1))e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);else{var i=e.substr(1).length;i%2==1?i+=1:e.match(/^[0-7]/)||(i+=2);for(var r="",n=0;n<i;n++)r+="f";e=new B(r,16).xor(t).add(B.ONE).toString(16).replace(/^-/,"")}return e},this.getPEMStringFromHex=function(t,e){return hextopem(t,e)},this.newObject=function(t){var e=tt.asn1,i=e.DERBoolean,r=e.DERInteger,n=e.DERBitString,s=e.DEROctetString,o=e.DERNull,h=e.DERObjectIdentifier,a=e.DEREnumerated,u=e.DERUTF8String,c=e.DERNumericString,f=e.DERPrintableString,l=e.DERTeletexString,p=e.DERIA5String,g=e.DERUTCTime,d=e.DERGeneralizedTime,v=e.DERSequence,m=e.DERSet,y=e.DERTaggedObject,b=e.ASN1Util.newObject,T=Object.keys(t);if(1!=T.length)throw"key of param shall be only one.";var S=T[0];if(-1==":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":"+S+":"))throw"undefined key: "+S;if("bool"==S)return new i(t[S]);if("int"==S)return new r(t[S]);if("bitstr"==S)return new n(t[S]);if("octstr"==S)return new s(t[S]);if("null"==S)return new o(t[S]);if("oid"==S)return new h(t[S]);if("enum"==S)return new a(t[S]);if("utf8str"==S)return new u(t[S]);if("numstr"==S)return new c(t[S]);if("prnstr"==S)return new f(t[S]);if("telstr"==S)return new l(t[S]);if("ia5str"==S)return new p(t[S]);if("utctime"==S)return new g(t[S]);if("gentime"==S)return new d(t[S]);if("seq"==S){for(var E=t[S],w=[],D=0;D<E.length;D++){var x=b(E[D]);w.push(x)}return new v({array:w})}if("set"==S){for(E=t[S],w=[],D=0;D<E.length;D++)x=b(E[D]),w.push(x);return new m({array:w})}if("tag"==S){var R=t[S];if("[object Array]"===Object.prototype.toString.call(R)&&3==R.length){var B=b(R[2]);return new y({tag:R[0],explicit:R[1],obj:B})}var O={};if(void 0!==R.explicit&&(O.explicit=R.explicit),void 0!==R.tag&&(O.tag=R.tag),void 0===R.obj)throw"obj shall be specified for 'tag'.";return O.obj=b(R.obj),new y(O)}},this.jsonToASN1HEX=function(t){return this.newObject(t).getEncodedHex()}},tt.asn1.ASN1Util.oidHexToInt=function(t){for(var e="",i=parseInt(t.substr(0,2),16),r=(e=Math.floor(i/40)+"."+i%40,""),n=2;n<t.length;n+=2){var s=("00000000"+parseInt(t.substr(n,2),16).toString(2)).slice(-8);r+=s.substr(1,7),"0"==s.substr(0,1)&&(e=e+"."+new B(r,2).toString(10),r="")}return e},tt.asn1.ASN1Util.oidIntToHex=function(t){var e=function(t){var e=t.toString(16);return 1==e.length&&(e="0"+e),e},i=function(t){var i="",r=new B(t,10).toString(2),n=7-r.length%7;7==n&&(n=0);for(var s="",o=0;o<n;o++)s+="0";for(r=s+r,o=0;o<r.length-1;o+=7){var h=r.substr(o,7);o!=r.length-7&&(h="1"+h),i+=e(parseInt(h,2))}return i};if(!t.match(/^[0-9.]+$/))throw"malformed oid string: "+t;var r="",n=t.split("."),s=40*parseInt(n[0])+parseInt(n[1]);r+=e(s),n.splice(0,2);for(var o=0;o<n.length;o++)r+=i(n[o]);return r},tt.asn1.ASN1Object=function(){this.getLengthHexFromValue=function(){if(void 0===this.hV||null==this.hV)throw"this.hV is null or undefined.";if(this.hV.length%2==1)throw"value hex must be even length: n="+"".length+",v="+this.hV;var t=this.hV.length/2,e=t.toString(16);if(e.length%2==1&&(e="0"+e),t<128)return e;var i=e.length/2;if(i>15)throw"ASN.1 length too long to represent by 8x: n = "+t.toString(16);return(128+i).toString(16)+e},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},tt.asn1.DERAbstractString=function(t){tt.asn1.DERAbstractString.superclass.constructor.call(this),this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&("string"==typeof t?this.setString(t):void 0!==t.str?this.setString(t.str):void 0!==t.hex&&this.setStringHex(t.hex))},W.lang.extend(tt.asn1.DERAbstractString,tt.asn1.ASN1Object),tt.asn1.DERAbstractTime=function(t){tt.asn1.DERAbstractTime.superclass.constructor.call(this),this.localDateToUTC=function(t){return utc=t.getTime()+6e4*t.getTimezoneOffset(),new Date(utc)},this.formatDate=function(t,e,i){var r=this.zeroPadding,n=this.localDateToUTC(t),s=String(n.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=s+r(String(n.getMonth()+1),2)+r(String(n.getDate()),2)+r(String(n.getHours()),2)+r(String(n.getMinutes()),2)+r(String(n.getSeconds()),2);if(!0===i){var h=n.getMilliseconds();if(0!=h){var a=r(String(h),3);o=o+"."+(a=a.replace(/[0]+$/,""))}}return o+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(t)},this.setByDateValue=function(t,e,i,r,n,s){var o=new Date(Date.UTC(t,e-1,i,r,n,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},W.lang.extend(tt.asn1.DERAbstractTime,tt.asn1.ASN1Object),tt.asn1.DERAbstractStructured=function(t){tt.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,void 0!==t&&void 0!==t.array&&(this.asn1Array=t.array)},W.lang.extend(tt.asn1.DERAbstractStructured,tt.asn1.ASN1Object),tt.asn1.DERBoolean=function(){tt.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},W.lang.extend(tt.asn1.DERBoolean,tt.asn1.ASN1Object),tt.asn1.DERInteger=function(t){tt.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=tt.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new B(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.bigint?this.setByBigInteger(t.bigint):void 0!==t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):void 0!==t.hex&&this.setValueHex(t.hex))},W.lang.extend(tt.asn1.DERInteger,tt.asn1.ASN1Object),tt.asn1.DERBitString=function(t){if(void 0!==t&&void 0!==t.obj){var e=tt.asn1.ASN1Util.newObject(t.obj);t.hex="00"+e.getEncodedHex()}tt.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7<t)throw"unused bits shall be from 0 to 7: u = "+t;var i="0"+t;this.hTLV=null,this.isModified=!0,this.hV=i+e},this.setByBinaryString=function(t){var e=8-(t=t.replace(/0+$/,"")).length%8;8==e&&(e=0);for(var i=0;i<=e;i++)t+="0";var r="";for(i=0;i<t.length-1;i+=8){var n=t.substr(i,8),s=parseInt(n,2).toString(16);1==s.length&&(s="0"+s),r+=s}this.hTLV=null,this.isModified=!0,this.hV="0"+e+r},this.setByBooleanArray=function(t){for(var e="",i=0;i<t.length;i++)1==t[i]?e+="1":e+="0";this.setByBinaryString(e)},this.newFalseArray=function(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=!1;return e},this.getFreshValueHex=function(){return this.hV},void 0!==t&&("string"==typeof t&&t.toLowerCase().match(/^[0-9a-f]+$/)?this.setHexValueIncludingUnusedBits(t):void 0!==t.hex?this.setHexValueIncludingUnusedBits(t.hex):void 0!==t.bin?this.setByBinaryString(t.bin):void 0!==t.array&&this.setByBooleanArray(t.array))},W.lang.extend(tt.asn1.DERBitString,tt.asn1.ASN1Object),tt.asn1.DEROctetString=function(t){if(void 0!==t&&void 0!==t.obj){var e=tt.asn1.ASN1Util.newObject(t.obj);t.hex=e.getEncodedHex()}tt.asn1.DEROctetString.superclass.constructor.call(this,t),this.hT="04"},W.lang.extend(tt.asn1.DEROctetString,tt.asn1.DERAbstractString),tt.asn1.DERNull=function(){tt.asn1.DERNull.superclass.constructor.call(this),this.hT="05",this.hTLV="0500"},W.lang.extend(tt.asn1.DERNull,tt.asn1.ASN1Object),tt.asn1.DERObjectIdentifier=function(t){var e=function(t){var e=t.toString(16);return 1==e.length&&(e="0"+e),e},i=function(t){var i="",r=new B(t,10).toString(2),n=7-r.length%7;7==n&&(n=0);for(var s="",o=0;o<n;o++)s+="0";for(r=s+r,o=0;o<r.length-1;o+=7){var h=r.substr(o,7);o!=r.length-7&&(h="1"+h),i+=e(parseInt(h,2))}return i};tt.asn1.DERObjectIdentifier.superclass.constructor.call(this),this.hT="06",this.setValueHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.setValueOidString=function(t){if(!t.match(/^[0-9.]+$/))throw"malformed oid string: "+t;var r="",n=t.split("."),s=40*parseInt(n[0])+parseInt(n[1]);r+=e(s),n.splice(0,2);for(var o=0;o<n.length;o++)r+=i(n[o]);this.hTLV=null,this.isModified=!0,this.s=null,this.hV=r},this.setValueName=function(t){var e=tt.asn1.x509.OID.name2oid(t);if(""===e)throw"DERObjectIdentifier oidName undefined: "+t;this.setValueOidString(e)},this.getFreshValueHex=function(){return this.hV},void 0!==t&&("string"==typeof t?t.match(/^[0-2].[0-9.]+$/)?this.setValueOidString(t):this.setValueName(t):void 0!==t.oid?this.setValueOidString(t.oid):void 0!==t.hex?this.setValueHex(t.hex):void 0!==t.name&&this.setValueName(t.name))},W.lang.extend(tt.asn1.DERObjectIdentifier,tt.asn1.ASN1Object),tt.asn1.DEREnumerated=function(t){tt.asn1.DEREnumerated.superclass.constructor.call(this),this.hT="0a",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=tt.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new B(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):void 0!==t.hex&&this.setValueHex(t.hex))},W.lang.extend(tt.asn1.DEREnumerated,tt.asn1.ASN1Object),tt.asn1.DERUTF8String=function(t){tt.asn1.DERUTF8String.superclass.constructor.call(this,t),this.hT="0c"},W.lang.extend(tt.asn1.DERUTF8String,tt.asn1.DERAbstractString),tt.asn1.DERNumericString=function(t){tt.asn1.DERNumericString.superclass.constructor.call(this,t),this.hT="12"},W.lang.extend(tt.asn1.DERNumericString,tt.asn1.DERAbstractString),tt.asn1.DERPrintableString=function(t){tt.asn1.DERPrintableString.superclass.constructor.call(this,t),this.hT="13"},W.lang.extend(tt.asn1.DERPrintableString,tt.asn1.DERAbstractString),tt.asn1.DERTeletexString=function(t){tt.asn1.DERTeletexString.superclass.constructor.call(this,t),this.hT="14"},W.lang.extend(tt.asn1.DERTeletexString,tt.asn1.DERAbstractString),tt.asn1.DERIA5String=function(t){tt.asn1.DERIA5String.superclass.constructor.call(this,t),this.hT="16"},W.lang.extend(tt.asn1.DERIA5String,tt.asn1.DERAbstractString),tt.asn1.DERUTCTime=function(t){tt.asn1.DERUTCTime.superclass.constructor.call(this,t),this.hT="17",this.setByDate=function(t){this.hTLV=null,this.isModified=!0,this.date=t,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)),this.hV},void 0!==t&&(void 0!==t.str?this.setString(t.str):"string"==typeof t&&t.match(/^[0-9]{12}Z$/)?this.setString(t):void 0!==t.hex?this.setStringHex(t.hex):void 0!==t.date&&this.setByDate(t.date))},W.lang.extend(tt.asn1.DERUTCTime,tt.asn1.DERAbstractTime),tt.asn1.DERGeneralizedTime=function(t){tt.asn1.DERGeneralizedTime.superclass.constructor.call(this,t),this.hT="18",this.withMillis=!1,this.setByDate=function(t){this.hTLV=null,this.isModified=!0,this.date=t,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)),this.hV},void 0!==t&&(void 0!==t.str?this.setString(t.str):"string"==typeof t&&t.match(/^[0-9]{14}Z$/)?this.setString(t):void 0!==t.hex?this.setStringHex(t.hex):void 0!==t.date&&this.setByDate(t.date),!0===t.millis&&(this.withMillis=!0))},W.lang.extend(tt.asn1.DERGeneralizedTime,tt.asn1.DERAbstractTime),tt.asn1.DERSequence=function(t){tt.asn1.DERSequence.superclass.constructor.call(this,t),this.hT="30",this.getFreshValueHex=function(){for(var t="",e=0;e<this.asn1Array.length;e++)t+=this.asn1Array[e].getEncodedHex();return this.hV=t,this.hV}},W.lang.extend(tt.asn1.DERSequence,tt.asn1.DERAbstractStructured),tt.asn1.DERSet=function(t){tt.asn1.DERSet.superclass.constructor.call(this,t),this.hT="31",this.sortFlag=!0,this.getFreshValueHex=function(){for(var t=new Array,e=0;e<this.asn1Array.length;e++){var i=this.asn1Array[e];t.push(i.getEncodedHex())}return 1==this.sortFlag&&t.sort(),this.hV=t.join(""),this.hV},void 0!==t&&void 0!==t.sortflag&&0==t.sortflag&&(this.sortFlag=!1)},W.lang.extend(tt.asn1.DERSet,tt.asn1.DERAbstractStructured),tt.asn1.DERTaggedObject=function(t){tt.asn1.DERTaggedObject.superclass.constructor.call(this),this.hT="a0",this.hV="",this.isExplicit=!0,this.asn1Object=null,this.setASN1Object=function(t,e,i){this.hT=e,this.isExplicit=t,this.asn1Object=i,this.isExplicit?(this.hV=this.asn1Object.getEncodedHex(),this.hTLV=null,this.isModified=!0):(this.hV=null,this.hTLV=i.getEncodedHex(),this.hTLV=this.hTLV.replace(/^../,e),this.isModified=!1)},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.tag&&(this.hT=t.tag),void 0!==t.explicit&&(this.isExplicit=t.explicit),void 0!==t.obj&&(this.asn1Object=t.obj,this.setASN1Object(this.isExplicit,this.hT,this.asn1Object)))},W.lang.extend(tt.asn1.DERTaggedObject,tt.asn1.ASN1Object);var et,it=(et=function(t,e){return(et=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])})(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function i(){this.constructor=t}et(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}),rt=function(t){function e(i){var r=t.call(this)||this;return i&&("string"==typeof i?r.parseKey(i):(e.hasPrivateKeyProperty(i)||e.hasPublicKeyProperty(i))&&r.parsePropertiesFrom(i)),r}return it(e,t),e.prototype.parseKey=function(t){try{var e=0,i=0,r=/^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/.test(t)?function(t){var e;if(void 0===c){var i="0123456789ABCDEF",r=" \f\n\r\t \u2028\u2029";for(c={},e=0;e<16;++e)c[i.charAt(e)]=e;for(i=i.toLowerCase(),e=10;e<16;++e)c[i.charAt(e)]=e;for(e=0;e<r.length;++e)c[r.charAt(e)]=-1}var n=[],s=0,o=0;for(e=0;e<t.length;++e){var h=t.charAt(e);if("="==h)break;if(-1!=(h=c[h])){if(void 0===h)throw new Error("Illegal character at offset "+e);s|=h,++o>=2?(n[n.length]=s,s=0,o=0):s<<=4}}if(o)throw new Error("Hex encoding incomplete: 4 bits missing");return n}(t):d.unarmor(t),n=w.decode(r);if(3===n.sub.length&&(n=n.sub[2].sub[0]),9===n.sub.length){e=n.sub[1].getHexStringValue(),this.n=P(e,16),i=n.sub[2].getHexStringValue(),this.e=parseInt(i,16);var s=n.sub[3].getHexStringValue();this.d=P(s,16);var o=n.sub[4].getHexStringValue();this.p=P(o,16);var h=n.sub[5].getHexStringValue();this.q=P(h,16);var a=n.sub[6].getHexStringValue();this.dmp1=P(a,16);var u=n.sub[7].getHexStringValue();this.dmq1=P(u,16);var f=n.sub[8].getHexStringValue();this.coeff=P(f,16)}else{if(2!==n.sub.length)return!1;var l=n.sub[1].sub[0];e=l.sub[0].getHexStringValue(),this.n=P(e,16),i=l.sub[1].getHexStringValue(),this.e=parseInt(i,16)}return!0}catch(t){return!1}},e.prototype.getPrivateBaseKey=function(){var t={array:[new tt.asn1.DERInteger({int:0}),new tt.asn1.DERInteger({bigint:this.n}),new tt.asn1.DERInteger({int:this.e}),new tt.asn1.DERInteger({bigint:this.d}),new tt.asn1.DERInteger({bigint:this.p}),new tt.asn1.DERInteger({bigint:this.q}),new tt.asn1.DERInteger({bigint:this.dmp1}),new tt.asn1.DERInteger({bigint:this.dmq1}),new tt.asn1.DERInteger({bigint:this.coeff})]};return new tt.asn1.DERSequence(t).getEncodedHex()},e.prototype.getPrivateBaseKeyB64=function(){return l(this.getPrivateBaseKey())},e.prototype.getPublicBaseKey=function(){var t=new tt.asn1.DERSequence({array:[new tt.asn1.DERObjectIdentifier({oid:"1.2.840.113549.1.1.1"}),new tt.asn1.DERNull]}),e=new tt.asn1.DERSequence({array:[new tt.asn1.DERInteger({bigint:this.n}),new tt.asn1.DERInteger({int:this.e})]}),i=new tt.asn1.DERBitString({hex:"00"+e.getEncodedHex()});return new tt.asn1.DERSequence({array:[t,i]}).getEncodedHex()},e.prototype.getPublicBaseKeyB64=function(){return l(this.getPublicBaseKey())},e.wordwrap=function(t,e){if(!t)return t;var i="(.{1,"+(e=e||64)+"})( +|$\n?)|(.{1,"+e+"})";return t.match(RegExp(i,"g")).join("\n")},e.prototype.getPrivateKey=function(){var t="-----BEGIN RSA PRIVATE KEY-----\n";return(t+=e.wordwrap(this.getPrivateBaseKeyB64())+"\n")+"-----END RSA PRIVATE KEY-----"},e.prototype.getPublicKey=function(){var t="-----BEGIN PUBLIC KEY-----\n";return(t+=e.wordwrap(this.getPublicBaseKeyB64())+"\n")+"-----END PUBLIC KEY-----"},e.hasPublicKeyProperty=function(t){return(t=t||{}).hasOwnProperty("n")&&t.hasOwnProperty("e")},e.hasPrivateKeyProperty=function(t){return(t=t||{}).hasOwnProperty("n")&&t.hasOwnProperty("e")&&t.hasOwnProperty("d")&&t.hasOwnProperty("p")&&t.hasOwnProperty("q")&&t.hasOwnProperty("dmp1")&&t.hasOwnProperty("dmq1")&&t.hasOwnProperty("coeff")},e.prototype.parsePropertiesFrom=function(t){this.n=t.n,this.e=t.e,t.hasOwnProperty("d")&&(this.d=t.d,this.p=t.p,this.q=t.q,this.dmp1=t.dmp1,this.dmq1=t.dmq1,this.coeff=t.coeff)},e}(X);const nt=function(){function t(t){t=t||{},this.default_key_size=t.default_key_size?parseInt(t.default_key_size,10):1024,this.default_public_exponent=t.default_public_exponent||"010001",this.log=t.log||!1,this.key=null}return t.prototype.setKey=function(t){this.log&&this.key&&console.warn("A key was already set, overriding existing."),this.key=new rt(t)},t.prototype.setPrivateKey=function(t){this.setKey(t)},t.prototype.setPublicKey=function(t){this.setKey(t)},t.prototype.decrypt=function(t){try{return this.getKey().decrypt(p(t))}catch(t){return!1}},t.prototype.encrypt=function(t){try{return l(this.getKey().encrypt(t))}catch(t){return!1}},t.prototype.sign=function(t,e,i){try{return l(this.getKey().sign(t,e,i))}catch(t){return!1}},t.prototype.verify=function(t,e,i){try{return this.getKey().verify(t,p(e),i)}catch(t){return!1}},t.prototype.getKey=function(t){if(!this.key){if(this.key=new rt,t&&"[object Function]"==={}.toString.call(t))return void this.key.generateAsync(this.default_key_size,this.default_public_exponent,t);this.key.generate(this.default_key_size,this.default_public_exponent)}return this.key},t.prototype.getPrivateKey=function(){return this.getKey().getPrivateKey()},t.prototype.getPrivateKeyB64=function(){return this.getKey().getPrivateBaseKeyB64()},t.prototype.getPublicKey=function(){return this.getKey().getPublicKey()},t.prototype.getPublicKeyB64=function(){return this.getKey().getPublicBaseKeyB64()},t.version="3.2.0",t}()}],e={d:(t,i)=>{for(var r in i)e.o(i,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:i[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},i={};return t[1](0,i,e),i.default})()}));
\ No newline at end of file
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
'2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' +
'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' +
'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' +
'/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' +
'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' +
'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' +
'4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' +
'tTbklZkD2A=='
// 加密
export function encrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(txt) // 对需要加密的数据进行加密
}
// 解密
export function decrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPrivateKey(privateKey)
return encryptor.decrypt(txt)
}
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(':')}`
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : `0${n}`
}
module.exports = {
formatTime
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment