Db::name($this->table)->alias($alias)
->where($condition)
->where(function ($query) use ($condition_or) {
$query->whereOr($condition_or);
})
->order($order);
遇到whereOr和where组合链式操作会把or条件和and条件并列处理
使用闭包放在where里就可以加上类似 and ( xxx or xxx)的条件了
去芜存菁
Db::name($this->table)->alias($alias)
->where($condition)
->where(function ($query) use ($condition_or) {
$query->whereOr($condition_or);
})
->order($order);
遇到whereOr和where组合链式操作会把or条件和and条件并列处理
使用闭包放在where里就可以加上类似 and ( xxx or xxx)的条件了
<span class="form-control-unit">万元</span>
.form-control-unit {
position: absolute;
top: 0;
right: 0;
z-index: 2;
display: block;
width: 34px;
height: 34px;
line-height: 34px;
text-align: center;
pointer-events: none;
}
首先 在父页面创建一个div id = detail_page_data, 在ifram1 调用parent.layer_open的时候保存 ifram1的index
然后在ifram2里可以获取ifram1的index从而通过parent 拿到ifram1的contentWindow.document
然后就可以操作ifram1里的信息了
var relation_layer_index = parent.$('#detail_page_data').data('relation_layer_index'); var relation_ifram = parent.$('#layui-layer-iframe'+relation_layer_index); $doc = relation_ifram[0].contentWindow.document; $($doc).find("#bargain_uid").val()
该篇主要描写权限部分的配置
1.对用权限相关表创建model:admin/model
->Group
->AuthRule
2.为多站点做准备 创建site表
创建model: app/common/model/
->Site.php
3.将之前创建的app/model.php 移到app/common/model/下
修改common.php model方法使用的路径
function model($table = '') { return new \app\common\model\Model($table); }
4.将之前创建的app/admin/model/BaseModel 移到app/common/model/下
修改之前extend baseModel的model里引用路径
5.baseController添加
protected function assign($name, $value = '') { View::assign($name, $value); return $this; }
一番设置 后台首页就展示出来了
6.app\request下添加function
/** * 当前访问模块 * @param string $module */ public function module($module = '') { return App('http')->getName(); } /** * 解析url */ public function parseUrl() { // $addon = $this->addon() ? $this->addon() . '://' : ''; $addon = ''; $result = $addon.$this->module().'/'.$this->controller().'/'.$this->action(); return strtolower($result); }
7.系统基础设置页面
8.权限管理页面
//切换composer 为国内 阿里源 composer config -g repo.packagist composer //创建项目tp_base composer create-project topthink/think tp_base
解析测试域名到项目
//tp多应用安装 composer require topthink/think-multi-app //tp模板引擎 composer require topthink/think-template composer require topthink/think-view //tp验证码 composer require topthink/think-captcha //tp翻页 composer require big-dream/think-paginator-driver //tp whoops composer require xiaodi/think-whoops //tp log composer require topthink/think-log //tp 权限 composer require liliuwei/thinkphp-auth=2.0.* //图片管理 composer require intervention/image
1.使用多应用模式
//创建多应用 php think build index php think build admin php think build common
2.配置权限管理
配置权限管理前需要先把mysql的连接参数配置好
copy .example.env 到 .env 然后配置mysql连接参数
修改config下auth.php
return[ // 权限设置 'auth_config' => [ 'auth_on' => true, // 认证开关 'auth_type' => 1, // 认证方式,1为实时认证;2为登录认证。 'auth_group' => 'auth_group', // 用户组数据表名 'auth_group_access' => 'auth_group_access', // 用户-用户组关系表 'auth_rule' => 'auth_rule', // 权限规则表 'auth_user' => 'admin' // 用户信息表 ], ];
运行数据库导入文件吗,导入权限相关表
在admin应用下创建lang 多语言目录
admin应用下创建event目录->initConfig.php 初始化常量以及基础配置
注册到event文件里
创建admin下BaseModel以及Admin model
BaseModel 定义getLang方法,获取语言包, success,err通用方法
model/Admin 创建admin表的模型 ,以及获取admin的方法
创建login的controller,view
copy 各种css,js
static 创建 app/admin目录 用来存放admin专用的一些css js文件
captcha需要打开gd2拓展
不输出验证码的话可以自己写一个验证码的function
//Captcha public function captcha() { ob_end_clean(); return Captcha::create(); }
app/common.php 配置公共function
app/model.php 配置通用model类
登录成功
创建admin/index 首页controller和view
这个时候就要开始权限管理的配置了
因为在admin/index就会有menu展示,需要涉及到权限的东西
const bMapTransQQMap = function(lng,lat){ let x_pi = 3.14159265358979324 * 3000.0 / 180.0; let x = lng - 0.0065; let y = lat - 0.006; let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); let lngs = z * Math.cos(theta); let lats = z * Math.sin(theta); return { lng: lngs+0.0005, lat: lats } } const qqMapTransBMap = function(lng,lat){ let x_pi = 3.14159265358979324 * 3000.0 / 180.0; let x = lng; let y = lat; let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); let lngs = z * Math.cos(theta) + 0.0065; let lats = z * Math.sin(theta) + 0.006; return { //经度 lng: lngs-0.0005, //纬度 lat: lats } } export default { bMapTransQQMap, qqMapTransBMap, }
参照这篇blog
https://www.cnblogs.com/sjj33sda/p/13984621.html
//a页面 uni.setStorageSync('test_key', 123); // b页面 // 在onshow 或者onload 中取值 uni.getStorageSync('test_key');
项目需求使用uniapp 在小程序和h5端使用地图并支持选点
遇到以下问题:
小程序内运行<iframe>会是空的
使用web-view 组件传入腾讯地图的src后也不行
没有办法只能去做适配 零散代码如下:
manifest.json
/* 小程序特有相关 */ "mp-weixin": { "appid": "U appid xxxxxxxxx", "setting": { "urlCheck": false, "es6": true }, "usingComponents": true, "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序定位" } }, "plugins": { "chooseLocation": { "version": "1.0.5", "provider": "wx76a9a06e5b4e693e" } } },
H5端选点后,获取到选点坐标内容 做相关处理
//url https://apis.map.qq.com/tools/locpicker?search=1&type=1&key=U3MBZ-VGILU-WIPVM-2UEDJ-HOZT6-XAF6G&referer=myapp <uni-popup ref="popup" type="bottom" class="buttom_popup"> <iframe :src=this.url id="mapPage" width="100%" height="500rpx" frameborder=0></iframe> </uni-popup> onLoad: function(e) { //#ifdef H5 window.addEventListener('message', function(event) { var loc = event.data; if (loc && loc.module == 'locationPicker') { that.changeLoc(loc); } }, false); //#endif },
小程序端引入组件,初始化
onShow: function(){ //#ifdef MP-WEIXIN const chooseLocation = requirePlugin('chooseLocation') const location = chooseLocation.getLocation() // 如果点击确认选点按钮,则返回选点结果对象,否则返回null console.log("您所选择的位置:", location) if(location){ //拿到选点后做相关逻辑处理 } //#endif },
//part view <input @click="open" disabled="true" name="coordinates" class="uni-input" placeholder="地图坐标" v-model="formData.coordinates"/> //part function open(){ //#ifdef H5 //如果是h5 通过popup层打开iframe窗口调用地图组件 this.$refs.popup.open() //#endif //#ifdef MP-WEIXIN //如果是小程序 调用function 跳转地图页面选点 选点后会回到本,在onShow里接收选点信息,再做相关逻辑处理 this.getAddress(); //#endif }, getAddress() { const key = 'U3MBZ-VGILU-WIPVM-2UEDJ-HOZT6-XAF6G' //使用在腾讯位置服务申请的key const referer = 'Leo' //调用插件的app的名称 //初始化选点坐标 const location = JSON.stringify({ latitude: xxxxxx, longitude: xxxxxxx }) wx.navigateTo({ url: 'plugin://chooseLocation/index?key=' + key + '&referer=' + referer + '&location=' + location }); },
对比一下在写housing的时候和customer优化过之后
Housing
Customer
明显不用eval的代码可读性和可维护性要高很多了
只需要在data里把数据结构先配置好
然后就可以用变量名拼接 像这样通过参数处理多重类型