# 会员系统的Java端API接口服务器

---
使用Spring Boot + Spring-data-jpa 构建
接口文档使用swagger-ui管理， 文档url /doc.html

mvn启动命令`mvn -f ./member-web/pom.xml spring-boot:run `

### 2019-11-5 更新

在使用新添加的sql查询导出excel的接口时，因为不知道为什么使用react框架的request来请求时，post不行，使用了blob也不行，就改成了get的方式，参数从sessionStorge里去取，然后编码提交，如下：

```$javascript
{
	title:"测试表格",
	url:{
		read:"/japi/birdgird/readSql?dsId=4028b2a26daf6c2d016db34bc5ca00a5&sqlId=40288ad66df10dc9016df1101fe40001",
		add:"/japi/birdgird/add?dsId=4028b2a26daf6c2d016db34bc5ca00a5&tableName=contract",
		edit:"/japi/birdgird/edit?dsId=4028b2a26daf6c2d016db34bc5ca00a5&tableName=contract&pkColumn=id",
		delete:"/japi/birdgird/delete?dsId=4028b2a26daf6c2d016db34bc5ca00a5&tableName=contract&pkColumn=id"
	},
	checkable:true,
	actions:[{
		name:"导出excel", onClick: function() {
			let dtoStr = sessionStorage.getItem('queryDto');
			dtoStr = encodeURI(dtoStr);
			window.location = "http://localhost:8090/sqlExport/export?dsId=4028b2a26daf6c2d016db34bc5ca00a5&sqlId=40288a9d6e357e33016e3598b42a0000&requestStr="+dtoStr;
		}
	}],
	columns:[
		{title:"主编号", data:"t.id", type:"text",hide:true},
		{title:"名称",data:"t.name", type:"text",editor: {}, query: true},
		{title:"个人电话",data:"t.personal_phone", type:"text",editor: {}, query: true},
		{title:"个人手机",data:"t.personal_cellphone", type:"text",editor: {}, query: true},
		{title:"组名称",data:"t2.name",type:"text"},
		{title:"操作",type:"command",actions:[{
			name: '行内按钮',
            onClick: (data) => {
              console.log(data);
            }
		}]}
	],
}
```

### 2019-11-15 更新

启动时需要添加proxy代理信息：

`java -Dhttps.proxyHost=192.168.50.32 -Dhttps.proxyPort=1808 -Dhttp.proxyHost=192.168.50.32 -Dhttp.proxyPort=1808 -jar xxxx.jar`

### 2019-12-06 更新

启动时需要添加机器编号和数据中心编号，为了使部分对象生成分布式ID

```$bash
export workerid=0
export datacenterid=0 
java -Dhttps.proxyHost=192.168.50.32 -Dhttps.proxyPort=1808 -Dhttp.proxyHost=192.168.50.32 -Dhttp.proxyPort=1808 -jar xxxx.jar
```

### 2019-12-17 develop 更新

添加了动态请求查询参数，格式如下：

* 基本分页：
    `GET {url}?page=1&size=10`
* 基本分页排序：
    `GET {url}?page=1&size=10&sortField=crtDate&sortDirection=DESC` 
    `sortField` 是需要排序的字段 `sortDirection` 是升降序
* 基本带参数查询：
    `GET {url}?name=yourname&age=20&...` 
    非关键字（上面两条中的）的参数，直接视为等于的操作。
* 不同类型的参数查询：
    `GET {url}?age=20&ageOperate=LessEqual&...`
    使用 `字段名+Operate` 的参数来表示判断类型：


| 操作类型 | 说明 |
| :---: | :---: |
| Equal | 等于（默认）|
| NotEqual| 不等于 |
| Less | （数字类型）小于 |
| LessEqual | （数字类型）不大于 |
| Greater | （数字类型）大于 |
| GreaterEqual | （数字类型）不小于 |
| Contains | （字符串）包含 |
| StartWith | （字符串）以开头 |
| EndWith | （字符串）以结尾 |


* 代码中使用：
    已经在拦截器中添加了GET请求解析参数的功能，解析完参数后放到ThreadLocal中，若需要取param参数值，
    可以直接去`com.liangjian.dataplatform.member.entity.token.DynamicParamGetter`取：
    
Service层:

```java
//...
@Service
public class YourService extends DynamicQueryService<YourEntity> implements  IYourService {
    @Autowired
    private YourRepository yourRepository;
    
    @Overrive
    public JpaSpecificationExecutor<YourEntity> getJpaRepository() {
        return yourRepository;
    }
    
    //父类已经包含了动态查询返回Page和返回List的方法
}
```

Controller层：
```java
@Controller
public class YourController {
    //...
    
    @Autowired
    private IYourService iYourService;
    
    //例子：
    @GetMapping("/page")
    public Page<YourEntity> page() {
        var params = DynamicParamGetter.DynamicParams.get();
        return iYourService.queryPageByCondition(params);
    }
    
    @GetMapping("/page")
    public List<YourEntity> list() {
        var params = DynamicParamGetter.DynamicParams.get();
        return iYourService.queryListByCondition(params);
    }
}
```