| @ -0,0 +1,40 @@ | |||
| package org.jeecg.modules.api.teambuyController; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.modules.apiService.LoginApiService; | |||
| import org.jeecg.modules.bean.LoginReq; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.annotation.Resource; | |||
| @Api(tags="登录-登录相关接口") | |||
| @RestController | |||
| @RequestMapping("/teambuy/login") | |||
| @Slf4j | |||
| public class ApiLoginController { | |||
| /******************************************************************************************************************/ | |||
| //工作信息 | |||
| @Resource | |||
| private LoginApiService loginApiService; | |||
| /******************************************************************************************************************/ | |||
| //小程序-微信授权登录接口 | |||
| @ApiOperation(value="小程序-微信授权登录接口", notes="小程序-微信授权登录接口") | |||
| @GetMapping("/login") | |||
| public Result<?> login(LoginReq loginReq){ | |||
| return loginApiService.login(loginReq); | |||
| } | |||
| //绑定手机号码 | |||
| @ApiOperation(value="小程序-绑定手机号码", notes="小程序-绑定手机号码") | |||
| @GetMapping(value = "/bindPhone") | |||
| public Result<Object> bindPhone(String phoneCode){ | |||
| return loginApiService.bindPhone(phoneCode); | |||
| } | |||
| } | |||
| @ -0,0 +1,44 @@ | |||
| package org.jeecg.modules.api.teambuyController; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.modules.apiBean.PageBean; | |||
| import org.jeecg.modules.apiService.RecommendService; | |||
| import org.springframework.web.bind.annotation.RequestHeader; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.annotation.Resource; | |||
| @Api(tags="我的-邀请好友&我的团队相关接口") | |||
| @RestController | |||
| @RequestMapping("/teambuy/share") | |||
| @Slf4j | |||
| public class RecommendController { | |||
| /******************************************************************************************************************/ | |||
| //邀请好友 | |||
| @Resource | |||
| private RecommendService recommendService; | |||
| /******************************************************************************************************************/ | |||
| //邀请好友-获取推荐二维码 | |||
| @ApiOperation(value="我的-获取推荐二维码", notes="我的-获取推荐二维码") | |||
| @RequestMapping(value = "/getInviteCode", method = {RequestMethod.POST}) | |||
| public Result<?> getInviteCode(@RequestHeader("X-Access-Token") String token){ | |||
| return recommendService.getInviteCode(token); | |||
| } | |||
| //我的团队-查询直推用户列表 | |||
| @ApiOperation(value="我的团队-查询直推用户列表", notes="我的-获取直推用户列表") | |||
| @RequestMapping(value = "/queryRecommendUserList", method = {RequestMethod.POST}) | |||
| public Result<?> queryRecommendUserList(@RequestHeader("X-Access-Token") String token, PageBean pageBean){ | |||
| return recommendService.queryRecommendUserList(token, pageBean); | |||
| } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| package org.jeecg.modules.apiBean; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PageBean { | |||
| /**显示条数*/ | |||
| @ApiModelProperty(value = "显示条数" ) | |||
| private Integer pageSize; | |||
| /**当前页*/ | |||
| @ApiModelProperty(value = "当前页" ) | |||
| private Integer pageNo; | |||
| public PageBean() { | |||
| this.pageNo = 1; | |||
| this.pageSize = 1000; | |||
| } | |||
| } | |||
| @ -0,0 +1,14 @@ | |||
| package org.jeecg.modules.apiBean; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| @Data | |||
| public class WxQrCodeVo { | |||
| /**图片地址*/ | |||
| @ApiModelProperty(value = "图片地址") | |||
| private String url; | |||
| @ApiModelProperty(value = "名称") | |||
| private String name; | |||
| } | |||
| @ -0,0 +1,12 @@ | |||
| package org.jeecg.modules.apiService; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.modules.bean.LoginReq; | |||
| public interface LoginApiService { | |||
| //小程序-微信授权登录接口 | |||
| public Result<?> login(LoginReq loginReq); | |||
| //绑定手机号码 | |||
| public Result<Object> bindPhone(String phoneCode); | |||
| } | |||
| @ -0,0 +1,12 @@ | |||
| package org.jeecg.modules.apiService; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.modules.apiBean.PageBean; | |||
| public interface RecommendService { | |||
| //邀请好友-获取推荐二维码 | |||
| public Result<?> getInviteCode(String token); | |||
| //我的团队-查询直推用户列表 | |||
| public Result<?> queryRecommendUserList(String token, PageBean pageBean); | |||
| } | |||
| @ -0,0 +1,168 @@ | |||
| package org.jeecg.modules.apiService.impl; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.common.constant.CommonConstant; | |||
| import org.jeecg.common.exception.JeecgBootException; | |||
| import org.jeecg.common.system.util.JwtUtil; | |||
| import org.jeecg.common.util.RedisUtil; | |||
| import org.jeecg.modules.apiService.LoginApiService; | |||
| import org.jeecg.modules.bean.HttpConf; | |||
| import org.jeecg.modules.bean.LoginReq; | |||
| import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; | |||
| import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; | |||
| import org.springframework.stereotype.Service; | |||
| import javax.annotation.Resource; | |||
| import java.io.BufferedReader; | |||
| import java.io.DataOutputStream; | |||
| import java.io.InputStreamReader; | |||
| import java.net.HttpURLConnection; | |||
| import java.net.URL; | |||
| import java.nio.charset.StandardCharsets; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| @Service | |||
| public class LoginApiServiceImpl implements LoginApiService { | |||
| /******************************************************************************************************************/ | |||
| //微信小程序appid(敢为人鲜) | |||
| private static final String mpAppId = "wx94a640f07969d6c9"; | |||
| //微信小程序appSecret(敢为人鲜) | |||
| private static final String mpAppSecret = ""; | |||
| @Resource | |||
| private RedisUtil redisUtil; | |||
| @Resource | |||
| private IHanHaiMemberService hanHaiMemberService; | |||
| @Resource | |||
| private HttpConf httpConf; | |||
| /******************************************************************************************************************/ | |||
| @Override | |||
| public Result<?> login(LoginReq loginReq) { | |||
| Result<Object> result = new Result<>(); | |||
| Map<String, Object> map = new HashMap<>(); | |||
| if (StringUtils.isBlank(loginReq.getCode())) { | |||
| throw new JeecgBootException("小程序code为空"); | |||
| } | |||
| String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mpAppId + "&secret=" + mpAppSecret+ "&js_code=" + loginReq.getCode() + "&grant_type=authorization_code"; | |||
| //使用工具类 | |||
| JSONObject json_test = httpConf.getJSONObject(loginUrl); | |||
| String wxOpenid = json_test.getString("openid"); | |||
| String sessionKey = json_test.getString("session_key"); | |||
| if (StringUtils.isBlank(wxOpenid)) { | |||
| throw new JeecgBootException("未获取到openid"); | |||
| } | |||
| HanHaiMember member = hanHaiMemberService.lambdaQuery().eq(HanHaiMember::getAppletOpenid,wxOpenid).one(); | |||
| if (member == null) { | |||
| //如果user等于null说明该用户第一次登录,数据库没有该用户信息。 | |||
| loginReq.setOpenid(wxOpenid); | |||
| loginReq.setSession_key(sessionKey); | |||
| member = new HanHaiMember(); | |||
| // member.setSesssionKey(sessionKey); | |||
| member.setAppletOpenid(wxOpenid); | |||
| member.setNickName(loginReq.getNickName()); | |||
| member.setHeadImage(loginReq.getHeadimgurl()); | |||
| // 生成token返回给小程序端 | |||
| String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); | |||
| hanHaiMemberService.save(member); | |||
| redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); | |||
| // 设置超时时间 | |||
| redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); | |||
| map.put("userInfo", member); | |||
| map.put("token", token); | |||
| result.setCode(200); | |||
| result.setResult(map); | |||
| return result; | |||
| } else { | |||
| // member.setHeadImage(loginReq.getHeadimgurl()); | |||
| // member.setSessionKey(sessionKey); | |||
| // memberService.saveOrUpdate(member); | |||
| // 生成token返回给小程序端 | |||
| String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); | |||
| redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); | |||
| // 设置超时时间 | |||
| redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); | |||
| map.put("userInfo", member); | |||
| map.put("token", token); | |||
| //用户id做im账号 | |||
| result.setResult(map); | |||
| result.setCode(200); | |||
| // result.setMessage(member.getNickName()+"已于"+member.getCreateTime()+"注册成功!请勿重复注册!"); | |||
| // // 未绑定手机号,跳转授权绑定手机号 | |||
| // if (StringUtils.isBlank(member.getPhone())) { | |||
| // result.setMessage("该微信用户尚未绑定手机号,请授权手机进行绑定"); | |||
| // result.setCode(905); | |||
| // result.setResult(map); | |||
| // return result; | |||
| // } | |||
| } | |||
| return result; | |||
| } | |||
| @Override | |||
| public Result<Object> bindPhone(String phoneCode) { | |||
| try { | |||
| String phoneNumber = this.getPhoneNumber(phoneCode); | |||
| return Result.OK(phoneNumber); | |||
| }catch (Exception e){ | |||
| return Result.error(e.getMessage()); | |||
| } | |||
| } | |||
| private static final String API_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; | |||
| public String getPhoneNumber(String code) throws Exception { | |||
| URL url = new URL(API_URL + "?access_token=" + this.getAccessToken()); | |||
| HttpURLConnection conn = (HttpURLConnection) url.openConnection(); | |||
| conn.setRequestMethod("POST"); | |||
| conn.setRequestProperty("Content-Type", "application/json; utf-8"); | |||
| conn.setRequestProperty("Accept", "application/json"); | |||
| conn.setDoOutput(true); | |||
| JSONObject jsonInput = new JSONObject(); | |||
| jsonInput.put("code", code); | |||
| try (DataOutputStream os = new DataOutputStream(conn.getOutputStream())) { | |||
| byte[] input = jsonInput.toString().getBytes(StandardCharsets.UTF_8); | |||
| os.write(input, 0, input.length); | |||
| } | |||
| try (BufferedReader br = new BufferedReader( | |||
| new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { | |||
| StringBuilder response = new StringBuilder(); | |||
| String responseLine; | |||
| while ((responseLine = br.readLine()) != null) { | |||
| response.append(responseLine.trim()); | |||
| } | |||
| //获取手机号码 | |||
| return response.toString(); | |||
| } | |||
| } | |||
| private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; | |||
| public String getAccessToken() throws Exception { | |||
| String requestUrl = String.format(TOKEN_URL, mpAppId, mpAppSecret); | |||
| URL url = new URL(requestUrl); | |||
| HttpURLConnection conn = (HttpURLConnection) url.openConnection(); | |||
| conn.setRequestMethod("GET"); | |||
| try (BufferedReader br = new BufferedReader( | |||
| new InputStreamReader(conn.getInputStream(), "UTF-8"))) { | |||
| StringBuilder response = new StringBuilder(); | |||
| String responseLine; | |||
| while ((responseLine = br.readLine()) != null) { | |||
| response.append(responseLine.trim()); | |||
| } | |||
| org.json.JSONObject jsonResponse = new org.json.JSONObject(response.toString()); | |||
| return jsonResponse.getString("access_token"); | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,263 @@ | |||
| package org.jeecg.modules.apiService.impl; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.TypeReference; | |||
| import com.aliyun.oss.OSS; | |||
| import com.aliyun.oss.OSSClientBuilder; | |||
| import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| import org.apache.commons.fileupload.FileItem; | |||
| import org.apache.commons.fileupload.disk.DiskFileItemFactory; | |||
| import org.jeecg.common.api.vo.Result; | |||
| import org.jeecg.config.shiro.ShiroRealm; | |||
| import org.jeecg.modules.apiBean.HttpClientUtil; | |||
| import org.jeecg.modules.apiBean.PageBean; | |||
| import org.jeecg.modules.apiBean.WxQrCodeVo; | |||
| import org.jeecg.modules.apiService.RecommendService; | |||
| import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; | |||
| import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; | |||
| import org.jeecg.modules.teambuyConfig.entity.TeambuyConfig; | |||
| import org.jeecg.modules.teambuyConfig.service.ITeambuyConfigService; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.http.HttpMethod; | |||
| import org.springframework.http.ResponseEntity; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.util.LinkedMultiValueMap; | |||
| import org.springframework.util.MultiValueMap; | |||
| import org.springframework.web.client.RestTemplate; | |||
| import org.springframework.web.multipart.MultipartFile; | |||
| import org.springframework.web.multipart.commons.CommonsMultipartFile; | |||
| import javax.annotation.Resource; | |||
| import java.io.*; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| @Service | |||
| public class RecommendServiceImpl implements RecommendService { | |||
| /*************************************************************************************/ | |||
| //权限验证 | |||
| @Resource | |||
| private ShiroRealm shiroRealm; | |||
| //用户信息 | |||
| @Resource | |||
| private IHanHaiMemberService hanHaiMemberService; | |||
| //配置信息 | |||
| @Resource | |||
| private ITeambuyConfigService teambuyConfigService; | |||
| private String appid = "wx94a640f07969d6c9";//小程序appid | |||
| private String secret = "";//小程序密钥 | |||
| @Value("${jeecg.oss.endpoint}") | |||
| private String endpoint; | |||
| @Value("${jeecg.oss.accessKey}") | |||
| private String accessKey; | |||
| @Value("${jeecg.oss.secretKey}") | |||
| private String secretKey; | |||
| @Value("${jeecg.oss.bucketName}") | |||
| private String bucketName; | |||
| @Value("${jeecg.oss.staticDomain}") | |||
| private String staticDomain; | |||
| /*************************************************************************************/ | |||
| //获取个人推荐二维码 | |||
| @Override | |||
| public Result<?> getInviteCode(String token) { | |||
| //权限验证 | |||
| HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); | |||
| //获取版本信息 | |||
| TeambuyConfig vsion = teambuyConfigService.lambdaQuery() | |||
| .eq(TeambuyConfig::getParamCode, "v_sion") | |||
| .one(); | |||
| Integer vsionStr = Integer.parseInt(vsion.getParamValueText()); | |||
| String trial = "release"; | |||
| if(vsionStr == 0){ | |||
| trial= "release"; | |||
| }else if(vsionStr == 1){ | |||
| trial= "trial"; | |||
| }else{ | |||
| trial= "develop"; | |||
| } | |||
| Map<String, Object> param = new HashMap<>(); | |||
| //获取跳转路径信息 | |||
| TeambuyConfig xcxSharePage = teambuyConfigService.lambdaQuery() | |||
| .eq(TeambuyConfig::getParamCode, "xcxSharePage") | |||
| .one(); | |||
| String key = "shareId=" + hanHaiMember.getId(); | |||
| param.put("path", xcxSharePage.getParamValueText() + "?" + key); //跳转页面 | |||
| String accessToken = this.getAccessToken(); | |||
| RestTemplate rest = new RestTemplate(); | |||
| InputStream inputStream = null; | |||
| OutputStream outputStream = null; | |||
| File file = null; | |||
| //获取存储地址 | |||
| TeambuyConfig oneImage = teambuyConfigService.lambdaQuery() | |||
| .eq(TeambuyConfig::getParamCode, "codeImg") | |||
| .one(); | |||
| String codeImg = oneImage.getParamValueText(); | |||
| try{ | |||
| String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken; | |||
| param.put("scene", hanHaiMember.getId()); | |||
| param.put("width", 150); | |||
| param.put("auto_color", false); | |||
| param.put("env_version", trial); | |||
| Map<String, Object> line_color = new HashMap<>(); | |||
| line_color.put("r", 0); | |||
| line_color.put("g", 0); | |||
| line_color.put("b", 0); | |||
| param.put("line_color", line_color); | |||
| MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); | |||
| org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity(JSON.toJSONString(param), headers); | |||
| ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); | |||
| byte[] result = entity.getBody(); | |||
| inputStream = new ByteArrayInputStream(result); | |||
| String tempSave = codeImg; | |||
| String filePath = tempSave; | |||
| file = new File(filePath); | |||
| if (!file.exists()) { | |||
| file.createNewFile(); | |||
| } | |||
| outputStream = new FileOutputStream(file); | |||
| int len = 0; | |||
| byte[] buf = new byte[1024]; | |||
| while ((len = inputStream.read(buf, 0, 1024)) != -1) { | |||
| outputStream.write(buf, 0, len); | |||
| } | |||
| outputStream.flush(); | |||
| //将文件上传至阿里云 | |||
| DiskFileItemFactory factory = new DiskFileItemFactory(16, null); | |||
| FileItem item = factory.createItem("File", "text/plain", true, file.getName()); | |||
| int bytesRead = 0; | |||
| byte[] buffer = new byte[8192]; | |||
| try { | |||
| FileInputStream fis = new FileInputStream(file); | |||
| OutputStream os = item.getOutputStream(); | |||
| while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { | |||
| os.write(buffer, 0, bytesRead); | |||
| } | |||
| os.close(); | |||
| fis.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| MultipartFile mf = new CommonsMultipartFile(item); | |||
| //返回图片下载地址 | |||
| WxQrCodeVo wxCodeVo = new WxQrCodeVo(); | |||
| wxCodeVo.setUrl(staticDomain+this.uploadAliYunOss(mf)); | |||
| wxCodeVo.setName("敢为人鲜欢迎您"); | |||
| return Result.OK(wxCodeVo); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } finally { | |||
| if (inputStream != null) { | |||
| try { | |||
| inputStream.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| if (outputStream != null) { | |||
| try { | |||
| outputStream.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| //删除文件 | |||
| if (file.exists()) { | |||
| file.delete(); | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| //我的团队-查询直推用户列表 | |||
| @Override | |||
| public Result<?> queryRecommendUserList(String token, PageBean pageBean) { | |||
| //权限验证 | |||
| HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token); | |||
| //返回信息 | |||
| String massege = ""; | |||
| //分页信息 | |||
| Page<HanHaiMember> page = null; | |||
| //查询信息 | |||
| LambdaQueryChainWrapper<HanHaiMember> query = null; | |||
| //返回信息 | |||
| Page<HanHaiMember> pageList = null; | |||
| try{ | |||
| //分页 | |||
| page = new Page<HanHaiMember>(pageBean.getPageNo(), pageBean.getPageSize()); | |||
| query = hanHaiMemberService | |||
| .lambdaQuery(); | |||
| //组装查询条件 | |||
| query.eq(HanHaiMember::getVid, hanHaiMember.getId()); | |||
| //按照创建时间降序排列 | |||
| query.orderByAsc(HanHaiMember::getCreateTime); | |||
| //获取直推用户信息 | |||
| pageList = query.page(page); | |||
| return Result.OK("直推用户列表", pageList); | |||
| }catch (Exception e){ | |||
| e.printStackTrace(); | |||
| return Result.error("直推用户列表查询失败"); | |||
| } | |||
| } | |||
| /** | |||
| * 获取令牌 | |||
| * | |||
| * @return | |||
| */ | |||
| private String getAccessToken() { | |||
| String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; | |||
| String doGet2 = HttpClientUtil.doGet2(requestUrl); | |||
| Map<String, String> map = JSON.parseObject(doGet2, new TypeReference<Map<String, String>>() { | |||
| }); | |||
| return map.get("access_token"); | |||
| } | |||
| /** | |||
| * 上传文件至阿里云oss | |||
| * | |||
| * @return | |||
| */ | |||
| private String uploadAliYunOss(MultipartFile mf) throws Exception { | |||
| String uploadFile = "massage"; | |||
| String fileName = new StringBuffer(mf.getOriginalFilename()).append(".jpg").toString();// 获取文件名 | |||
| String dbpath = uploadFile + File.separator + fileName; | |||
| if (dbpath.contains("\\")) { | |||
| dbpath = dbpath.replace("\\", "/"); | |||
| } | |||
| String endpoint = this.endpoint; | |||
| String accessKey = this.accessKey; | |||
| String secretKey = this.secretKey; | |||
| // 创建OSSClient实例。 | |||
| OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey); | |||
| // 上传Byte数组。 | |||
| byte[] content = mf.getBytes(); | |||
| String bucketName = this.bucketName; | |||
| ossClient.putObject(bucketName, dbpath, new ByteArrayInputStream(content)); | |||
| // 关闭OSSClient。 | |||
| ossClient.shutdown(); | |||
| return dbpath; | |||
| } | |||
| } | |||