微信小程序 提审时隐藏功能;微信小程序添加微信快捷登录、随便看看(登的user用户)
This commit is contained in:
parent
62ed92029c
commit
0238251ab0
12
README.md
12
README.md
@ -318,6 +318,18 @@ window.wsUrl = 'ws://127.0.0.1:80/access/websocket/1';
|
||||
|
||||
|
||||
|
||||
##### 配置小程序 APPID 与 APPSECRET
|
||||
|
||||
修改 `backend/microservice-provider-access-8002/src/main/java/com/cxyxiaomo/epp/access/service/WeChatTokenServiceImpl.java` 文件
|
||||
|
||||
```
|
||||
// 小程序信息
|
||||
final String APPID = "【⚠此处修改为你的小程序 APPID】";
|
||||
final String APPSECRET = "【⚠此处修改为你的小程序 APPSECRET】";
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### nginx 代理配置(可选)
|
||||
|
||||
配置文件在 `nginx-conf` 目录下(不能直接拿来用,需要根据自己的实际情况来改)
|
||||
|
@ -25,4 +25,5 @@ public class User implements Serializable {
|
||||
private String doorplate;
|
||||
private String permission;
|
||||
private LocalDateTime permissionTime;
|
||||
private String wxcode;
|
||||
}
|
||||
|
@ -3,6 +3,9 @@ package com.cxyxiaomo.epp.gateway.controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
|
||||
@RestController
|
||||
public class Controller {
|
||||
|
||||
@ -10,4 +13,35 @@ public class Controller {
|
||||
public String error() {
|
||||
return "[ERROR] 500 Internal Server Error";
|
||||
}
|
||||
|
||||
/**
|
||||
* 为了通过微信的小程序审核所特别处理的
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/getConfig")
|
||||
public HashMap<String, Object> WxMiniProgramAuditSpecialHandle() {
|
||||
boolean showCode = true;
|
||||
boolean showShop = true;
|
||||
LinkedList<String> tabbarItem = new LinkedList<>();
|
||||
tabbarItem.push("pages/index/index");
|
||||
if (showCode) tabbarItem.push("pages/residents/code");
|
||||
tabbarItem.push("pages/residents/report");
|
||||
if (showShop) tabbarItem.push("pages/shop/shop");
|
||||
tabbarItem.push("pages/person/person");
|
||||
|
||||
LinkedList<String> indexItem = new LinkedList<>();
|
||||
indexItem.push("/pages/index/login");
|
||||
if (showCode) indexItem.push("/pages/residents/code");
|
||||
if (showCode) indexItem.push("scanQRCode");
|
||||
indexItem.push("/pages/residents/report");
|
||||
if (showShop) indexItem.push("/pages/shop/shop");
|
||||
indexItem.push("/pages/person/person");
|
||||
indexItem.push("/pages/person/updpwd");
|
||||
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("tabbarItem", tabbarItem);
|
||||
map.put("indexItem", indexItem);
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/access/wechat")
|
||||
public class WeChatTokenController {
|
||||
@ -47,4 +49,18 @@ public class WeChatTokenController {
|
||||
|
||||
return responseBody.bytes();
|
||||
}
|
||||
|
||||
@GetMapping(value = "/rpc/getOpenIdFromApi")
|
||||
@ResponseBody
|
||||
@SneakyThrows
|
||||
public Res getOpenIdFromApi(@RequestParam(value = "code", required = true) String code) {
|
||||
if (Objects.isNull(code) || "".equals(code)) {
|
||||
return Res.error("参数错误");
|
||||
}
|
||||
String openId = weChatTokenService.getOpenIdFromApi(code);
|
||||
if (openId == null) {
|
||||
return Res.error("微信OpenId接口调用失败,请刷新重试");
|
||||
}
|
||||
return Res.success(openId);
|
||||
}
|
||||
}
|
||||
|
@ -97,8 +97,8 @@ public class WeChatTokenServiceImpl implements WeChatTokenService {
|
||||
params.put("check_path", unlimitedQRCodeParam.getCheckPath());
|
||||
params.put("env_version", unlimitedQRCodeParam.getEnvVersion());
|
||||
params.put("width", unlimitedQRCodeParam.getWidth());
|
||||
params.put("auto_color",unlimitedQRCodeParam.getAutoColor());
|
||||
params.put("is_hyaline",unlimitedQRCodeParam.getIsHyaline());
|
||||
params.put("auto_color", unlimitedQRCodeParam.getAutoColor());
|
||||
params.put("is_hyaline", unlimitedQRCodeParam.getIsHyaline());
|
||||
String paramsString = JSON.toJSONString(params);
|
||||
|
||||
OkHttpClient okHttpClient = new OkHttpClient();
|
||||
@ -108,11 +108,40 @@ public class WeChatTokenServiceImpl implements WeChatTokenService {
|
||||
.post(RequestBody.create(paramsString, MediaType.parse("application/json; charset=utf-8")))
|
||||
.build();
|
||||
Response response = okHttpClient.newCall(request).execute();
|
||||
// String result = response.body()response.body().string();
|
||||
// String result = response.body().string();
|
||||
|
||||
// System.out.println("headers: " + response.headers());
|
||||
// System.out.println("body: " + response.body());
|
||||
System.out.println("paramsString: " + paramsString);
|
||||
return response.body();
|
||||
}
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
public String getOpenIdFromApi(String code) {
|
||||
// refer:
|
||||
// https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
|
||||
// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
|
||||
String url = String.format("https://api.weixin.qq.com/sns/jscode2session?" +
|
||||
"appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", APPID, APPSECRET, code);
|
||||
|
||||
OkHttpClient okHttpClient = new OkHttpClient();
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.get()
|
||||
.build();
|
||||
Response response = okHttpClient.newCall(request).execute();
|
||||
ResponseBody body = response.body();
|
||||
if (body != null) {
|
||||
String jsonString = body.string();
|
||||
// {"session_key":"7DnwgV6kUALcO+j65k5Gcw==","openid":"oFzuC4pvbPzY7vI6vmP6_57iTk-U","unionid":"oZxJH1kLie37EpC4FzslnCcWDEA4"}
|
||||
|
||||
JSONObject result = JSONObject.parseObject(jsonString);
|
||||
String openId = result.getString("openid");
|
||||
System.out.println("body: " + body + ", result: " + result);
|
||||
return openId;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -82,6 +82,16 @@
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- OpenFeign -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-openfeign</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 分页 -->
|
||||
<dependency>
|
||||
<groupId>com.github.pagehelper</groupId>
|
||||
|
@ -3,11 +3,13 @@ package com.cxyxiaomo.epp.user;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
|
||||
// 启动类
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableDiscoveryClient
|
||||
@EnableFeignClients
|
||||
public class UserProvider {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(UserProvider.class, args);
|
||||
|
@ -15,6 +15,7 @@ import com.cxyxiaomo.epp.common.pojo.Role;
|
||||
import com.cxyxiaomo.epp.common.pojo.User;
|
||||
import com.cxyxiaomo.epp.common.response.Res;
|
||||
import com.cxyxiaomo.epp.common.vo.UserVO;
|
||||
import com.cxyxiaomo.epp.user.rpc.WeChatTokenServiceFeign;
|
||||
import com.cxyxiaomo.epp.user.service.RoleService;
|
||||
import com.cxyxiaomo.epp.user.service.UserService;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
@ -25,10 +26,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/user")
|
||||
@ -40,6 +38,9 @@ public class UserController {
|
||||
@Resource
|
||||
private RoleService roleService;
|
||||
|
||||
@Resource
|
||||
private WeChatTokenServiceFeign weChatTokenService;
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
*
|
||||
@ -50,6 +51,12 @@ public class UserController {
|
||||
@PostMapping("/login")
|
||||
@ResponseBody
|
||||
public Res login(@RequestParam("username") String username, @RequestParam("password") String password) {
|
||||
// 微信小程序 随便看看
|
||||
if (Objects.equals(username, "#fastLogin#") && Objects.equals(password, "#fastLogin#")) {
|
||||
username = "user";
|
||||
password = "user";
|
||||
}
|
||||
|
||||
User user = userService.getUserByUsername(username);
|
||||
if (user != null) {
|
||||
String passwordHash = DigestUtils.sha512Hex(password);
|
||||
@ -65,6 +72,49 @@ public class UserController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信小程序用户登录
|
||||
*
|
||||
* @param code
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/wxlogin")
|
||||
@ResponseBody
|
||||
public Res wxlogin(@RequestParam("code") String code) {
|
||||
// 微信小程序 登录页面 随便看看
|
||||
if (Objects.isNull(code)) {
|
||||
return Res.error("参数错误");
|
||||
}
|
||||
|
||||
String jsonString = weChatTokenService.getOpenIdFromApi(code);
|
||||
JSONObject jsonObject = JSONObject.parseObject(jsonString);
|
||||
String openId = jsonObject.getString("data");
|
||||
if (Objects.isNull(openId) || "".equals(openId)) {
|
||||
return Res.error("微信接口异常,请重试");
|
||||
}
|
||||
|
||||
User user = userService.getUserByWxcode(openId);
|
||||
if (user == null) {
|
||||
// 创建一个新用户
|
||||
user = new User();
|
||||
user.setId(null);
|
||||
user.setUsername(UUID.randomUUID().toString().replace("-", "").substring(0, 10));
|
||||
user.setPassword(UUID.randomUUID().toString());
|
||||
user.setRealname("微信用户" + user.getUsername().substring(0, 5));
|
||||
user.setRoleId(3);
|
||||
user.setPermission("1");
|
||||
user.setWxcode(openId);
|
||||
userService.addUser(user);
|
||||
// 添加之后 user.getId() 可以获取到用户id
|
||||
// System.out.println("userId: " + user.getId());
|
||||
}
|
||||
|
||||
// 完成登录
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("userInfo", UserVO.convertFrom(user));
|
||||
return Res.success(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过用户ID获取用户信息
|
||||
*
|
||||
|
@ -19,6 +19,8 @@ public interface UserDao {
|
||||
|
||||
User getUserByUsername(String username);
|
||||
|
||||
User getUserByWxcode(String wxcode);
|
||||
|
||||
public List<User> getUserList(UserVO userVO);
|
||||
|
||||
public boolean deleteUserById(Integer userId);
|
||||
|
@ -0,0 +1,16 @@
|
||||
package com.cxyxiaomo.epp.user.rpc;
|
||||
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
@FeignClient("microservice-provider-access")
|
||||
public interface WeChatTokenServiceFeign {
|
||||
/**
|
||||
* 返回值、参数要对应,方法名随意
|
||||
* 在 OpenFeign 中方法参数前如果没有注解,默认添加 @RequestBody 注解,最多只能存在一个不带注解的参数
|
||||
* 普通表单参数必须添加 @Requestparam 注解。如果变量名和参数名称对应可以不写name
|
||||
*/
|
||||
@GetMapping("/access/wechat/rpc/getOpenIdFromApi")
|
||||
String getOpenIdFromApi(@RequestParam("code") String code);
|
||||
}
|
@ -18,6 +18,10 @@ public class UserService {
|
||||
return userDao.getUserByUsername(username);
|
||||
}
|
||||
|
||||
public User getUserByWxcode(String wxcode) {
|
||||
return userDao.getUserByWxcode(wxcode);
|
||||
}
|
||||
|
||||
public User getUserById(Integer id) {
|
||||
return userDao.getUserById(id);
|
||||
}
|
||||
|
@ -3,11 +3,11 @@
|
||||
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.cxyxiaomo.epp.user.dao.UserDao">
|
||||
<insert id="addUser" parameterType="com.cxyxiaomo.epp.common.pojo.User">
|
||||
<insert id="addUser" parameterType="com.cxyxiaomo.epp.common.pojo.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
||||
INSERT INTO user (username, `password`, realname, id_number, phone_number, role_id, building_id, doorplate,
|
||||
permission, permission_time)
|
||||
permission, permission_time, wx_code)
|
||||
VALUES (#{username}, #{password}, #{realname}, #{idNumber}, #{phoneNumber}, #{roleId}, #{buildingId},
|
||||
#{doorplate}, #{permission}, #{permissionTime})
|
||||
#{doorplate}, #{permission}, #{permissionTime}, #{wxcode})
|
||||
</insert>
|
||||
<update id="updateUser" parameterType="com.cxyxiaomo.epp.common.pojo.User">
|
||||
UPDATE user
|
||||
@ -42,6 +42,9 @@
|
||||
<if test="permissionTime != null">
|
||||
permission_time = #{permissionTime},
|
||||
</if>
|
||||
<if test="wxcode != null and wxcode != ''">
|
||||
wx_code = #{doorplate},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
@ -55,6 +58,11 @@
|
||||
from user
|
||||
where username = #{username}
|
||||
</select>
|
||||
<select id="getUserByWxcode" resultType="com.cxyxiaomo.epp.common.pojo.User">
|
||||
select *
|
||||
from user
|
||||
where wx_code = #{wxcode}
|
||||
</select>
|
||||
<select id="getUserList" resultType="com.cxyxiaomo.epp.common.pojo.User">
|
||||
select *
|
||||
from user
|
||||
|
1001
database/epp.sql
1001
database/epp.sql
File diff suppressed because it is too large
Load Diff
@ -460,12 +460,40 @@
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "[线上] 小程序端 获取大门详情",
|
||||
"name": "[微服务] 小程序端 获取大门详情",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [],
|
||||
"url": {
|
||||
"raw": "https://epp.only4.work/guard-client/getGateList",
|
||||
"raw": "http://localhost:8002/access/gate/miniprogram/detail?id=261758638368624873480",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8002",
|
||||
"path": [
|
||||
"access",
|
||||
"gate",
|
||||
"miniprogram",
|
||||
"detail"
|
||||
],
|
||||
"query": [
|
||||
{
|
||||
"key": "id",
|
||||
"value": "261758638368624873480"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "[线上] 小程序端 获取大门详情 Copy",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [],
|
||||
"url": {
|
||||
"raw": "https://epp.only4.work/access/gate/miniprogram/detail?id=261758638368624873480",
|
||||
"protocol": "https",
|
||||
"host": [
|
||||
"epp",
|
||||
@ -473,8 +501,44 @@
|
||||
"work"
|
||||
],
|
||||
"path": [
|
||||
"guard-client",
|
||||
"getGateList"
|
||||
"access",
|
||||
"gate",
|
||||
"miniprogram",
|
||||
"detail"
|
||||
],
|
||||
"query": [
|
||||
{
|
||||
"key": "id",
|
||||
"value": "261758638368624873480"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "[微服务RPC] 微信小程序登录获取openId",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [],
|
||||
"url": {
|
||||
"raw": "http://localhost:8002/access/wechat/rpc/getOpenIdFromApi?code=0f1meZZv3MRot03quH3w3Xnp744meZZu",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8002",
|
||||
"path": [
|
||||
"access",
|
||||
"wechat",
|
||||
"rpc",
|
||||
"getOpenIdFromApi"
|
||||
],
|
||||
"query": [
|
||||
{
|
||||
"key": "code",
|
||||
"value": "0f1meZZv3MRot03quH3w3Xnp744meZZu"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -1,20 +1,27 @@
|
||||
// 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
|
||||
}
|
||||
})
|
||||
const toggleCustomTabBar = require('./custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
App({
|
||||
async onLaunch() {
|
||||
|
||||
// 获取下拉框信息
|
||||
toggleCustomTabBar.updateConfig(this.globalData.baseUrl)
|
||||
|
||||
// // 展示本地存储能力
|
||||
// const logs = wx.getStorageSync('logs') || []
|
||||
// logs.unshift(Date.now())
|
||||
// wx.setStorageSync('logs', logs)
|
||||
|
||||
// // 登录
|
||||
// wx.login({
|
||||
// success: res => {
|
||||
// // 发送 res.code 到后台换取 openId, sessionKey, unionId
|
||||
// }
|
||||
// })
|
||||
},
|
||||
globalData: {
|
||||
debugMode: true, // 是否展示调试内容
|
||||
// debugMode: true, // 是否展示调试内容
|
||||
baseUrl: true ? // Api 请求域名 不带最后的 /
|
||||
"https://epp.only4.work" :
|
||||
"http://localhost",
|
||||
|
@ -19,10 +19,11 @@
|
||||
"navigationBarTextStyle": "white"
|
||||
},
|
||||
"tabBar": {
|
||||
"custom": false,
|
||||
"color": "#000000",
|
||||
"backgroundColor": "#fff",
|
||||
"selectedColor": "#FF8966",
|
||||
"custom": true,
|
||||
"————custom": false,
|
||||
"————color": "#000000",
|
||||
"————backgroundColor": "#fff",
|
||||
"————selectedColor": "#FF8966",
|
||||
"list": [
|
||||
{
|
||||
"pagePath": "pages/index/index",
|
||||
|
55
weixin-miniprogram/custom-tab-bar/index.js
Normal file
55
weixin-miniprogram/custom-tab-bar/index.js
Normal file
@ -0,0 +1,55 @@
|
||||
Component({
|
||||
data: {
|
||||
selected: 0,
|
||||
color: "#000000",
|
||||
selectedColor: "#FF8966",
|
||||
list: null, // 在 toggleCustomTabBar.js 中动态设置下面的菜单项
|
||||
rawList: [
|
||||
{
|
||||
"pagePath": "pages/index/index",
|
||||
"text": "首页",
|
||||
"iconPath": "image/icon/_home.png",
|
||||
"selectedIconPath": "image/icon/home.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/residents/code",
|
||||
"text": "进出码",
|
||||
"iconPath": "image/icon/_code.png",
|
||||
"selectedIconPath": "image/icon/code.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/residents/report",
|
||||
"text": "体温上报",
|
||||
"iconPath": "image/icon/_report.png",
|
||||
"selectedIconPath": "image/icon/report.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/shop/shop",
|
||||
"text": "生活物资",
|
||||
"iconPath": "image/icon/_shopping.png",
|
||||
"selectedIconPath": "image/icon/shopping.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/person/person",
|
||||
"text": "我",
|
||||
"iconPath": "image/icon/_person.png",
|
||||
"selectedIconPath": "image/icon/person.png"
|
||||
}
|
||||
]
|
||||
},
|
||||
onShow() {
|
||||
console.log("[CustomTabBar] onLoad")
|
||||
},
|
||||
attached() {
|
||||
},
|
||||
methods: {
|
||||
switchTab(e) {
|
||||
const data = e.currentTarget.dataset
|
||||
const url = '/' + data.path
|
||||
wx.switchTab({ url })
|
||||
this.setData({
|
||||
selected: data.index
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
4
weixin-miniprogram/custom-tab-bar/index.json
Normal file
4
weixin-miniprogram/custom-tab-bar/index.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
8
weixin-miniprogram/custom-tab-bar/index.wxml
Normal file
8
weixin-miniprogram/custom-tab-bar/index.wxml
Normal file
@ -0,0 +1,8 @@
|
||||
<!--miniprogram/custom-tab-bar/index.wxml-->
|
||||
<cover-view class="tab-bar">
|
||||
<cover-view class="tab-bar-border"></cover-view>
|
||||
<cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab">
|
||||
<cover-image src="../{{selected === index ? item.selectedIconPath : item.iconPath}}"></cover-image>
|
||||
<cover-view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</cover-view>
|
||||
</cover-view>
|
||||
</cover-view>
|
38
weixin-miniprogram/custom-tab-bar/index.wxss
Normal file
38
weixin-miniprogram/custom-tab-bar/index.wxss
Normal file
@ -0,0 +1,38 @@
|
||||
.tab-bar {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 48px;
|
||||
background: white;
|
||||
display: flex;
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
}
|
||||
|
||||
.tab-bar-border {
|
||||
background-color: rgba(0, 0, 0, 0.33);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
transform: scaleY(0.5);
|
||||
}
|
||||
|
||||
.tab-bar-item {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.tab-bar-item cover-image {
|
||||
width: 27px;
|
||||
height: 27px;
|
||||
}
|
||||
|
||||
.tab-bar-item cover-view {
|
||||
font-size: 10px;
|
||||
}
|
97
weixin-miniprogram/custom-tab-bar/toggleCustomTabBar.js
Normal file
97
weixin-miniprogram/custom-tab-bar/toggleCustomTabBar.js
Normal file
@ -0,0 +1,97 @@
|
||||
var defaultTabbarItem = [
|
||||
"pages/person/person",
|
||||
"pages/residents/report",
|
||||
"pages/index/index"
|
||||
]
|
||||
|
||||
export function toggle(that) {
|
||||
let pages = getCurrentPages()
|
||||
let route = pages[pages.length - 1].route
|
||||
console.log("[CustomTabBar] route", route)
|
||||
|
||||
if (!typeof that.getTabBar === 'function' || !that.getTabBar()) {
|
||||
// wx.showModal({
|
||||
// title: '版本太旧',
|
||||
// content: '您的微信版本太旧,无法使用本小程序',
|
||||
// showCancel: false,
|
||||
// complete: (res) => {
|
||||
// wx.exitMiniProgram()
|
||||
// }
|
||||
// })
|
||||
return
|
||||
}
|
||||
|
||||
// 找出要选择哪一项
|
||||
let tabBar = that.getTabBar()
|
||||
console.log("[CustomTabBar] tabBar", tabBar)
|
||||
|
||||
let data = tabBar.data
|
||||
console.log("[CustomTabBar] data", data)
|
||||
|
||||
let showPagePathList = wx.getStorageSync('tabbarItem') || defaultTabbarItem
|
||||
console.log("[CustomTabBar] showPagePathList", showPagePathList)
|
||||
|
||||
let list = tabBar.data.rawList.filter((page) => showPagePathList.includes(page.pagePath))
|
||||
console.log("[CustomTabBar] tabBarList", list)
|
||||
|
||||
let selected = list ? list.indexOf(list.find(p => p.pagePath == route)) : -1
|
||||
console.log("[CustomTabBar] selected", selected)
|
||||
|
||||
console.log("更新tabbar")
|
||||
|
||||
// 选中这一项
|
||||
tabBar.setData({
|
||||
selected: selected,
|
||||
list: list
|
||||
})
|
||||
}
|
||||
|
||||
export function updateConfig(baseUrl) {
|
||||
// 请求配置文件(用于审核时隐藏部分功能)
|
||||
wx.request({
|
||||
url: baseUrl + '/getConfig',
|
||||
success(result) {
|
||||
let data = result.data
|
||||
if (data.tabbarItem) {
|
||||
console.log("[CustomTabBar] tabbar数据拉取完毕")
|
||||
wx.setStorageSync('tabbarItem', data.tabbarItem)
|
||||
wx.setStorageSync('indexItem', data.indexItem)
|
||||
|
||||
const pages = getCurrentPages();
|
||||
const indexPage = pages[0]
|
||||
const currentPage = pages[pages.length - 1]
|
||||
console.log("[CustomTabBar] indexPage", indexPage)
|
||||
console.log("[CustomTabBar] currentPage", currentPage)
|
||||
|
||||
// // 更新tabbar
|
||||
// toggle(currentPage)
|
||||
// 刷新首页中包含了触发 toggle 的代码 此处不重复触发
|
||||
|
||||
// 刷新首页
|
||||
indexPage && indexPage.onLoad()
|
||||
|
||||
// let tabBar = currentPage.getTabBar()
|
||||
// tabBar.setData({
|
||||
// list: tabBar.data.rawList.filter((page) => itemList.includes(page.pagePath))
|
||||
// })
|
||||
}
|
||||
},
|
||||
fail() {
|
||||
wx.showModal({
|
||||
title: '小程序启动失败',
|
||||
content: '点击确认重试,若多次失败请检查网络连接',
|
||||
complete: (res) => {
|
||||
if (res.cancel) {
|
||||
wx.exitMiniProgram()
|
||||
}
|
||||
|
||||
if (res.confirm) {
|
||||
wx.reLaunch({
|
||||
url: 'pages/index/index',
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
// pages/index/index.js
|
||||
const menuItemDict = require('../../utils/menuList.js')
|
||||
const getUserGroupByRole = require('../../utils/getUserGroupByRole.js')
|
||||
const toggleCustomTabBar = require('../../custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
import scanQRCode from '../../utils/scanQRCode'
|
||||
|
||||
@ -22,6 +23,7 @@ Page({
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
console.log("index/index onLoad", options)
|
||||
// console.log("wx.getLaunchOptionsSync()", wx.getLaunchOptionsSync())
|
||||
|
||||
@ -39,7 +41,7 @@ Page({
|
||||
debugText: JSON.stringify(options, null, 4),
|
||||
userInfo: userInfo,
|
||||
userGroup: userGroup,
|
||||
displayUsername: userInfo?.username ?? "请登录",
|
||||
displayUsername: userInfo ? (`${userInfo.realname} (${userInfo.username})`) : "请登录",
|
||||
filterMenuItems: this.getFilterMenuItems(menuItemDict, userGroup)
|
||||
})
|
||||
console.log("menuItemDict", menuItemDict)
|
||||
@ -82,6 +84,7 @@ Page({
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow() {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
console.log("index/index onShow")
|
||||
},
|
||||
|
||||
@ -122,8 +125,21 @@ Page({
|
||||
|
||||
|
||||
getFilterMenuItems(menuItemDict, userGroup) {
|
||||
return Object.values(menuItemDict)
|
||||
let filterMenuItems = Object.values(menuItemDict)
|
||||
.filter((item) => item.for.indexOf(userGroup) != -1)
|
||||
|
||||
// 动态控制显示隐藏
|
||||
let indexItem = wx.getStorageSync('indexItem') || [
|
||||
"/pages/index/login",
|
||||
"/pages/person/person"
|
||||
]
|
||||
filterMenuItems = filterMenuItems
|
||||
.filter((item) => {
|
||||
let a = indexItem.includes(item.url)
|
||||
console.log("filterMenuItems -> filter", item.url, indexItem)
|
||||
return a
|
||||
})
|
||||
return filterMenuItems
|
||||
},
|
||||
|
||||
|
||||
|
@ -15,11 +15,11 @@ Page({
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
if (app.globalData.debugMode) {
|
||||
this.setData({
|
||||
debugMode: true,
|
||||
})
|
||||
}
|
||||
// if (app.globalData.debugMode) {
|
||||
// this.setData({
|
||||
// debugMode: true,
|
||||
// })
|
||||
// }
|
||||
},
|
||||
|
||||
/**
|
||||
@ -81,12 +81,54 @@ Page({
|
||||
|
||||
fastLogin() {
|
||||
this.setData({
|
||||
username: "user",
|
||||
password: "user",
|
||||
username: "#fastLogin#",
|
||||
password: "#fastLogin#",
|
||||
})
|
||||
this.login()
|
||||
},
|
||||
|
||||
wxLogin() {
|
||||
var that = this
|
||||
wx.login({
|
||||
success(res) {
|
||||
if (res.code) {
|
||||
wx.showLoading({
|
||||
title: '加载中'
|
||||
})
|
||||
wx.request({
|
||||
url: app.globalData.baseUrl + '/user/wxlogin',
|
||||
method: "POST",
|
||||
header: {
|
||||
"Content-Type": "application/x-www-form-urlencoded" //用于post
|
||||
},
|
||||
data: {
|
||||
code: res.code
|
||||
},
|
||||
success: function (d) {
|
||||
wx.hideLoading()
|
||||
that._loginSuccessCallback(d)
|
||||
},
|
||||
fail: function () {
|
||||
wx.hideLoading()
|
||||
wx.showToast({
|
||||
title: "请求失败",
|
||||
icon: 'error',
|
||||
duration: 2000
|
||||
})
|
||||
}
|
||||
})
|
||||
} else {
|
||||
console.log('登录失败!' + res.errMsg)
|
||||
wx.showModal({
|
||||
title: '登录失败',
|
||||
content: '您点击了取消按钮' + res.errMsg,
|
||||
showCancel: false
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
login() {
|
||||
console.log("login userInput", this.data.username, this.data.password)
|
||||
if (!this.data.username || !this.data.password) {
|
||||
@ -96,6 +138,7 @@ Page({
|
||||
duration: 2000
|
||||
})
|
||||
} else {
|
||||
var that = this
|
||||
wx.showLoading({
|
||||
title: '加载中'
|
||||
})
|
||||
@ -111,32 +154,7 @@ Page({
|
||||
},
|
||||
success: function (d) {
|
||||
wx.hideLoading()
|
||||
let result = d.data;
|
||||
if (result.success) {
|
||||
// 登录成功
|
||||
if (![3, 4, 5, 6].includes(result.data.userInfo.roleId)) {
|
||||
wx.showModal({
|
||||
title: '你不是社区居民',
|
||||
content: '管理员请前往网页版登录',
|
||||
showCancel: false,
|
||||
complete: (res) => {
|
||||
//
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
wx.setStorageSync("userInfo", result.data.userInfo);
|
||||
console.log("userInfo", wx.getStorageSync("userInfo"))
|
||||
wx.switchTab({
|
||||
url: '/pages/index/index'
|
||||
})
|
||||
} else {
|
||||
wx.showToast({
|
||||
title: result.msg,
|
||||
icon: 'error',
|
||||
duration: 2000
|
||||
})
|
||||
}
|
||||
that._loginSuccessCallback(d)
|
||||
},
|
||||
fail: function () {
|
||||
wx.hideLoading()
|
||||
@ -148,5 +166,34 @@ Page({
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
_loginSuccessCallback(d) {
|
||||
let result = d.data;
|
||||
if (result.success) {
|
||||
// 登录成功
|
||||
if (![3, 4, 5, 6].includes(result.data.userInfo.roleId)) {
|
||||
wx.showModal({
|
||||
title: '你不是社区居民',
|
||||
content: '管理员请前往网页版登录',
|
||||
showCancel: false,
|
||||
complete: (res) => {
|
||||
//
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
wx.setStorageSync("userInfo", result.data.userInfo);
|
||||
console.log("userInfo", wx.getStorageSync("userInfo"))
|
||||
wx.switchTab({
|
||||
url: '/pages/index/index'
|
||||
})
|
||||
} else {
|
||||
wx.showToast({
|
||||
title: result.msg,
|
||||
icon: 'error',
|
||||
duration: 2000
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -12,9 +12,11 @@
|
||||
</view>
|
||||
<view class="loginBtnView">
|
||||
<!--按钮-->
|
||||
<button wx:if="{{debugMode}}" class="loginBtn" type="warn" bindtap="fastLogin">DEBUG快速登录user</button>
|
||||
<button class="loginBtn" type="primary" bindtap="login">登录</button>
|
||||
<button class="loginBtn" type="secondary" bindtap="visitor">访客申请</button>
|
||||
<!-- <button wx:if="{{debugMode}}" class="loginBtn" type="warn" bindtap="fastLogin">DEBUG快速登录user</button> -->
|
||||
<button class="loginBtn" type="primary" bindtap="login">密码登录</button>
|
||||
<!-- <button class="loginBtn" type="secondary" bindtap="visitor">访客申请</button> -->
|
||||
<button class="loginBtn" type="primary" bindtap="wxLogin">微信登录/注册</button>
|
||||
<button class="loginBtn" type="secondary" bindtap="fastLogin">随便看看</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
@ -1,5 +1,7 @@
|
||||
// pages/person/person.js
|
||||
|
||||
const toggleCustomTabBar = require('../../custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
const {
|
||||
user
|
||||
} = require("../../utils/const")
|
||||
@ -16,7 +18,8 @@ Page({
|
||||
avatarUrl: defaultAvatarUrl,
|
||||
nickName: "请登录",
|
||||
displayUserId: "",
|
||||
menuList: [
|
||||
menuList: [],
|
||||
menuListRaw: [
|
||||
{
|
||||
id: "myOrder",
|
||||
title: "我的订单",
|
||||
@ -26,14 +29,14 @@ Page({
|
||||
color: 'red',
|
||||
title: "退出登录",
|
||||
}
|
||||
]
|
||||
],
|
||||
},
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
|
||||
toggleCustomTabBar.toggle(this)
|
||||
},
|
||||
|
||||
/**
|
||||
@ -47,6 +50,20 @@ Page({
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow() {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
|
||||
// 是否隐藏 我的订单
|
||||
let arr = wx.getStorageSync("indexItem")
|
||||
if (!arr || !arr.includes("/pages/shop/shop")) {
|
||||
this.setData({
|
||||
menuList: this.data.menuListRaw.filter(i => i.id != 'myOrder')
|
||||
})
|
||||
} else {
|
||||
this.setData({
|
||||
menuList: this.data.menuListRaw
|
||||
})
|
||||
}
|
||||
|
||||
let userInfo = wx.getStorageSync("userInfo")
|
||||
if (!userInfo) {
|
||||
console.log("用户未登录")
|
||||
@ -109,7 +126,6 @@ Page({
|
||||
console.log("e", userInfo)
|
||||
this.setData({
|
||||
avatarUrl: userInfo.avatarUrl,
|
||||
|
||||
})
|
||||
},
|
||||
|
||||
|
@ -4,6 +4,7 @@ import utils from '../../utils/util'
|
||||
// import drawQrcode from '../../utils/qrcode/index'
|
||||
import drawQrcode from '../../utils/lib/weapp.qrcode.esm.js'
|
||||
import scanQRCode from '../../utils/scanQRCode'
|
||||
const toggleCustomTabBar = require('../../custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
const app = getApp();
|
||||
|
||||
@ -25,7 +26,7 @@ Page({
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
|
||||
toggleCustomTabBar.toggle(this)
|
||||
},
|
||||
|
||||
/**
|
||||
@ -39,6 +40,7 @@ Page({
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow() {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
console.log('onShow')
|
||||
// setTimeout(this.refershData, 100)
|
||||
this.refershData()
|
||||
|
@ -1,6 +1,8 @@
|
||||
// pages/residents/report.js
|
||||
import utils from '../../utils/util'
|
||||
|
||||
const toggleCustomTabBar = require('../../custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
const app = getApp();
|
||||
|
||||
Page({
|
||||
@ -32,6 +34,7 @@ Page({
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
console.log("residents/report onLoad")
|
||||
},
|
||||
|
||||
@ -46,6 +49,7 @@ Page({
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow() {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
console.log("residents/report onShow")
|
||||
if (this.data.isSkipOnShowFunc) {
|
||||
this.setData({
|
||||
|
@ -1,5 +1,7 @@
|
||||
// pages/shop/shop.js
|
||||
|
||||
const toggleCustomTabBar = require('../../custom-tab-bar/toggleCustomTabBar')
|
||||
|
||||
const goodService = require("../../services/good")
|
||||
|
||||
Page({
|
||||
@ -62,6 +64,7 @@ Page({
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad(options) {
|
||||
toggleCustomTabBar.toggle(this)
|
||||
this.loadPageData();
|
||||
},
|
||||
|
||||
@ -76,7 +79,7 @@ Page({
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow() {
|
||||
|
||||
toggleCustomTabBar.toggle(this)
|
||||
},
|
||||
|
||||
/**
|
||||
@ -193,7 +196,7 @@ Page({
|
||||
})
|
||||
})();
|
||||
|
||||
|
||||
|
||||
(async () => {
|
||||
let goodCategoryListPromise = goodService.getGoodCategoryList()
|
||||
Promise.all([
|
||||
|
@ -39,55 +39,55 @@ let menuItemDict = {
|
||||
switchFunc: switchTab,
|
||||
url: '/pages/shop/shop'
|
||||
},
|
||||
'apply-record': {
|
||||
for: ['visitor'],
|
||||
title: "申请记录",
|
||||
image: "apply.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'apply-approval': {
|
||||
for: ['admin'],
|
||||
title: "申请审批",
|
||||
image: "apply.png", // ApplyReplay
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'visitor-apply': {
|
||||
for: ['admin'],
|
||||
title: "访客审批",
|
||||
image: "visitor.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'abnormal': {
|
||||
for: ['admin'],
|
||||
title: "异常人员",
|
||||
image: "danger.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'feedback-submit': {
|
||||
for: ['visitor'],
|
||||
title: "提交反馈",
|
||||
image: "fk.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'feedback-list': {
|
||||
for: ['visitor'],
|
||||
title: "反馈查看",
|
||||
image: "feedback.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'feedback-reply': {
|
||||
for: ['admin'],
|
||||
title: "反馈回复",
|
||||
image: "feedback.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
// 'apply-record': {
|
||||
// for: ['visitor'],
|
||||
// title: "申请记录",
|
||||
// image: "apply.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'apply-approval': {
|
||||
// for: ['admin'],
|
||||
// title: "申请审批",
|
||||
// image: "apply.png", // ApplyReplay
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'visitor-apply': {
|
||||
// for: ['admin'],
|
||||
// title: "访客审批",
|
||||
// image: "visitor.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'abnormal': {
|
||||
// for: ['admin'],
|
||||
// title: "异常人员",
|
||||
// image: "danger.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'feedback-submit': {
|
||||
// for: ['visitor'],
|
||||
// title: "提交反馈",
|
||||
// image: "fk.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'feedback-list': {
|
||||
// for: ['visitor'],
|
||||
// title: "反馈查看",
|
||||
// image: "feedback.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'feedback-reply': {
|
||||
// for: ['admin'],
|
||||
// title: "反馈回复",
|
||||
// image: "feedback.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
'person': {
|
||||
for: ['admin', 'user'],
|
||||
title: "个人中心",
|
||||
@ -100,22 +100,22 @@ let menuItemDict = {
|
||||
title: "密码修改",
|
||||
image: "updPwd.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
url: '/pages/person/updpwd'
|
||||
},
|
||||
'assign': {
|
||||
for: ['admin'],
|
||||
title: "分配账号",
|
||||
image: "count.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
},
|
||||
'unfinish': {
|
||||
for: ['admin'],
|
||||
title: "今日未填", // RedList
|
||||
image: "_report.png",
|
||||
switchFunc: switchTab,
|
||||
url: ''
|
||||
}
|
||||
// 'assign': {
|
||||
// for: ['admin'],
|
||||
// title: "分配账号",
|
||||
// image: "count.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// },
|
||||
// 'unfinish': {
|
||||
// for: ['admin'],
|
||||
// title: "今日未填", // RedList
|
||||
// image: "_report.png",
|
||||
// switchFunc: switchTab,
|
||||
// url: ''
|
||||
// }
|
||||
}
|
||||
let keys = Object.keys(menuItemDict);
|
||||
for (let key of keys) {
|
||||
|
Loading…
Reference in New Issue
Block a user